@pan-sec/notebooklm-mcp 1.4.0 → 1.6.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/library/notebook-library.d.ts.map +1 -1
- package/dist/library/notebook-library.js +2 -1
- package/dist/library/notebook-library.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/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/docs/COMPLIANCE-SPEC.md +1452 -0
- package/package.json +30 -4
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Alert Manager
|
|
3
|
+
*
|
|
4
|
+
* Sends alerts for security and compliance events.
|
|
5
|
+
* Supports multiple channels: console, file, webhook, email.
|
|
6
|
+
*
|
|
7
|
+
* Added by Pantheon Security for enterprise compliance support.
|
|
8
|
+
*/
|
|
9
|
+
import crypto from "crypto";
|
|
10
|
+
import path from "path";
|
|
11
|
+
import https from "https";
|
|
12
|
+
import { getConfig } from "../config.js";
|
|
13
|
+
import { mkdirSecure, appendFileSecure } from "../utils/file-permissions.js";
|
|
14
|
+
/**
|
|
15
|
+
* Generate a UUID v4
|
|
16
|
+
*/
|
|
17
|
+
function generateUUID() {
|
|
18
|
+
return crypto.randomUUID();
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Get alert configuration from environment
|
|
22
|
+
*/
|
|
23
|
+
function getAlertConfig() {
|
|
24
|
+
return {
|
|
25
|
+
enabled: process.env.NLMCP_ALERTS_ENABLED !== "false",
|
|
26
|
+
channels: {
|
|
27
|
+
console: true,
|
|
28
|
+
file: process.env.NLMCP_ALERTS_FILE ? {
|
|
29
|
+
path: process.env.NLMCP_ALERTS_FILE,
|
|
30
|
+
format: "json",
|
|
31
|
+
} : undefined,
|
|
32
|
+
webhook: process.env.NLMCP_ALERTS_WEBHOOK_URL ? {
|
|
33
|
+
url: process.env.NLMCP_ALERTS_WEBHOOK_URL,
|
|
34
|
+
headers: process.env.NLMCP_ALERTS_WEBHOOK_HEADERS
|
|
35
|
+
? JSON.parse(process.env.NLMCP_ALERTS_WEBHOOK_HEADERS)
|
|
36
|
+
: undefined,
|
|
37
|
+
} : undefined,
|
|
38
|
+
},
|
|
39
|
+
min_severity: process.env.NLMCP_ALERTS_MIN_SEVERITY || "warning",
|
|
40
|
+
cooldown_seconds: parseInt(process.env.NLMCP_ALERTS_COOLDOWN || "300", 10),
|
|
41
|
+
max_alerts_per_hour: parseInt(process.env.NLMCP_ALERTS_MAX_PER_HOUR || "60", 10),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Severity level ordering
|
|
46
|
+
*/
|
|
47
|
+
const SEVERITY_LEVELS = {
|
|
48
|
+
info: 0,
|
|
49
|
+
warning: 1,
|
|
50
|
+
error: 2,
|
|
51
|
+
critical: 3,
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Alert Manager class
|
|
55
|
+
*/
|
|
56
|
+
export class AlertManager {
|
|
57
|
+
static instance;
|
|
58
|
+
config;
|
|
59
|
+
alertHistory = new Map(); // key -> last alert timestamp
|
|
60
|
+
hourlyAlerts = [];
|
|
61
|
+
alertsDir;
|
|
62
|
+
constructor() {
|
|
63
|
+
this.config = getAlertConfig();
|
|
64
|
+
const config = getConfig();
|
|
65
|
+
this.alertsDir = path.join(config.dataDir, "alerts");
|
|
66
|
+
if (this.config.enabled && this.config.channels.file) {
|
|
67
|
+
mkdirSecure(this.alertsDir);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get singleton instance
|
|
72
|
+
*/
|
|
73
|
+
static getInstance() {
|
|
74
|
+
if (!AlertManager.instance) {
|
|
75
|
+
AlertManager.instance = new AlertManager();
|
|
76
|
+
}
|
|
77
|
+
return AlertManager.instance;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Check if alert should be sent based on severity
|
|
81
|
+
*/
|
|
82
|
+
meetsMinimumSeverity(severity) {
|
|
83
|
+
return SEVERITY_LEVELS[severity] >= SEVERITY_LEVELS[this.config.min_severity];
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Check if alert is within cooldown period
|
|
87
|
+
*/
|
|
88
|
+
isInCooldown(key) {
|
|
89
|
+
const lastAlert = this.alertHistory.get(key);
|
|
90
|
+
if (!lastAlert)
|
|
91
|
+
return false;
|
|
92
|
+
const elapsed = (Date.now() - lastAlert) / 1000;
|
|
93
|
+
return elapsed < this.config.cooldown_seconds;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Check if hourly limit is exceeded
|
|
97
|
+
*/
|
|
98
|
+
isHourlyLimitExceeded() {
|
|
99
|
+
const oneHourAgo = Date.now() - 60 * 60 * 1000;
|
|
100
|
+
this.hourlyAlerts = this.hourlyAlerts.filter(a => a.timestamp > oneHourAgo);
|
|
101
|
+
return this.hourlyAlerts.length >= this.config.max_alerts_per_hour;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Record that an alert was sent
|
|
105
|
+
*/
|
|
106
|
+
recordAlert(key) {
|
|
107
|
+
this.alertHistory.set(key, Date.now());
|
|
108
|
+
this.hourlyAlerts.push({ timestamp: Date.now() });
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Generate a unique key for deduplication
|
|
112
|
+
*/
|
|
113
|
+
generateKey(severity, title, source) {
|
|
114
|
+
return `${severity}:${title}:${source}`;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Send an alert
|
|
118
|
+
*/
|
|
119
|
+
async sendAlert(severity, title, message, source, details) {
|
|
120
|
+
if (!this.config.enabled) {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
// Check severity
|
|
124
|
+
if (!this.meetsMinimumSeverity(severity)) {
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
// Check cooldown
|
|
128
|
+
const key = this.generateKey(severity, title, source);
|
|
129
|
+
if (this.isInCooldown(key)) {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
// Check hourly limit
|
|
133
|
+
if (this.isHourlyLimitExceeded()) {
|
|
134
|
+
// Log that we're rate limiting, but only once per hour
|
|
135
|
+
if (!this.isInCooldown("rate_limit_warning")) {
|
|
136
|
+
console.warn("[AlertManager] Hourly alert limit exceeded, suppressing alerts");
|
|
137
|
+
this.recordAlert("rate_limit_warning");
|
|
138
|
+
}
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
// Create alert
|
|
142
|
+
const alert = {
|
|
143
|
+
id: generateUUID(),
|
|
144
|
+
timestamp: new Date().toISOString(),
|
|
145
|
+
severity,
|
|
146
|
+
title,
|
|
147
|
+
message,
|
|
148
|
+
source,
|
|
149
|
+
details,
|
|
150
|
+
sent_to: [],
|
|
151
|
+
};
|
|
152
|
+
// Send to all configured channels
|
|
153
|
+
const results = await Promise.allSettled([
|
|
154
|
+
this.sendToConsole(alert),
|
|
155
|
+
this.sendToFile(alert),
|
|
156
|
+
this.sendToWebhook(alert),
|
|
157
|
+
]);
|
|
158
|
+
// Record sent channels
|
|
159
|
+
if (results[0].status === "fulfilled" && results[0].value) {
|
|
160
|
+
alert.sent_to.push("console");
|
|
161
|
+
}
|
|
162
|
+
if (results[1].status === "fulfilled" && results[1].value) {
|
|
163
|
+
alert.sent_to.push("file");
|
|
164
|
+
}
|
|
165
|
+
if (results[2].status === "fulfilled" && results[2].value) {
|
|
166
|
+
alert.sent_to.push("webhook");
|
|
167
|
+
}
|
|
168
|
+
// Record this alert
|
|
169
|
+
this.recordAlert(key);
|
|
170
|
+
return alert;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Send alert to console
|
|
174
|
+
*/
|
|
175
|
+
async sendToConsole(alert) {
|
|
176
|
+
if (!this.config.channels.console) {
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
const icon = this.getSeverityIcon(alert.severity);
|
|
180
|
+
const timestamp = new Date(alert.timestamp).toLocaleTimeString();
|
|
181
|
+
console.log(`${icon} [${timestamp}] ${alert.title}`);
|
|
182
|
+
console.log(` ${alert.message}`);
|
|
183
|
+
if (alert.details) {
|
|
184
|
+
console.log(` Details: ${JSON.stringify(alert.details)}`);
|
|
185
|
+
}
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Send alert to file
|
|
190
|
+
*/
|
|
191
|
+
async sendToFile(alert) {
|
|
192
|
+
if (!this.config.channels.file) {
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
try {
|
|
196
|
+
const filePath = this.config.channels.file.path || path.join(this.alertsDir, `alerts-${new Date().toISOString().split("T")[0]}.jsonl`);
|
|
197
|
+
const line = this.config.channels.file.format === "json"
|
|
198
|
+
? JSON.stringify(alert) + "\n"
|
|
199
|
+
: `${alert.timestamp} [${alert.severity.toUpperCase()}] ${alert.title}: ${alert.message}\n`;
|
|
200
|
+
appendFileSecure(filePath, line);
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Send alert to webhook
|
|
209
|
+
*/
|
|
210
|
+
async sendToWebhook(alert) {
|
|
211
|
+
if (!this.config.channels.webhook?.url) {
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
try {
|
|
215
|
+
const url = new URL(this.config.channels.webhook.url);
|
|
216
|
+
// Format message for common webhook services
|
|
217
|
+
const body = this.formatWebhookBody(alert);
|
|
218
|
+
return new Promise((resolve) => {
|
|
219
|
+
const req = https.request({
|
|
220
|
+
hostname: url.hostname,
|
|
221
|
+
port: url.port || 443,
|
|
222
|
+
path: url.pathname + url.search,
|
|
223
|
+
method: "POST",
|
|
224
|
+
headers: {
|
|
225
|
+
"Content-Type": "application/json",
|
|
226
|
+
...this.config.channels.webhook?.headers,
|
|
227
|
+
},
|
|
228
|
+
timeout: 10000,
|
|
229
|
+
}, (res) => {
|
|
230
|
+
resolve(res.statusCode !== undefined && res.statusCode >= 200 && res.statusCode < 300);
|
|
231
|
+
});
|
|
232
|
+
req.on("error", () => resolve(false));
|
|
233
|
+
req.on("timeout", () => {
|
|
234
|
+
req.destroy();
|
|
235
|
+
resolve(false);
|
|
236
|
+
});
|
|
237
|
+
req.write(JSON.stringify(body));
|
|
238
|
+
req.end();
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Format webhook body for common services (Slack, Teams, generic)
|
|
247
|
+
*/
|
|
248
|
+
formatWebhookBody(alert) {
|
|
249
|
+
const url = this.config.channels.webhook?.url || "";
|
|
250
|
+
// Slack format
|
|
251
|
+
if (url.includes("slack.com")) {
|
|
252
|
+
return {
|
|
253
|
+
text: `${this.getSeverityIcon(alert.severity)} *${alert.title}*`,
|
|
254
|
+
attachments: [
|
|
255
|
+
{
|
|
256
|
+
color: this.getSeverityColor(alert.severity),
|
|
257
|
+
text: alert.message,
|
|
258
|
+
fields: alert.details
|
|
259
|
+
? Object.entries(alert.details).map(([k, v]) => ({
|
|
260
|
+
title: k,
|
|
261
|
+
value: String(v),
|
|
262
|
+
short: true,
|
|
263
|
+
}))
|
|
264
|
+
: [],
|
|
265
|
+
footer: `Source: ${alert.source}`,
|
|
266
|
+
ts: Math.floor(new Date(alert.timestamp).getTime() / 1000),
|
|
267
|
+
},
|
|
268
|
+
],
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
// Microsoft Teams format
|
|
272
|
+
if (url.includes("office.com") || url.includes("microsoft.com")) {
|
|
273
|
+
return {
|
|
274
|
+
"@type": "MessageCard",
|
|
275
|
+
"@context": "http://schema.org/extensions",
|
|
276
|
+
themeColor: this.getSeverityColor(alert.severity).replace("#", ""),
|
|
277
|
+
summary: alert.title,
|
|
278
|
+
sections: [
|
|
279
|
+
{
|
|
280
|
+
activityTitle: `${this.getSeverityIcon(alert.severity)} ${alert.title}`,
|
|
281
|
+
activitySubtitle: alert.source,
|
|
282
|
+
facts: alert.details
|
|
283
|
+
? Object.entries(alert.details).map(([k, v]) => ({
|
|
284
|
+
name: k,
|
|
285
|
+
value: String(v),
|
|
286
|
+
}))
|
|
287
|
+
: [],
|
|
288
|
+
text: alert.message,
|
|
289
|
+
},
|
|
290
|
+
],
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
// Generic format
|
|
294
|
+
return {
|
|
295
|
+
alert_id: alert.id,
|
|
296
|
+
severity: alert.severity,
|
|
297
|
+
title: alert.title,
|
|
298
|
+
message: alert.message,
|
|
299
|
+
source: alert.source,
|
|
300
|
+
timestamp: alert.timestamp,
|
|
301
|
+
details: alert.details,
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Get severity icon
|
|
306
|
+
*/
|
|
307
|
+
getSeverityIcon(severity) {
|
|
308
|
+
switch (severity) {
|
|
309
|
+
case "critical":
|
|
310
|
+
return "🚨";
|
|
311
|
+
case "error":
|
|
312
|
+
return "❌";
|
|
313
|
+
case "warning":
|
|
314
|
+
return "⚠️";
|
|
315
|
+
case "info":
|
|
316
|
+
return "ℹ️";
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Get severity color (for webhooks)
|
|
321
|
+
*/
|
|
322
|
+
getSeverityColor(severity) {
|
|
323
|
+
switch (severity) {
|
|
324
|
+
case "critical":
|
|
325
|
+
return "#FF0000";
|
|
326
|
+
case "error":
|
|
327
|
+
return "#FF6600";
|
|
328
|
+
case "warning":
|
|
329
|
+
return "#FFCC00";
|
|
330
|
+
case "info":
|
|
331
|
+
return "#0066FF";
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
// ============================================
|
|
335
|
+
// CONVENIENCE METHODS
|
|
336
|
+
// ============================================
|
|
337
|
+
/**
|
|
338
|
+
* Send a critical alert
|
|
339
|
+
*/
|
|
340
|
+
async critical(title, message, source, details) {
|
|
341
|
+
return this.sendAlert("critical", title, message, source, details);
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Send an error alert
|
|
345
|
+
*/
|
|
346
|
+
async error(title, message, source, details) {
|
|
347
|
+
return this.sendAlert("error", title, message, source, details);
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Send a warning alert
|
|
351
|
+
*/
|
|
352
|
+
async warning(title, message, source, details) {
|
|
353
|
+
return this.sendAlert("warning", title, message, source, details);
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Send an info alert
|
|
357
|
+
*/
|
|
358
|
+
async info(title, message, source, details) {
|
|
359
|
+
return this.sendAlert("info", title, message, source, details);
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Get alert statistics
|
|
363
|
+
*/
|
|
364
|
+
getStats() {
|
|
365
|
+
const channels = [];
|
|
366
|
+
if (this.config.channels.console)
|
|
367
|
+
channels.push("console");
|
|
368
|
+
if (this.config.channels.file)
|
|
369
|
+
channels.push("file");
|
|
370
|
+
if (this.config.channels.webhook)
|
|
371
|
+
channels.push("webhook");
|
|
372
|
+
const oneHourAgo = Date.now() - 60 * 60 * 1000;
|
|
373
|
+
const alertsThisHour = this.hourlyAlerts.filter(a => a.timestamp > oneHourAgo).length;
|
|
374
|
+
return {
|
|
375
|
+
enabled: this.config.enabled,
|
|
376
|
+
min_severity: this.config.min_severity,
|
|
377
|
+
cooldown_seconds: this.config.cooldown_seconds,
|
|
378
|
+
max_alerts_per_hour: this.config.max_alerts_per_hour,
|
|
379
|
+
alerts_this_hour: alertsThisHour,
|
|
380
|
+
channels,
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Update configuration at runtime
|
|
385
|
+
*/
|
|
386
|
+
updateConfig(updates) {
|
|
387
|
+
this.config = { ...this.config, ...updates };
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
// ============================================
|
|
391
|
+
// SINGLETON ACCESS
|
|
392
|
+
// ============================================
|
|
393
|
+
/**
|
|
394
|
+
* Get the alert manager instance
|
|
395
|
+
*/
|
|
396
|
+
export function getAlertManager() {
|
|
397
|
+
return AlertManager.getInstance();
|
|
398
|
+
}
|
|
399
|
+
// ============================================
|
|
400
|
+
// CONVENIENCE EXPORTS
|
|
401
|
+
// ============================================
|
|
402
|
+
/**
|
|
403
|
+
* Send an alert
|
|
404
|
+
*/
|
|
405
|
+
export async function sendAlert(severity, title, message, source, details) {
|
|
406
|
+
return getAlertManager().sendAlert(severity, title, message, source, details);
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Send a critical alert
|
|
410
|
+
*/
|
|
411
|
+
export async function alertCritical(title, message, source, details) {
|
|
412
|
+
return getAlertManager().critical(title, message, source, details);
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Send a warning alert
|
|
416
|
+
*/
|
|
417
|
+
export async function alertWarning(title, message, source, details) {
|
|
418
|
+
return getAlertManager().warning(title, message, source, details);
|
|
419
|
+
}
|
|
420
|
+
//# sourceMappingURL=alert-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert-manager.js","sourceRoot":"","sources":["../../src/compliance/alert-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,134 @@
|
|
|
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 type { BreachRule, BreachAction, IncidentSeverity } from "./types.js";
|
|
10
|
+
/**
|
|
11
|
+
* Breach detection result
|
|
12
|
+
*/
|
|
13
|
+
interface BreachDetection {
|
|
14
|
+
id: string;
|
|
15
|
+
detected_at: string;
|
|
16
|
+
rule: BreachRule;
|
|
17
|
+
event_count: number;
|
|
18
|
+
window_start: string;
|
|
19
|
+
window_end: string;
|
|
20
|
+
actions_taken: BreachAction[];
|
|
21
|
+
incident_id?: string;
|
|
22
|
+
blocked: boolean;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Breach Detector class
|
|
26
|
+
*/
|
|
27
|
+
export declare class BreachDetector {
|
|
28
|
+
private static instance;
|
|
29
|
+
private rulesFile;
|
|
30
|
+
private rules;
|
|
31
|
+
private eventTrackers;
|
|
32
|
+
private detections;
|
|
33
|
+
private loaded;
|
|
34
|
+
private enabled;
|
|
35
|
+
private blockedPatterns;
|
|
36
|
+
private constructor();
|
|
37
|
+
/**
|
|
38
|
+
* Get singleton instance
|
|
39
|
+
*/
|
|
40
|
+
static getInstance(): BreachDetector;
|
|
41
|
+
/**
|
|
42
|
+
* Load rules from storage
|
|
43
|
+
*/
|
|
44
|
+
private load;
|
|
45
|
+
/**
|
|
46
|
+
* Save custom rules to storage
|
|
47
|
+
*/
|
|
48
|
+
private save;
|
|
49
|
+
/**
|
|
50
|
+
* Check an event against all rules
|
|
51
|
+
*/
|
|
52
|
+
checkEvent(eventPattern: string, details?: Record<string, unknown>): Promise<BreachDetection | null>;
|
|
53
|
+
/**
|
|
54
|
+
* Check if event pattern matches rule pattern
|
|
55
|
+
*/
|
|
56
|
+
private matchesPattern;
|
|
57
|
+
/**
|
|
58
|
+
* Handle a detected breach
|
|
59
|
+
*/
|
|
60
|
+
private handleBreach;
|
|
61
|
+
/**
|
|
62
|
+
* Action: Log the breach
|
|
63
|
+
*/
|
|
64
|
+
private actionLog;
|
|
65
|
+
/**
|
|
66
|
+
* Action: Send alert
|
|
67
|
+
*/
|
|
68
|
+
private actionAlert;
|
|
69
|
+
/**
|
|
70
|
+
* Action: Block the pattern
|
|
71
|
+
*/
|
|
72
|
+
private actionBlock;
|
|
73
|
+
/**
|
|
74
|
+
* Action: Notify admin
|
|
75
|
+
*/
|
|
76
|
+
private actionNotifyAdmin;
|
|
77
|
+
/**
|
|
78
|
+
* Action: Create incident
|
|
79
|
+
*/
|
|
80
|
+
private actionCreateIncident;
|
|
81
|
+
/**
|
|
82
|
+
* Check if a pattern is blocked
|
|
83
|
+
*/
|
|
84
|
+
isBlocked(pattern: string): boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Unblock a pattern
|
|
87
|
+
*/
|
|
88
|
+
unblock(pattern: string): boolean;
|
|
89
|
+
/**
|
|
90
|
+
* Get all rules
|
|
91
|
+
*/
|
|
92
|
+
getRules(): Promise<BreachRule[]>;
|
|
93
|
+
/**
|
|
94
|
+
* Add a custom rule
|
|
95
|
+
*/
|
|
96
|
+
addRule(rule: Omit<BreachRule, "id">): Promise<BreachRule>;
|
|
97
|
+
/**
|
|
98
|
+
* Remove a rule
|
|
99
|
+
*/
|
|
100
|
+
removeRule(ruleId: string): Promise<boolean>;
|
|
101
|
+
/**
|
|
102
|
+
* Get recent detections
|
|
103
|
+
*/
|
|
104
|
+
getRecentDetections(limit?: number): BreachDetection[];
|
|
105
|
+
/**
|
|
106
|
+
* Get detection statistics
|
|
107
|
+
*/
|
|
108
|
+
getStats(): {
|
|
109
|
+
enabled: boolean;
|
|
110
|
+
rules_count: number;
|
|
111
|
+
blocked_patterns: number;
|
|
112
|
+
detections_count: number;
|
|
113
|
+
by_severity: Record<IncidentSeverity, number>;
|
|
114
|
+
by_rule: Record<string, number>;
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Get the breach detector instance
|
|
119
|
+
*/
|
|
120
|
+
export declare function getBreachDetector(): BreachDetector;
|
|
121
|
+
/**
|
|
122
|
+
* Check an event for breach detection
|
|
123
|
+
*/
|
|
124
|
+
export declare function checkForBreach(eventPattern: string, details?: Record<string, unknown>): Promise<BreachDetection | null>;
|
|
125
|
+
/**
|
|
126
|
+
* Check if a pattern is blocked
|
|
127
|
+
*/
|
|
128
|
+
export declare function isPatternBlocked(pattern: string): boolean;
|
|
129
|
+
/**
|
|
130
|
+
* Get breach detection rules
|
|
131
|
+
*/
|
|
132
|
+
export declare function getBreachRules(): Promise<BreachRule[]>;
|
|
133
|
+
export {};
|
|
134
|
+
//# sourceMappingURL=breach-detection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"breach-detection.d.ts","sourceRoot":"","sources":["../../src/compliance/breach-detection.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAkH7E;;GAEG;AACH,UAAU,eAAe;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,UAAU,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAiB;IACxC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAsC;IACnD,OAAO,CAAC,aAAa,CAAwC;IAC7D,OAAO,CAAC,UAAU,CAAyB;IAC3C,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,eAAe,CAA0B;IAEjD,OAAO;IAMP;;OAEG;WACW,WAAW,IAAI,cAAc;IAO3C;;OAEG;YACW,IAAI;IA0BlB;;OAEG;YACW,IAAI;IAkBlB;;OAEG;IACU,UAAU,CACrB,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IA4ClC;;OAEG;IACH,OAAO,CAAC,cAAc;IAetB;;OAEG;YACW,YAAY;IAgD1B;;OAEG;YACW,SAAS;IAkBvB;;OAEG;YACW,WAAW;IA2BzB;;OAEG;YACW,WAAW;IAKzB;;OAEG;YACW,iBAAiB;IAe/B;;OAEG;YACW,oBAAoB;IAwBlC;;OAEG;IACI,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI1C;;OAEG;IACI,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIxC;;OAEG;IACU,QAAQ,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAK9C;;OAEG;IACU,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IAcvE;;OAEG;IACU,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAkBzD;;OAEG;IACI,mBAAmB,CAAC,KAAK,GAAE,MAAY,GAAG,eAAe,EAAE;IAIlE;;OAEG;IACI,QAAQ,IAAI;QACjB,OAAO,EAAE,OAAO,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,MAAM,CAAC;QACzB,gBAAgB,EAAE,MAAM,CAAC;QACzB,WAAW,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;QAC9C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACjC;CAwBF;AAMD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,CAElD;AAMD;;GAEG;AACH,wBAAsB,cAAc,CAClC,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAEjC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAE5D"}
|