@pan-sec/notebooklm-mcp 1.4.0 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -7
- package/SECURITY.md +40 -6
- package/dist/auth/mcp-auth.d.ts.map +1 -1
- package/dist/auth/mcp-auth.js +3 -6
- package/dist/auth/mcp-auth.js.map +1 -1
- package/dist/compliance/alert-manager.d.ts +120 -0
- package/dist/compliance/alert-manager.d.ts.map +1 -0
- package/dist/compliance/alert-manager.js +420 -0
- package/dist/compliance/alert-manager.js.map +1 -0
- package/dist/compliance/breach-detection.d.ts +134 -0
- package/dist/compliance/breach-detection.d.ts.map +1 -0
- package/dist/compliance/breach-detection.js +456 -0
- package/dist/compliance/breach-detection.js.map +1 -0
- package/dist/compliance/change-log.d.ts +113 -0
- package/dist/compliance/change-log.d.ts.map +1 -0
- package/dist/compliance/change-log.js +275 -0
- package/dist/compliance/change-log.js.map +1 -0
- package/dist/compliance/compliance-logger.d.ts +136 -0
- package/dist/compliance/compliance-logger.d.ts.map +1 -0
- package/dist/compliance/compliance-logger.js +425 -0
- package/dist/compliance/compliance-logger.js.map +1 -0
- package/dist/compliance/compliance-tools.d.ts +18 -0
- package/dist/compliance/compliance-tools.d.ts.map +1 -0
- package/dist/compliance/compliance-tools.js +673 -0
- package/dist/compliance/compliance-tools.js.map +1 -0
- package/dist/compliance/consent-manager.d.ts +130 -0
- package/dist/compliance/consent-manager.d.ts.map +1 -0
- package/dist/compliance/consent-manager.js +386 -0
- package/dist/compliance/consent-manager.js.map +1 -0
- package/dist/compliance/dashboard.d.ts +243 -0
- package/dist/compliance/dashboard.d.ts.map +1 -0
- package/dist/compliance/dashboard.js +519 -0
- package/dist/compliance/dashboard.js.map +1 -0
- package/dist/compliance/data-classification.d.ts +117 -0
- package/dist/compliance/data-classification.d.ts.map +1 -0
- package/dist/compliance/data-classification.js +469 -0
- package/dist/compliance/data-classification.js.map +1 -0
- package/dist/compliance/data-erasure.d.ts +110 -0
- package/dist/compliance/data-erasure.d.ts.map +1 -0
- package/dist/compliance/data-erasure.js +501 -0
- package/dist/compliance/data-erasure.js.map +1 -0
- package/dist/compliance/data-export.d.ts +85 -0
- package/dist/compliance/data-export.d.ts.map +1 -0
- package/dist/compliance/data-export.js +394 -0
- package/dist/compliance/data-export.js.map +1 -0
- package/dist/compliance/data-inventory.d.ts +136 -0
- package/dist/compliance/data-inventory.d.ts.map +1 -0
- package/dist/compliance/data-inventory.js +335 -0
- package/dist/compliance/data-inventory.js.map +1 -0
- package/dist/compliance/dsar-handler.d.ts +123 -0
- package/dist/compliance/dsar-handler.d.ts.map +1 -0
- package/dist/compliance/dsar-handler.js +371 -0
- package/dist/compliance/dsar-handler.js.map +1 -0
- package/dist/compliance/evidence-collector.d.ts +187 -0
- package/dist/compliance/evidence-collector.d.ts.map +1 -0
- package/dist/compliance/evidence-collector.js +656 -0
- package/dist/compliance/evidence-collector.js.map +1 -0
- package/dist/compliance/health-monitor.d.ts +111 -0
- package/dist/compliance/health-monitor.d.ts.map +1 -0
- package/dist/compliance/health-monitor.js +509 -0
- package/dist/compliance/health-monitor.js.map +1 -0
- package/dist/compliance/incident-manager.d.ts +131 -0
- package/dist/compliance/incident-manager.d.ts.map +1 -0
- package/dist/compliance/incident-manager.js +418 -0
- package/dist/compliance/incident-manager.js.map +1 -0
- package/dist/compliance/index.d.ts +32 -0
- package/dist/compliance/index.d.ts.map +1 -0
- package/dist/compliance/index.js +35 -0
- package/dist/compliance/index.js.map +1 -0
- package/dist/compliance/policy-docs.d.ts +108 -0
- package/dist/compliance/policy-docs.d.ts.map +1 -0
- package/dist/compliance/policy-docs.js +464 -0
- package/dist/compliance/policy-docs.js.map +1 -0
- package/dist/compliance/privacy-notice-text.d.ts +58 -0
- package/dist/compliance/privacy-notice-text.d.ts.map +1 -0
- package/dist/compliance/privacy-notice-text.js +161 -0
- package/dist/compliance/privacy-notice-text.js.map +1 -0
- package/dist/compliance/privacy-notice.d.ts +128 -0
- package/dist/compliance/privacy-notice.d.ts.map +1 -0
- package/dist/compliance/privacy-notice.js +250 -0
- package/dist/compliance/privacy-notice.js.map +1 -0
- package/dist/compliance/report-generator.d.ts +168 -0
- package/dist/compliance/report-generator.d.ts.map +1 -0
- package/dist/compliance/report-generator.js +830 -0
- package/dist/compliance/report-generator.js.map +1 -0
- package/dist/compliance/retention-engine.d.ts +130 -0
- package/dist/compliance/retention-engine.d.ts.map +1 -0
- package/dist/compliance/retention-engine.js +510 -0
- package/dist/compliance/retention-engine.js.map +1 -0
- package/dist/compliance/siem-exporter.d.ts +150 -0
- package/dist/compliance/siem-exporter.d.ts.map +1 -0
- package/dist/compliance/siem-exporter.js +509 -0
- package/dist/compliance/siem-exporter.js.map +1 -0
- package/dist/compliance/types.d.ts +601 -0
- package/dist/compliance/types.d.ts.map +1 -0
- package/dist/compliance/types.js +22 -0
- package/dist/compliance/types.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +8 -1
- package/dist/config.js.map +1 -1
- package/dist/events/event-emitter.d.ts +45 -0
- package/dist/events/event-emitter.d.ts.map +1 -0
- package/dist/events/event-emitter.js +100 -0
- package/dist/events/event-emitter.js.map +1 -0
- package/dist/events/event-types.d.ts +124 -0
- package/dist/events/event-types.d.ts.map +1 -0
- package/dist/events/event-types.js +18 -0
- package/dist/events/event-types.js.map +1 -0
- package/dist/index.js +59 -2
- package/dist/index.js.map +1 -1
- package/dist/library/notebook-library.d.ts +25 -2
- package/dist/library/notebook-library.d.ts.map +1 -1
- package/dist/library/notebook-library.js +144 -3
- package/dist/library/notebook-library.js.map +1 -1
- package/dist/library/types.d.ts +15 -0
- package/dist/library/types.d.ts.map +1 -1
- package/dist/notebook-creation/audio-manager.d.ts +56 -0
- package/dist/notebook-creation/audio-manager.d.ts.map +1 -0
- package/dist/notebook-creation/audio-manager.js +335 -0
- package/dist/notebook-creation/audio-manager.js.map +1 -0
- package/dist/notebook-creation/discover-creation-flow.d.ts +8 -0
- package/dist/notebook-creation/discover-creation-flow.d.ts.map +1 -0
- package/dist/notebook-creation/discover-creation-flow.js +177 -0
- package/dist/notebook-creation/discover-creation-flow.js.map +1 -0
- package/dist/notebook-creation/discover-quota.d.ts +8 -0
- package/dist/notebook-creation/discover-quota.d.ts.map +1 -0
- package/dist/notebook-creation/discover-quota.js +195 -0
- package/dist/notebook-creation/discover-quota.js.map +1 -0
- package/dist/notebook-creation/discover-source-dialog.d.ts +8 -0
- package/dist/notebook-creation/discover-source-dialog.d.ts.map +1 -0
- package/dist/notebook-creation/discover-source-dialog.js +134 -0
- package/dist/notebook-creation/discover-source-dialog.js.map +1 -0
- package/dist/notebook-creation/discover-sources.d.ts +8 -0
- package/dist/notebook-creation/discover-sources.d.ts.map +1 -0
- package/dist/notebook-creation/discover-sources.js +273 -0
- package/dist/notebook-creation/discover-sources.js.map +1 -0
- package/dist/notebook-creation/discover-text-input.d.ts +7 -0
- package/dist/notebook-creation/discover-text-input.d.ts.map +1 -0
- package/dist/notebook-creation/discover-text-input.js +135 -0
- package/dist/notebook-creation/discover-text-input.js.map +1 -0
- package/dist/notebook-creation/index.d.ts +12 -0
- package/dist/notebook-creation/index.d.ts.map +1 -0
- package/dist/notebook-creation/index.js +12 -0
- package/dist/notebook-creation/index.js.map +1 -0
- package/dist/notebook-creation/notebook-creator.d.ts +95 -0
- package/dist/notebook-creation/notebook-creator.d.ts.map +1 -0
- package/dist/notebook-creation/notebook-creator.js +689 -0
- package/dist/notebook-creation/notebook-creator.js.map +1 -0
- package/dist/notebook-creation/notebook-sync.d.ts +93 -0
- package/dist/notebook-creation/notebook-sync.d.ts.map +1 -0
- package/dist/notebook-creation/notebook-sync.js +370 -0
- package/dist/notebook-creation/notebook-sync.js.map +1 -0
- package/dist/notebook-creation/run-discovery.d.ts +11 -0
- package/dist/notebook-creation/run-discovery.d.ts.map +1 -0
- package/dist/notebook-creation/run-discovery.js +151 -0
- package/dist/notebook-creation/run-discovery.js.map +1 -0
- package/dist/notebook-creation/selector-discovery.d.ts +65 -0
- package/dist/notebook-creation/selector-discovery.d.ts.map +1 -0
- package/dist/notebook-creation/selector-discovery.js +421 -0
- package/dist/notebook-creation/selector-discovery.js.map +1 -0
- package/dist/notebook-creation/selectors.d.ts +150 -0
- package/dist/notebook-creation/selectors.d.ts.map +1 -0
- package/dist/notebook-creation/selectors.js +225 -0
- package/dist/notebook-creation/selectors.js.map +1 -0
- package/dist/notebook-creation/source-manager.d.ts +73 -0
- package/dist/notebook-creation/source-manager.d.ts.map +1 -0
- package/dist/notebook-creation/source-manager.js +486 -0
- package/dist/notebook-creation/source-manager.js.map +1 -0
- package/dist/notebook-creation/test-create.d.ts +8 -0
- package/dist/notebook-creation/test-create.d.ts.map +1 -0
- package/dist/notebook-creation/test-create.js +72 -0
- package/dist/notebook-creation/test-create.js.map +1 -0
- package/dist/notebook-creation/types.d.ts +173 -0
- package/dist/notebook-creation/types.d.ts.map +1 -0
- package/dist/notebook-creation/types.js +5 -0
- package/dist/notebook-creation/types.js.map +1 -0
- package/dist/quota/index.d.ts +8 -0
- package/dist/quota/index.d.ts.map +1 -0
- package/dist/quota/index.js +8 -0
- package/dist/quota/index.js.map +1 -0
- package/dist/quota/quota-manager.d.ts +125 -0
- package/dist/quota/quota-manager.d.ts.map +1 -0
- package/dist/quota/quota-manager.js +330 -0
- package/dist/quota/quota-manager.js.map +1 -0
- package/dist/session/session-manager.d.ts +5 -0
- package/dist/session/session-manager.d.ts.map +1 -1
- package/dist/session/session-manager.js +6 -0
- package/dist/session/session-manager.js.map +1 -1
- package/dist/session/shared-context-manager.d.ts.map +1 -1
- package/dist/session/shared-context-manager.js +2 -1
- package/dist/session/shared-context-manager.js.map +1 -1
- package/dist/tools/definitions/notebook-management.d.ts.map +1 -1
- package/dist/tools/definitions/notebook-management.js +525 -0
- package/dist/tools/definitions/notebook-management.js.map +1 -1
- package/dist/tools/definitions/system.d.ts.map +1 -1
- package/dist/tools/definitions/system.js +158 -0
- package/dist/tools/definitions/system.js.map +1 -1
- package/dist/tools/handlers.d.ts +225 -0
- package/dist/tools/handlers.d.ts.map +1 -1
- package/dist/tools/handlers.js +911 -0
- package/dist/tools/handlers.js.map +1 -1
- package/dist/utils/audit-logger.d.ts +21 -1
- package/dist/utils/audit-logger.d.ts.map +1 -1
- package/dist/utils/audit-logger.js +53 -4
- package/dist/utils/audit-logger.js.map +1 -1
- package/dist/utils/crypto.d.ts.map +1 -1
- package/dist/utils/crypto.js +8 -15
- package/dist/utils/crypto.js.map +1 -1
- package/dist/utils/file-permissions.d.ts +85 -0
- package/dist/utils/file-permissions.d.ts.map +1 -0
- package/dist/utils/file-permissions.js +180 -0
- package/dist/utils/file-permissions.js.map +1 -0
- package/dist/utils/settings-manager.d.ts.map +1 -1
- package/dist/utils/settings-manager.js +6 -11
- package/dist/utils/settings-manager.js.map +1 -1
- package/dist/webhooks/index.d.ts +8 -0
- package/dist/webhooks/index.d.ts.map +1 -0
- package/dist/webhooks/index.js +8 -0
- package/dist/webhooks/index.js.map +1 -0
- package/dist/webhooks/types.d.ts +57 -0
- package/dist/webhooks/types.d.ts.map +1 -0
- package/dist/webhooks/types.js +5 -0
- package/dist/webhooks/types.js.map +1 -0
- package/dist/webhooks/webhook-dispatcher.d.ts +120 -0
- package/dist/webhooks/webhook-dispatcher.d.ts.map +1 -0
- package/dist/webhooks/webhook-dispatcher.js +519 -0
- package/dist/webhooks/webhook-dispatcher.js.map +1 -0
- package/docs/COMPLIANCE-SPEC.md +1452 -0
- package/package.json +30 -4
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Breach Detection
|
|
3
|
+
*
|
|
4
|
+
* Detects potential security breaches and policy violations.
|
|
5
|
+
* Implements detection rules with configurable thresholds and actions.
|
|
6
|
+
*
|
|
7
|
+
* Added by Pantheon Security for enterprise compliance support.
|
|
8
|
+
*/
|
|
9
|
+
import crypto from "crypto";
|
|
10
|
+
import path from "path";
|
|
11
|
+
import fs from "fs";
|
|
12
|
+
import { getConfig } from "../config.js";
|
|
13
|
+
import { mkdirSecure, writeFileSecure } from "../utils/file-permissions.js";
|
|
14
|
+
import { getComplianceLogger } from "./compliance-logger.js";
|
|
15
|
+
import { getAlertManager } from "./alert-manager.js";
|
|
16
|
+
/**
|
|
17
|
+
* Generate a UUID v4
|
|
18
|
+
*/
|
|
19
|
+
function generateUUID() {
|
|
20
|
+
return crypto.randomUUID();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Default breach detection rules
|
|
24
|
+
*/
|
|
25
|
+
const DEFAULT_RULES = [
|
|
26
|
+
{
|
|
27
|
+
id: "rule_brute_force",
|
|
28
|
+
name: "Brute Force Attack",
|
|
29
|
+
description: "Multiple failed authentication attempts in short time window",
|
|
30
|
+
severity: "high",
|
|
31
|
+
event_pattern: "auth_failed",
|
|
32
|
+
threshold: 10,
|
|
33
|
+
window_seconds: 300,
|
|
34
|
+
actions: ["log", "block", "alert", "create_incident"],
|
|
35
|
+
notification_required: true,
|
|
36
|
+
notification_deadline_hours: 72,
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
id: "rule_secrets_leaked",
|
|
40
|
+
name: "Secrets Leaked in Output",
|
|
41
|
+
description: "Detected credentials or secrets in tool output",
|
|
42
|
+
severity: "critical",
|
|
43
|
+
event_pattern: "secrets_detected",
|
|
44
|
+
threshold: 1,
|
|
45
|
+
window_seconds: 1,
|
|
46
|
+
actions: ["log", "alert", "create_incident"],
|
|
47
|
+
notification_required: true,
|
|
48
|
+
notification_deadline_hours: 24,
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
id: "rule_cert_violation",
|
|
52
|
+
name: "Certificate Pinning Violation",
|
|
53
|
+
description: "TLS certificate does not match pinned certificates",
|
|
54
|
+
severity: "critical",
|
|
55
|
+
event_pattern: "cert_pinning_violation",
|
|
56
|
+
threshold: 1,
|
|
57
|
+
window_seconds: 1,
|
|
58
|
+
actions: ["log", "block", "alert", "create_incident"],
|
|
59
|
+
notification_required: true,
|
|
60
|
+
notification_deadline_hours: 24,
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
id: "rule_prompt_injection",
|
|
64
|
+
name: "Prompt Injection Attempt",
|
|
65
|
+
description: "Detected prompt injection patterns in response",
|
|
66
|
+
severity: "high",
|
|
67
|
+
event_pattern: "prompt_injection",
|
|
68
|
+
threshold: 1,
|
|
69
|
+
window_seconds: 1,
|
|
70
|
+
actions: ["log", "alert"],
|
|
71
|
+
notification_required: false,
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
id: "rule_unusual_access",
|
|
75
|
+
name: "Unusual Access Pattern",
|
|
76
|
+
description: "Access patterns outside normal behavior",
|
|
77
|
+
severity: "medium",
|
|
78
|
+
event_pattern: "unusual_access",
|
|
79
|
+
threshold: 5,
|
|
80
|
+
window_seconds: 3600,
|
|
81
|
+
actions: ["log", "alert"],
|
|
82
|
+
notification_required: false,
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
id: "rule_mass_export",
|
|
86
|
+
name: "Mass Data Export",
|
|
87
|
+
description: "Large data export request",
|
|
88
|
+
severity: "medium",
|
|
89
|
+
event_pattern: "data_export",
|
|
90
|
+
threshold: 3,
|
|
91
|
+
window_seconds: 3600,
|
|
92
|
+
actions: ["log", "notify_admin"],
|
|
93
|
+
notification_required: false,
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
id: "rule_encryption_failure",
|
|
97
|
+
name: "Encryption Failure",
|
|
98
|
+
description: "Encryption or decryption operation failed",
|
|
99
|
+
severity: "high",
|
|
100
|
+
event_pattern: "encryption_error",
|
|
101
|
+
threshold: 3,
|
|
102
|
+
window_seconds: 300,
|
|
103
|
+
actions: ["log", "alert"],
|
|
104
|
+
notification_required: false,
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
id: "rule_auth_lockout",
|
|
108
|
+
name: "Authentication Lockout",
|
|
109
|
+
description: "Account locked due to failed attempts",
|
|
110
|
+
severity: "medium",
|
|
111
|
+
event_pattern: "auth_lockout",
|
|
112
|
+
threshold: 1,
|
|
113
|
+
window_seconds: 1,
|
|
114
|
+
actions: ["log", "alert"],
|
|
115
|
+
notification_required: false,
|
|
116
|
+
},
|
|
117
|
+
];
|
|
118
|
+
/**
|
|
119
|
+
* Breach Detector class
|
|
120
|
+
*/
|
|
121
|
+
export class BreachDetector {
|
|
122
|
+
static instance;
|
|
123
|
+
rulesFile;
|
|
124
|
+
rules = new Map();
|
|
125
|
+
eventTrackers = new Map();
|
|
126
|
+
detections = [];
|
|
127
|
+
loaded = false;
|
|
128
|
+
enabled;
|
|
129
|
+
blockedPatterns = new Set();
|
|
130
|
+
constructor() {
|
|
131
|
+
const config = getConfig();
|
|
132
|
+
this.rulesFile = path.join(config.configDir, "breach-rules.json");
|
|
133
|
+
this.enabled = process.env.NLMCP_BREACH_DETECTION !== "false";
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get singleton instance
|
|
137
|
+
*/
|
|
138
|
+
static getInstance() {
|
|
139
|
+
if (!BreachDetector.instance) {
|
|
140
|
+
BreachDetector.instance = new BreachDetector();
|
|
141
|
+
}
|
|
142
|
+
return BreachDetector.instance;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Load rules from storage
|
|
146
|
+
*/
|
|
147
|
+
async load() {
|
|
148
|
+
if (this.loaded)
|
|
149
|
+
return;
|
|
150
|
+
// Load default rules
|
|
151
|
+
for (const rule of DEFAULT_RULES) {
|
|
152
|
+
this.rules.set(rule.id, rule);
|
|
153
|
+
}
|
|
154
|
+
// Load custom rules
|
|
155
|
+
try {
|
|
156
|
+
if (fs.existsSync(this.rulesFile)) {
|
|
157
|
+
const content = fs.readFileSync(this.rulesFile, "utf-8");
|
|
158
|
+
const data = JSON.parse(content);
|
|
159
|
+
if (data.rules && Array.isArray(data.rules)) {
|
|
160
|
+
for (const rule of data.rules) {
|
|
161
|
+
this.rules.set(rule.id, rule);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
// Use defaults if file is corrupted
|
|
168
|
+
}
|
|
169
|
+
this.loaded = true;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Save custom rules to storage
|
|
173
|
+
*/
|
|
174
|
+
async save() {
|
|
175
|
+
const dir = path.dirname(this.rulesFile);
|
|
176
|
+
mkdirSecure(dir);
|
|
177
|
+
// Only save custom rules
|
|
178
|
+
const customRules = Array.from(this.rules.values()).filter(r => !DEFAULT_RULES.find(dr => dr.id === r.id));
|
|
179
|
+
const data = {
|
|
180
|
+
version: "1.0.0",
|
|
181
|
+
last_updated: new Date().toISOString(),
|
|
182
|
+
rules: customRules,
|
|
183
|
+
};
|
|
184
|
+
writeFileSecure(this.rulesFile, JSON.stringify(data, null, 2));
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Check an event against all rules
|
|
188
|
+
*/
|
|
189
|
+
async checkEvent(eventPattern, details) {
|
|
190
|
+
if (!this.enabled) {
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
await this.load();
|
|
194
|
+
const now = Date.now();
|
|
195
|
+
// Find matching rules
|
|
196
|
+
for (const rule of this.rules.values()) {
|
|
197
|
+
if (!this.matchesPattern(eventPattern, rule.event_pattern)) {
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
// Get or create event tracker
|
|
201
|
+
let tracker = this.eventTrackers.get(rule.id);
|
|
202
|
+
if (!tracker) {
|
|
203
|
+
tracker = { rule_id: rule.id, events: [] };
|
|
204
|
+
this.eventTrackers.set(rule.id, tracker);
|
|
205
|
+
}
|
|
206
|
+
// Add this event
|
|
207
|
+
tracker.events.push({ timestamp: now, details });
|
|
208
|
+
// Clean up old events outside window
|
|
209
|
+
const windowStart = now - (rule.window_seconds || 1) * 1000;
|
|
210
|
+
tracker.events = tracker.events.filter(e => e.timestamp >= windowStart);
|
|
211
|
+
// Check threshold
|
|
212
|
+
if (tracker.events.length >= (rule.threshold || 1)) {
|
|
213
|
+
// Breach detected!
|
|
214
|
+
const detection = await this.handleBreach(rule, tracker.events, details);
|
|
215
|
+
// Reset tracker after breach
|
|
216
|
+
tracker.events = [];
|
|
217
|
+
return detection;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Check if event pattern matches rule pattern
|
|
224
|
+
*/
|
|
225
|
+
matchesPattern(event, pattern) {
|
|
226
|
+
// Exact match
|
|
227
|
+
if (event === pattern) {
|
|
228
|
+
return true;
|
|
229
|
+
}
|
|
230
|
+
// Regex pattern
|
|
231
|
+
try {
|
|
232
|
+
const regex = new RegExp(pattern);
|
|
233
|
+
return regex.test(event);
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Handle a detected breach
|
|
241
|
+
*/
|
|
242
|
+
async handleBreach(rule, events, details) {
|
|
243
|
+
const detection = {
|
|
244
|
+
id: generateUUID(),
|
|
245
|
+
detected_at: new Date().toISOString(),
|
|
246
|
+
rule,
|
|
247
|
+
event_count: events.length,
|
|
248
|
+
window_start: new Date(events[0].timestamp).toISOString(),
|
|
249
|
+
window_end: new Date(events[events.length - 1].timestamp).toISOString(),
|
|
250
|
+
actions_taken: [],
|
|
251
|
+
blocked: false,
|
|
252
|
+
};
|
|
253
|
+
// Execute actions
|
|
254
|
+
for (const action of rule.actions) {
|
|
255
|
+
try {
|
|
256
|
+
switch (action) {
|
|
257
|
+
case "log":
|
|
258
|
+
await this.actionLog(detection, details);
|
|
259
|
+
break;
|
|
260
|
+
case "alert":
|
|
261
|
+
await this.actionAlert(detection, details);
|
|
262
|
+
break;
|
|
263
|
+
case "block":
|
|
264
|
+
await this.actionBlock(detection);
|
|
265
|
+
break;
|
|
266
|
+
case "notify_admin":
|
|
267
|
+
await this.actionNotifyAdmin(detection, details);
|
|
268
|
+
break;
|
|
269
|
+
case "create_incident":
|
|
270
|
+
const incidentId = await this.actionCreateIncident(detection, details);
|
|
271
|
+
detection.incident_id = incidentId;
|
|
272
|
+
break;
|
|
273
|
+
}
|
|
274
|
+
detection.actions_taken.push(action);
|
|
275
|
+
}
|
|
276
|
+
catch {
|
|
277
|
+
// Continue with other actions
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
this.detections.push(detection);
|
|
281
|
+
return detection;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Action: Log the breach
|
|
285
|
+
*/
|
|
286
|
+
async actionLog(detection, details) {
|
|
287
|
+
const logger = getComplianceLogger();
|
|
288
|
+
await logger.logBreach(detection.rule.name, detection.rule.severity, detection.rule.notification_required, {
|
|
289
|
+
detection_id: detection.id,
|
|
290
|
+
rule_id: detection.rule.id,
|
|
291
|
+
event_count: detection.event_count,
|
|
292
|
+
...details,
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Action: Send alert
|
|
297
|
+
*/
|
|
298
|
+
async actionAlert(detection, details) {
|
|
299
|
+
const alertManager = getAlertManager();
|
|
300
|
+
// Map incident severity to alert severity
|
|
301
|
+
const severityMap = {
|
|
302
|
+
low: "info",
|
|
303
|
+
medium: "warning",
|
|
304
|
+
high: "error",
|
|
305
|
+
critical: "critical",
|
|
306
|
+
};
|
|
307
|
+
const alertSeverity = severityMap[detection.rule.severity] || "warning";
|
|
308
|
+
await alertManager.sendAlert(alertSeverity, `Breach Detected: ${detection.rule.name}`, detection.rule.description, "breach-detector", {
|
|
309
|
+
detection_id: detection.id,
|
|
310
|
+
event_count: detection.event_count,
|
|
311
|
+
window: `${detection.window_start} to ${detection.window_end}`,
|
|
312
|
+
...details,
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Action: Block the pattern
|
|
317
|
+
*/
|
|
318
|
+
async actionBlock(detection) {
|
|
319
|
+
this.blockedPatterns.add(detection.rule.event_pattern);
|
|
320
|
+
detection.blocked = true;
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Action: Notify admin
|
|
324
|
+
*/
|
|
325
|
+
async actionNotifyAdmin(detection, details) {
|
|
326
|
+
// Use alert manager with higher severity for admin notification
|
|
327
|
+
const alertManager = getAlertManager();
|
|
328
|
+
await alertManager.sendAlert("warning", `[Admin] ${detection.rule.name}`, `${detection.rule.description}\n\nEvent count: ${detection.event_count}`, "breach-detector", details);
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Action: Create incident
|
|
332
|
+
*/
|
|
333
|
+
async actionCreateIncident(detection, details) {
|
|
334
|
+
// This would integrate with incident-manager.ts
|
|
335
|
+
// For now, return a placeholder ID
|
|
336
|
+
const incidentId = `incident_${detection.id.slice(0, 8)}`;
|
|
337
|
+
// Log for now, incident-manager will handle full tracking
|
|
338
|
+
const logger = getComplianceLogger();
|
|
339
|
+
await logger.logSecurityIncident("breach_incident_created", detection.rule.severity, {
|
|
340
|
+
incident_id: incidentId,
|
|
341
|
+
detection_id: detection.id,
|
|
342
|
+
rule_name: detection.rule.name,
|
|
343
|
+
...details,
|
|
344
|
+
});
|
|
345
|
+
return incidentId;
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Check if a pattern is blocked
|
|
349
|
+
*/
|
|
350
|
+
isBlocked(pattern) {
|
|
351
|
+
return this.blockedPatterns.has(pattern);
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Unblock a pattern
|
|
355
|
+
*/
|
|
356
|
+
unblock(pattern) {
|
|
357
|
+
return this.blockedPatterns.delete(pattern);
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Get all rules
|
|
361
|
+
*/
|
|
362
|
+
async getRules() {
|
|
363
|
+
await this.load();
|
|
364
|
+
return Array.from(this.rules.values());
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Add a custom rule
|
|
368
|
+
*/
|
|
369
|
+
async addRule(rule) {
|
|
370
|
+
await this.load();
|
|
371
|
+
const newRule = {
|
|
372
|
+
...rule,
|
|
373
|
+
id: `rule_${generateUUID().slice(0, 8)}`,
|
|
374
|
+
};
|
|
375
|
+
this.rules.set(newRule.id, newRule);
|
|
376
|
+
await this.save();
|
|
377
|
+
return newRule;
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Remove a rule
|
|
381
|
+
*/
|
|
382
|
+
async removeRule(ruleId) {
|
|
383
|
+
await this.load();
|
|
384
|
+
// Don't allow removing default rules
|
|
385
|
+
if (DEFAULT_RULES.find(r => r.id === ruleId)) {
|
|
386
|
+
return false;
|
|
387
|
+
}
|
|
388
|
+
if (!this.rules.has(ruleId)) {
|
|
389
|
+
return false;
|
|
390
|
+
}
|
|
391
|
+
this.rules.delete(ruleId);
|
|
392
|
+
await this.save();
|
|
393
|
+
return true;
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Get recent detections
|
|
397
|
+
*/
|
|
398
|
+
getRecentDetections(limit = 100) {
|
|
399
|
+
return this.detections.slice(-limit);
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Get detection statistics
|
|
403
|
+
*/
|
|
404
|
+
getStats() {
|
|
405
|
+
const bySeverity = {
|
|
406
|
+
low: 0,
|
|
407
|
+
medium: 0,
|
|
408
|
+
high: 0,
|
|
409
|
+
critical: 0,
|
|
410
|
+
};
|
|
411
|
+
const byRule = {};
|
|
412
|
+
for (const detection of this.detections) {
|
|
413
|
+
bySeverity[detection.rule.severity]++;
|
|
414
|
+
byRule[detection.rule.id] = (byRule[detection.rule.id] || 0) + 1;
|
|
415
|
+
}
|
|
416
|
+
return {
|
|
417
|
+
enabled: this.enabled,
|
|
418
|
+
rules_count: this.rules.size,
|
|
419
|
+
blocked_patterns: this.blockedPatterns.size,
|
|
420
|
+
detections_count: this.detections.length,
|
|
421
|
+
by_severity: bySeverity,
|
|
422
|
+
by_rule: byRule,
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
// ============================================
|
|
427
|
+
// SINGLETON ACCESS
|
|
428
|
+
// ============================================
|
|
429
|
+
/**
|
|
430
|
+
* Get the breach detector instance
|
|
431
|
+
*/
|
|
432
|
+
export function getBreachDetector() {
|
|
433
|
+
return BreachDetector.getInstance();
|
|
434
|
+
}
|
|
435
|
+
// ============================================
|
|
436
|
+
// CONVENIENCE EXPORTS
|
|
437
|
+
// ============================================
|
|
438
|
+
/**
|
|
439
|
+
* Check an event for breach detection
|
|
440
|
+
*/
|
|
441
|
+
export async function checkForBreach(eventPattern, details) {
|
|
442
|
+
return getBreachDetector().checkEvent(eventPattern, details);
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Check if a pattern is blocked
|
|
446
|
+
*/
|
|
447
|
+
export function isPatternBlocked(pattern) {
|
|
448
|
+
return getBreachDetector().isBlocked(pattern);
|
|
449
|
+
}
|
|
450
|
+
/**
|
|
451
|
+
* Get breach detection rules
|
|
452
|
+
*/
|
|
453
|
+
export async function getBreachRules() {
|
|
454
|
+
return getBreachDetector().getRules();
|
|
455
|
+
}
|
|
456
|
+
//# sourceMappingURL=breach-detection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"breach-detection.js","sourceRoot":"","sources":["../../src/compliance/breach-detection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Change Log
|
|
3
|
+
*
|
|
4
|
+
* Tracks all configuration changes for SOC2 compliance.
|
|
5
|
+
* Provides audit trail for system modifications.
|
|
6
|
+
*
|
|
7
|
+
* Added by Pantheon Security for enterprise compliance support.
|
|
8
|
+
*/
|
|
9
|
+
import type { ChangeRecord } from "./types.js";
|
|
10
|
+
/**
|
|
11
|
+
* Change Log class
|
|
12
|
+
*/
|
|
13
|
+
export declare class ChangeLog {
|
|
14
|
+
private static instance;
|
|
15
|
+
private logDir;
|
|
16
|
+
private currentLogFile;
|
|
17
|
+
private constructor();
|
|
18
|
+
/**
|
|
19
|
+
* Get singleton instance
|
|
20
|
+
*/
|
|
21
|
+
static getInstance(): ChangeLog;
|
|
22
|
+
/**
|
|
23
|
+
* Initialize log file for current month
|
|
24
|
+
*/
|
|
25
|
+
private initializeLogFile;
|
|
26
|
+
/**
|
|
27
|
+
* Record a configuration change
|
|
28
|
+
*/
|
|
29
|
+
recordChange(component: string, setting: string, oldValue: unknown, newValue: unknown, options?: {
|
|
30
|
+
changedBy?: "user" | "system" | "admin";
|
|
31
|
+
method?: "cli" | "env" | "api" | "config_file";
|
|
32
|
+
requiresApproval?: boolean;
|
|
33
|
+
approvedBy?: string;
|
|
34
|
+
impact?: "low" | "medium" | "high";
|
|
35
|
+
affectedCompliance?: string[];
|
|
36
|
+
}): Promise<ChangeRecord>;
|
|
37
|
+
/**
|
|
38
|
+
* Sanitize value for logging (remove sensitive data)
|
|
39
|
+
*/
|
|
40
|
+
private sanitizeValue;
|
|
41
|
+
/**
|
|
42
|
+
* Get changes by component
|
|
43
|
+
*/
|
|
44
|
+
getChangesByComponent(component: string, limit?: number): Promise<ChangeRecord[]>;
|
|
45
|
+
/**
|
|
46
|
+
* Get changes by setting
|
|
47
|
+
*/
|
|
48
|
+
getChangesBySetting(setting: string, limit?: number): Promise<ChangeRecord[]>;
|
|
49
|
+
/**
|
|
50
|
+
* Get changes within date range
|
|
51
|
+
*/
|
|
52
|
+
getChangesInRange(from: Date, to: Date, limit?: number): Promise<ChangeRecord[]>;
|
|
53
|
+
/**
|
|
54
|
+
* Get all changes (most recent first)
|
|
55
|
+
*/
|
|
56
|
+
getAllChanges(limit?: number): Promise<ChangeRecord[]>;
|
|
57
|
+
/**
|
|
58
|
+
* Get high-impact changes
|
|
59
|
+
*/
|
|
60
|
+
getHighImpactChanges(limit?: number): Promise<ChangeRecord[]>;
|
|
61
|
+
/**
|
|
62
|
+
* Get changes affecting compliance
|
|
63
|
+
*/
|
|
64
|
+
getComplianceAffectingChanges(regulation?: string, limit?: number): Promise<ChangeRecord[]>;
|
|
65
|
+
/**
|
|
66
|
+
* Get change statistics
|
|
67
|
+
*/
|
|
68
|
+
getStatistics(from?: Date, to?: Date): Promise<{
|
|
69
|
+
total_changes: number;
|
|
70
|
+
by_component: Record<string, number>;
|
|
71
|
+
by_impact: Record<string, number>;
|
|
72
|
+
by_method: Record<string, number>;
|
|
73
|
+
requiring_approval: number;
|
|
74
|
+
compliance_affecting: number;
|
|
75
|
+
}>;
|
|
76
|
+
/**
|
|
77
|
+
* Export changes for audit
|
|
78
|
+
*/
|
|
79
|
+
exportForAudit(from: Date, to: Date): Promise<{
|
|
80
|
+
period: {
|
|
81
|
+
from: string;
|
|
82
|
+
to: string;
|
|
83
|
+
};
|
|
84
|
+
total_changes: number;
|
|
85
|
+
high_impact_changes: number;
|
|
86
|
+
compliance_affecting_changes: number;
|
|
87
|
+
changes: ChangeRecord[];
|
|
88
|
+
}>;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Get the change log instance
|
|
92
|
+
*/
|
|
93
|
+
export declare function getChangeLog(): ChangeLog;
|
|
94
|
+
/**
|
|
95
|
+
* Record a configuration change
|
|
96
|
+
*/
|
|
97
|
+
export declare function recordConfigChange(component: string, setting: string, oldValue: unknown, newValue: unknown, options?: {
|
|
98
|
+
changedBy?: "user" | "system" | "admin";
|
|
99
|
+
method?: "cli" | "env" | "api" | "config_file";
|
|
100
|
+
requiresApproval?: boolean;
|
|
101
|
+
approvedBy?: string;
|
|
102
|
+
impact?: "low" | "medium" | "high";
|
|
103
|
+
affectedCompliance?: string[];
|
|
104
|
+
}): Promise<ChangeRecord>;
|
|
105
|
+
/**
|
|
106
|
+
* Get recent configuration changes
|
|
107
|
+
*/
|
|
108
|
+
export declare function getRecentChanges(limit?: number): Promise<ChangeRecord[]>;
|
|
109
|
+
/**
|
|
110
|
+
* Get change statistics
|
|
111
|
+
*/
|
|
112
|
+
export declare function getChangeStatistics(from?: Date, to?: Date): Promise<ReturnType<ChangeLog["getStatistics"]>>;
|
|
113
|
+
//# sourceMappingURL=change-log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change-log.d.ts","sourceRoot":"","sources":["../../src/compliance/change-log.ts"],"names":[],"mappings":"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"}
|