@dotsetlabs/tollgate 0.1.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/LICENSE +21 -0
- package/README.md +885 -0
- package/dist/analyzers/filesystem.d.ts +26 -0
- package/dist/analyzers/filesystem.d.ts.map +1 -0
- package/dist/analyzers/filesystem.js +284 -0
- package/dist/analyzers/filesystem.js.map +1 -0
- package/dist/analyzers/http.d.ts +90 -0
- package/dist/analyzers/http.d.ts.map +1 -0
- package/dist/analyzers/http.js +433 -0
- package/dist/analyzers/http.js.map +1 -0
- package/dist/analyzers/index.d.ts +101 -0
- package/dist/analyzers/index.d.ts.map +1 -0
- package/dist/analyzers/index.js +342 -0
- package/dist/analyzers/index.js.map +1 -0
- package/dist/analyzers/loader.d.ts +114 -0
- package/dist/analyzers/loader.d.ts.map +1 -0
- package/dist/analyzers/loader.js +184 -0
- package/dist/analyzers/loader.js.map +1 -0
- package/dist/analyzers/prompt-injection.d.ts +95 -0
- package/dist/analyzers/prompt-injection.d.ts.map +1 -0
- package/dist/analyzers/prompt-injection.js +725 -0
- package/dist/analyzers/prompt-injection.js.map +1 -0
- package/dist/analyzers/sdk.d.ts +230 -0
- package/dist/analyzers/sdk.d.ts.map +1 -0
- package/dist/analyzers/sdk.js +283 -0
- package/dist/analyzers/sdk.js.map +1 -0
- package/dist/analyzers/shell.d.ts +20 -0
- package/dist/analyzers/shell.d.ts.map +1 -0
- package/dist/analyzers/shell.js +297 -0
- package/dist/analyzers/shell.js.map +1 -0
- package/dist/analyzers/sql.d.ts +37 -0
- package/dist/analyzers/sql.d.ts.map +1 -0
- package/dist/analyzers/sql.js +455 -0
- package/dist/analyzers/sql.js.map +1 -0
- package/dist/analyzers/types.d.ts +117 -0
- package/dist/analyzers/types.d.ts.map +1 -0
- package/dist/analyzers/types.js +46 -0
- package/dist/analyzers/types.js.map +1 -0
- package/dist/approval/interactive.d.ts +72 -0
- package/dist/approval/interactive.d.ts.map +1 -0
- package/dist/approval/interactive.js +550 -0
- package/dist/approval/interactive.js.map +1 -0
- package/dist/approval/terminal.d.ts +59 -0
- package/dist/approval/terminal.d.ts.map +1 -0
- package/dist/approval/terminal.js +238 -0
- package/dist/approval/terminal.js.map +1 -0
- package/dist/approval/types.d.ts +66 -0
- package/dist/approval/types.d.ts.map +1 -0
- package/dist/approval/types.js +2 -0
- package/dist/approval/types.js.map +1 -0
- package/dist/audit/exporter.d.ts +138 -0
- package/dist/audit/exporter.d.ts.map +1 -0
- package/dist/audit/exporter.js +366 -0
- package/dist/audit/exporter.js.map +1 -0
- package/dist/audit/logger.d.ts +156 -0
- package/dist/audit/logger.d.ts.map +1 -0
- package/dist/audit/logger.js +406 -0
- package/dist/audit/logger.js.map +1 -0
- package/dist/audit/redaction.d.ts +110 -0
- package/dist/audit/redaction.d.ts.map +1 -0
- package/dist/audit/redaction.js +307 -0
- package/dist/audit/redaction.js.map +1 -0
- package/dist/audit/schema.d.ts +76 -0
- package/dist/audit/schema.d.ts.map +1 -0
- package/dist/audit/schema.js +122 -0
- package/dist/audit/schema.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +34 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +431 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/export.d.ts +18 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +63 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/init.d.ts +12 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +102 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/logs.d.ts +11 -0
- package/dist/cli/commands/logs.d.ts.map +1 -0
- package/dist/cli/commands/logs.js +60 -0
- package/dist/cli/commands/logs.js.map +1 -0
- package/dist/cli/commands/scan.d.ts +29 -0
- package/dist/cli/commands/scan.d.ts.map +1 -0
- package/dist/cli/commands/scan.js +251 -0
- package/dist/cli/commands/scan.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +26 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +424 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/start.d.ts +20 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +82 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/stats.d.ts +10 -0
- package/dist/cli/commands/stats.d.ts.map +1 -0
- package/dist/cli/commands/stats.js +42 -0
- package/dist/cli/commands/stats.js.map +1 -0
- package/dist/cli/commands/templates.d.ts +26 -0
- package/dist/cli/commands/templates.d.ts.map +1 -0
- package/dist/cli/commands/templates.js +221 -0
- package/dist/cli/commands/templates.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +12 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +107 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/commands/wrap.d.ts +19 -0
- package/dist/cli/commands/wrap.d.ts.map +1 -0
- package/dist/cli/commands/wrap.js +59 -0
- package/dist/cli/commands/wrap.js.map +1 -0
- package/dist/cli/index.d.ts +17 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +202 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/ui.d.ts +139 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/ui.js +271 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/constants.d.ts +33 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +54 -0
- package/dist/constants.js.map +1 -0
- package/dist/errors.d.ts +28 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +37 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +49 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +82 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator/index.d.ts +11 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +10 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/manager.d.ts +127 -0
- package/dist/orchestrator/manager.d.ts.map +1 -0
- package/dist/orchestrator/manager.js +498 -0
- package/dist/orchestrator/manager.js.map +1 -0
- package/dist/orchestrator/types.d.ts +141 -0
- package/dist/orchestrator/types.d.ts.map +1 -0
- package/dist/orchestrator/types.js +9 -0
- package/dist/orchestrator/types.js.map +1 -0
- package/dist/policy/engine.d.ts +55 -0
- package/dist/policy/engine.d.ts.map +1 -0
- package/dist/policy/engine.js +288 -0
- package/dist/policy/engine.js.map +1 -0
- package/dist/policy/natural-language.d.ts +141 -0
- package/dist/policy/natural-language.d.ts.map +1 -0
- package/dist/policy/natural-language.js +552 -0
- package/dist/policy/natural-language.js.map +1 -0
- package/dist/policy/parser.d.ts +141 -0
- package/dist/policy/parser.d.ts.map +1 -0
- package/dist/policy/parser.js +314 -0
- package/dist/policy/parser.js.map +1 -0
- package/dist/policy/types.d.ts +428 -0
- package/dist/policy/types.d.ts.map +1 -0
- package/dist/policy/types.js +32 -0
- package/dist/policy/types.js.map +1 -0
- package/dist/policy/validator.d.ts +72 -0
- package/dist/policy/validator.d.ts.map +1 -0
- package/dist/policy/validator.js +453 -0
- package/dist/policy/validator.js.map +1 -0
- package/dist/proxy/bridge.d.ts +84 -0
- package/dist/proxy/bridge.d.ts.map +1 -0
- package/dist/proxy/bridge.js +217 -0
- package/dist/proxy/bridge.js.map +1 -0
- package/dist/proxy/client.d.ts +130 -0
- package/dist/proxy/client.d.ts.map +1 -0
- package/dist/proxy/client.js +290 -0
- package/dist/proxy/client.js.map +1 -0
- package/dist/proxy/server.d.ts +111 -0
- package/dist/proxy/server.d.ts.map +1 -0
- package/dist/proxy/server.js +444 -0
- package/dist/proxy/server.js.map +1 -0
- package/dist/scanner.d.ts +91 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +373 -0
- package/dist/scanner.js.map +1 -0
- package/dist/session/index.d.ts +32 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +31 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/manager.d.ts +166 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +454 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/session/sqlite-store.d.ts +54 -0
- package/dist/session/sqlite-store.d.ts.map +1 -0
- package/dist/session/sqlite-store.js +209 -0
- package/dist/session/sqlite-store.js.map +1 -0
- package/dist/session/types.d.ts +179 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +38 -0
- package/dist/session/types.js.map +1 -0
- package/dist/templates.d.ts +64 -0
- package/dist/templates.d.ts.map +1 -0
- package/dist/templates.js +451 -0
- package/dist/templates.js.map +1 -0
- package/dist/utils/config.d.ts +57 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +104 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/errors.d.ts +18 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +35 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +144 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +300 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/wizard.d.ts +68 -0
- package/dist/wizard.d.ts.map +1 -0
- package/dist/wizard.js +395 -0
- package/dist/wizard.js.map +1 -0
- package/package.json +99 -0
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit Export Module for Tollgate
|
|
3
|
+
*
|
|
4
|
+
* Exports audit records in various formats for compliance reporting,
|
|
5
|
+
* log aggregation, and SIEM integration.
|
|
6
|
+
*
|
|
7
|
+
* Supported formats:
|
|
8
|
+
* - JSON Lines (JSONL) - for log aggregation (Splunk, ELK, etc.)
|
|
9
|
+
* - CSV - for spreadsheet analysis
|
|
10
|
+
* - CEF (Common Event Format) - for SIEM systems
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* import { AuditExporter } from './exporter.js';
|
|
15
|
+
*
|
|
16
|
+
* const exporter = new AuditExporter(logger);
|
|
17
|
+
*
|
|
18
|
+
* // Export as JSON Lines
|
|
19
|
+
* const jsonl = exporter.exportJsonLines({ since: new Date('2024-01-01') });
|
|
20
|
+
*
|
|
21
|
+
* // Export as CSV
|
|
22
|
+
* const csv = exporter.exportCsv({ useRedacted: true });
|
|
23
|
+
*
|
|
24
|
+
* // Export as CEF for SIEM
|
|
25
|
+
* const cef = exporter.exportCef({ server: 'postgres' });
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
/**
|
|
29
|
+
* CEF severity levels mapped from risk levels.
|
|
30
|
+
*/
|
|
31
|
+
const CEF_SEVERITY = {
|
|
32
|
+
safe: 0,
|
|
33
|
+
read: 1,
|
|
34
|
+
write: 4,
|
|
35
|
+
destructive: 7,
|
|
36
|
+
dangerous: 10,
|
|
37
|
+
// Default for policy decisions
|
|
38
|
+
allow: 1,
|
|
39
|
+
deny: 4,
|
|
40
|
+
prompt: 3,
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Audit exporter for generating compliance reports.
|
|
44
|
+
*/
|
|
45
|
+
export class AuditExporter {
|
|
46
|
+
logger;
|
|
47
|
+
constructor(logger) {
|
|
48
|
+
this.logger = logger;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Exports audit records as JSON Lines (JSONL).
|
|
52
|
+
*
|
|
53
|
+
* Each line is a complete JSON object, suitable for log aggregation systems.
|
|
54
|
+
*
|
|
55
|
+
* @param options - Export options
|
|
56
|
+
* @returns JSONL string with one record per line
|
|
57
|
+
*/
|
|
58
|
+
exportJsonLines(options = {}) {
|
|
59
|
+
const records = this.getRecords(options);
|
|
60
|
+
const lines = [];
|
|
61
|
+
for (const record of records) {
|
|
62
|
+
const exportRecord = this.formatRecordForExport(record, options.useRedacted ?? true);
|
|
63
|
+
lines.push(JSON.stringify(exportRecord));
|
|
64
|
+
}
|
|
65
|
+
if (options.includeSessionGrants) {
|
|
66
|
+
const grants = this.logger.getActiveSessionGrants(options.server);
|
|
67
|
+
for (const grant of grants) {
|
|
68
|
+
lines.push(JSON.stringify({
|
|
69
|
+
type: 'session_grant',
|
|
70
|
+
...this.formatGrantForExport(grant),
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return lines.join('\n');
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Exports audit records as CSV.
|
|
78
|
+
*
|
|
79
|
+
* @param options - Export options
|
|
80
|
+
* @returns CSV string with headers
|
|
81
|
+
*/
|
|
82
|
+
exportCsv(options = {}) {
|
|
83
|
+
const records = this.getRecords(options);
|
|
84
|
+
const useRedacted = options.useRedacted ?? true;
|
|
85
|
+
// CSV headers
|
|
86
|
+
const headers = [
|
|
87
|
+
'id',
|
|
88
|
+
'timestamp',
|
|
89
|
+
'server',
|
|
90
|
+
'tool',
|
|
91
|
+
'policy_decision',
|
|
92
|
+
'policy_rule',
|
|
93
|
+
'policy_reason',
|
|
94
|
+
'analyzer',
|
|
95
|
+
'risk_level',
|
|
96
|
+
'user_decision',
|
|
97
|
+
'result',
|
|
98
|
+
'error_message',
|
|
99
|
+
'duration_ms',
|
|
100
|
+
'session_grant_id',
|
|
101
|
+
'correlation_id',
|
|
102
|
+
'client_id',
|
|
103
|
+
'args',
|
|
104
|
+
];
|
|
105
|
+
const lines = [headers.join(',')];
|
|
106
|
+
for (const record of records) {
|
|
107
|
+
const args = useRedacted && record.argsRedacted
|
|
108
|
+
? record.argsRedacted
|
|
109
|
+
: JSON.stringify(record.args);
|
|
110
|
+
const row = [
|
|
111
|
+
this.escapeCsv(record.id),
|
|
112
|
+
this.escapeCsv(record.timestamp.toISOString()),
|
|
113
|
+
this.escapeCsv(record.server),
|
|
114
|
+
this.escapeCsv(record.tool),
|
|
115
|
+
this.escapeCsv(record.policyDecision),
|
|
116
|
+
this.escapeCsv(record.policyRule ?? ''),
|
|
117
|
+
this.escapeCsv(record.policyReason ?? ''),
|
|
118
|
+
this.escapeCsv(record.analyzer ?? ''),
|
|
119
|
+
this.escapeCsv(record.riskLevel ?? ''),
|
|
120
|
+
this.escapeCsv(record.userDecision ?? ''),
|
|
121
|
+
this.escapeCsv(record.result ?? ''),
|
|
122
|
+
this.escapeCsv(record.errorMessage ?? ''),
|
|
123
|
+
record.durationMs?.toString() ?? '',
|
|
124
|
+
this.escapeCsv(record.sessionGrantId ?? ''),
|
|
125
|
+
this.escapeCsv(record.correlationId ?? ''),
|
|
126
|
+
this.escapeCsv(record.clientId ?? ''),
|
|
127
|
+
this.escapeCsv(args),
|
|
128
|
+
];
|
|
129
|
+
lines.push(row.join(','));
|
|
130
|
+
}
|
|
131
|
+
return lines.join('\n');
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Exports audit records in CEF (Common Event Format).
|
|
135
|
+
*
|
|
136
|
+
* CEF is widely supported by SIEM systems like Splunk, ArcSight, and QRadar.
|
|
137
|
+
*
|
|
138
|
+
* Format: CEF:Version|Device Vendor|Device Product|Device Version|Signature ID|Name|Severity|Extension
|
|
139
|
+
*
|
|
140
|
+
* @param options - Export options
|
|
141
|
+
* @returns CEF formatted string with one event per line
|
|
142
|
+
*/
|
|
143
|
+
exportCef(options = {}) {
|
|
144
|
+
const records = this.getRecords(options);
|
|
145
|
+
const useRedacted = options.useRedacted ?? true;
|
|
146
|
+
const lines = [];
|
|
147
|
+
for (const record of records) {
|
|
148
|
+
const cef = this.formatCefEvent(record, useRedacted);
|
|
149
|
+
lines.push(cef);
|
|
150
|
+
}
|
|
151
|
+
return lines.join('\n');
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Gets records based on export options.
|
|
155
|
+
*/
|
|
156
|
+
getRecords(options) {
|
|
157
|
+
return this.logger.getRecentCalls({
|
|
158
|
+
limit: options.limit ?? 10000, // Default to a large number for exports
|
|
159
|
+
server: options.server,
|
|
160
|
+
since: options.since,
|
|
161
|
+
until: options.until,
|
|
162
|
+
riskLevel: options.riskLevel,
|
|
163
|
+
includeRedacted: options.useRedacted ?? true,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Formats an audit record for JSON export.
|
|
168
|
+
*/
|
|
169
|
+
formatRecordForExport(record, useRedacted) {
|
|
170
|
+
return {
|
|
171
|
+
type: 'tool_call',
|
|
172
|
+
id: record.id,
|
|
173
|
+
timestamp: record.timestamp.toISOString(),
|
|
174
|
+
server: record.server,
|
|
175
|
+
tool: record.tool,
|
|
176
|
+
args: useRedacted && record.argsRedacted
|
|
177
|
+
? JSON.parse(record.argsRedacted)
|
|
178
|
+
: record.args,
|
|
179
|
+
policy: {
|
|
180
|
+
decision: record.policyDecision,
|
|
181
|
+
rule: record.policyRule,
|
|
182
|
+
reason: record.policyReason,
|
|
183
|
+
},
|
|
184
|
+
analysis: record.analyzer ? {
|
|
185
|
+
analyzer: record.analyzer,
|
|
186
|
+
riskLevel: record.riskLevel,
|
|
187
|
+
} : undefined,
|
|
188
|
+
approval: record.userDecision ? {
|
|
189
|
+
decision: record.userDecision,
|
|
190
|
+
sessionGrantId: record.sessionGrantId,
|
|
191
|
+
} : undefined,
|
|
192
|
+
result: {
|
|
193
|
+
status: record.result,
|
|
194
|
+
error: record.errorMessage,
|
|
195
|
+
durationMs: record.durationMs,
|
|
196
|
+
},
|
|
197
|
+
context: {
|
|
198
|
+
correlationId: record.correlationId,
|
|
199
|
+
clientId: record.clientId,
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Formats a session grant for JSON export.
|
|
205
|
+
*/
|
|
206
|
+
formatGrantForExport(grant) {
|
|
207
|
+
return {
|
|
208
|
+
id: grant.id,
|
|
209
|
+
createdAt: grant.createdAt.toISOString(),
|
|
210
|
+
expiresAt: grant.expiresAt?.toISOString(),
|
|
211
|
+
server: grant.server,
|
|
212
|
+
scope: grant.scope,
|
|
213
|
+
scopeValue: grant.scopeValue,
|
|
214
|
+
tool: grant.tool,
|
|
215
|
+
grantedBy: grant.grantedBy,
|
|
216
|
+
originalRequestId: grant.originalRequestId,
|
|
217
|
+
usageCount: grant.usageCount,
|
|
218
|
+
revoked: grant.revokedAt ? {
|
|
219
|
+
at: grant.revokedAt.toISOString(),
|
|
220
|
+
by: grant.revokedBy,
|
|
221
|
+
} : undefined,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Formats a CEF event from an audit record.
|
|
226
|
+
*
|
|
227
|
+
* CEF format: CEF:0|Vendor|Product|Version|SignatureID|Name|Severity|Extension
|
|
228
|
+
*/
|
|
229
|
+
formatCefEvent(record, useRedacted) {
|
|
230
|
+
const vendor = 'Tollgate';
|
|
231
|
+
const product = 'MCP-Security-Proxy';
|
|
232
|
+
const version = '1.0';
|
|
233
|
+
// Signature ID based on action
|
|
234
|
+
const signatureId = this.getCefSignatureId(record);
|
|
235
|
+
// Event name
|
|
236
|
+
const name = `${record.server}:${record.tool} ${record.policyDecision}`;
|
|
237
|
+
// Severity (0-10 scale)
|
|
238
|
+
const severity = this.getCefSeverity(record);
|
|
239
|
+
// CEF extension fields
|
|
240
|
+
const extensions = this.getCefExtensions(record, useRedacted);
|
|
241
|
+
// Escape special characters in CEF fields
|
|
242
|
+
const escapedName = this.escapeCef(name);
|
|
243
|
+
return `CEF:0|${vendor}|${product}|${version}|${signatureId}|${escapedName}|${severity}|${extensions}`;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Gets the CEF signature ID for a record.
|
|
247
|
+
*/
|
|
248
|
+
getCefSignatureId(record) {
|
|
249
|
+
const base = record.policyDecision === 'allow' ? '100'
|
|
250
|
+
: record.policyDecision === 'deny' ? '200'
|
|
251
|
+
: '300';
|
|
252
|
+
const risk = record.riskLevel
|
|
253
|
+
? { safe: '0', read: '1', write: '2', destructive: '3', dangerous: '4' }[record.riskLevel] ?? '9'
|
|
254
|
+
: '9';
|
|
255
|
+
return `${base}${risk}`;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Gets the CEF severity for a record.
|
|
259
|
+
*/
|
|
260
|
+
getCefSeverity(record) {
|
|
261
|
+
// Use risk level if available, otherwise use policy decision
|
|
262
|
+
if (record.riskLevel) {
|
|
263
|
+
return CEF_SEVERITY[record.riskLevel] ?? 3;
|
|
264
|
+
}
|
|
265
|
+
return CEF_SEVERITY[record.policyDecision] ?? 3;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Gets CEF extension fields for a record.
|
|
269
|
+
*/
|
|
270
|
+
getCefExtensions(record, useRedacted) {
|
|
271
|
+
const extensions = [];
|
|
272
|
+
// Standard CEF fields
|
|
273
|
+
extensions.push(`rt=${record.timestamp.getTime()}`); // Receipt Time
|
|
274
|
+
extensions.push(`src=${record.server}`); // Source
|
|
275
|
+
extensions.push(`act=${record.policyDecision}`); // Action
|
|
276
|
+
// Custom fields
|
|
277
|
+
extensions.push(`cs1=${this.escapeCefValue(record.tool)}`);
|
|
278
|
+
extensions.push(`cs1Label=Tool`);
|
|
279
|
+
if (record.policyRule) {
|
|
280
|
+
extensions.push(`cs2=${this.escapeCefValue(record.policyRule)}`);
|
|
281
|
+
extensions.push(`cs2Label=PolicyRule`);
|
|
282
|
+
}
|
|
283
|
+
if (record.riskLevel) {
|
|
284
|
+
extensions.push(`cs3=${record.riskLevel}`);
|
|
285
|
+
extensions.push(`cs3Label=RiskLevel`);
|
|
286
|
+
}
|
|
287
|
+
if (record.userDecision) {
|
|
288
|
+
extensions.push(`cs4=${record.userDecision}`);
|
|
289
|
+
extensions.push(`cs4Label=UserDecision`);
|
|
290
|
+
}
|
|
291
|
+
if (record.result) {
|
|
292
|
+
extensions.push(`outcome=${record.result === 'success' ? 'Success' : 'Failure'}`);
|
|
293
|
+
}
|
|
294
|
+
if (record.durationMs !== undefined) {
|
|
295
|
+
extensions.push(`cn1=${record.durationMs}`);
|
|
296
|
+
extensions.push(`cn1Label=DurationMs`);
|
|
297
|
+
}
|
|
298
|
+
if (record.correlationId) {
|
|
299
|
+
extensions.push(`externalId=${this.escapeCefValue(record.correlationId)}`);
|
|
300
|
+
}
|
|
301
|
+
// Add args (redacted if requested)
|
|
302
|
+
const args = useRedacted && record.argsRedacted
|
|
303
|
+
? record.argsRedacted
|
|
304
|
+
: JSON.stringify(record.args);
|
|
305
|
+
extensions.push(`msg=${this.escapeCefValue(args)}`);
|
|
306
|
+
return extensions.join(' ');
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Escapes a value for CSV format.
|
|
310
|
+
*/
|
|
311
|
+
escapeCsv(value) {
|
|
312
|
+
if (value.includes(',') || value.includes('"') || value.includes('\n')) {
|
|
313
|
+
return `"${value.replace(/"/g, '""')}"`;
|
|
314
|
+
}
|
|
315
|
+
return value;
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Escapes a CEF header field (pipe and backslash).
|
|
319
|
+
*/
|
|
320
|
+
escapeCef(value) {
|
|
321
|
+
return value.replace(/\\/g, '\\\\').replace(/\|/g, '\\|');
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Escapes a CEF extension value (equals and newlines).
|
|
325
|
+
*/
|
|
326
|
+
escapeCefValue(value) {
|
|
327
|
+
return value
|
|
328
|
+
.replace(/\\/g, '\\\\')
|
|
329
|
+
.replace(/=/g, '\\=')
|
|
330
|
+
.replace(/\n/g, '\\n')
|
|
331
|
+
.replace(/\r/g, '\\r');
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Creates an exporter and exports records in the specified format.
|
|
336
|
+
*
|
|
337
|
+
* @param logger - The audit logger to export from
|
|
338
|
+
* @param format - The export format
|
|
339
|
+
* @param options - Export options
|
|
340
|
+
* @returns Formatted export string
|
|
341
|
+
*/
|
|
342
|
+
export function exportAuditRecords(logger, format, options = {}) {
|
|
343
|
+
const exporter = new AuditExporter(logger);
|
|
344
|
+
switch (format) {
|
|
345
|
+
case 'json': {
|
|
346
|
+
// Pretty-printed JSON array
|
|
347
|
+
const records = logger.getRecentCalls({
|
|
348
|
+
limit: options.limit ?? 10000,
|
|
349
|
+
server: options.server,
|
|
350
|
+
since: options.since,
|
|
351
|
+
until: options.until,
|
|
352
|
+
riskLevel: options.riskLevel,
|
|
353
|
+
});
|
|
354
|
+
return JSON.stringify(records, null, 2);
|
|
355
|
+
}
|
|
356
|
+
case 'jsonl':
|
|
357
|
+
return exporter.exportJsonLines(options);
|
|
358
|
+
case 'csv':
|
|
359
|
+
return exporter.exportCsv(options);
|
|
360
|
+
case 'cef':
|
|
361
|
+
return exporter.exportCef(options);
|
|
362
|
+
default:
|
|
363
|
+
throw new Error(`Unsupported export format: ${format}`);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
//# sourceMappingURL=exporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exporter.js","sourceRoot":"","sources":["../../src/audit/exporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit Logger for Tollgate
|
|
3
|
+
*
|
|
4
|
+
* Logs all tool invocations and session grants to SQLite database
|
|
5
|
+
* for compliance, debugging, and analytics.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Schema versioning with automatic migrations
|
|
9
|
+
* - PII redaction for compliance (GDPR, SOC2)
|
|
10
|
+
* - Enhanced metadata for security analysis
|
|
11
|
+
*/
|
|
12
|
+
import { type AuditRecord, type SessionGrantRecord, type RiskLevel } from './schema.js';
|
|
13
|
+
import type { ToolCallContext, PolicyDecision } from '../policy/types.js';
|
|
14
|
+
import type { ApprovalResult } from '../approval/types.js';
|
|
15
|
+
import type { SessionGrant } from '../session/types.js';
|
|
16
|
+
import { type RedactionOptions } from './redaction.js';
|
|
17
|
+
/**
|
|
18
|
+
* Options for the AuditLogger.
|
|
19
|
+
*/
|
|
20
|
+
export interface AuditLoggerOptions {
|
|
21
|
+
/** Path to the SQLite database file */
|
|
22
|
+
dbPath?: string;
|
|
23
|
+
/** Enable PII redaction (default: true) */
|
|
24
|
+
enableRedaction?: boolean;
|
|
25
|
+
/** PII redaction options */
|
|
26
|
+
redactionOptions?: RedactionOptions;
|
|
27
|
+
/**
|
|
28
|
+
* Store raw (unredacted) args in the database.
|
|
29
|
+
* WARNING: Setting this to true stores PII in the database, which may
|
|
30
|
+
* violate compliance requirements (GDPR, SOC2, HIPAA). Only enable for
|
|
31
|
+
* debugging in non-production environments.
|
|
32
|
+
* Default: false
|
|
33
|
+
*/
|
|
34
|
+
storeRawArgs?: boolean;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* AuditLogger records all tool calls and session grants to SQLite.
|
|
38
|
+
*
|
|
39
|
+
* Uses WAL mode for concurrent access and prepared statements for performance.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```typescript
|
|
43
|
+
* const logger = new AuditLogger();
|
|
44
|
+
*
|
|
45
|
+
* // Log a tool call attempt
|
|
46
|
+
* const id = logger.logAttempt(context, decision);
|
|
47
|
+
*
|
|
48
|
+
* // Later, log the result
|
|
49
|
+
* logger.logResult(id, 'approved', 'success', undefined, 150);
|
|
50
|
+
*
|
|
51
|
+
* // Log a session grant
|
|
52
|
+
* logger.logSessionGrant(grant);
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export declare class AuditLogger {
|
|
56
|
+
private db;
|
|
57
|
+
private insertToolCallStmt;
|
|
58
|
+
private updateToolCallStmt;
|
|
59
|
+
private insertSessionGrantStmt;
|
|
60
|
+
private updateSessionGrantUsageStmt;
|
|
61
|
+
private redactor;
|
|
62
|
+
private enableRedaction;
|
|
63
|
+
private storeRawArgs;
|
|
64
|
+
constructor(optionsOrPath?: string | AuditLoggerOptions);
|
|
65
|
+
/**
|
|
66
|
+
* Initializes the database schema with version tracking and migrations.
|
|
67
|
+
*/
|
|
68
|
+
private initializeSchema;
|
|
69
|
+
/**
|
|
70
|
+
* Applies migration to version 2 (compliance fields).
|
|
71
|
+
*/
|
|
72
|
+
private applyMigrationV2;
|
|
73
|
+
/**
|
|
74
|
+
* Logs a tool call attempt.
|
|
75
|
+
*
|
|
76
|
+
* @param context - The tool call context
|
|
77
|
+
* @param decision - The policy decision
|
|
78
|
+
* @param sessionGrantId - ID of session grant that authorized this call (if any)
|
|
79
|
+
* @param metadata - Additional metadata for the audit record
|
|
80
|
+
* @returns The generated audit record ID
|
|
81
|
+
*/
|
|
82
|
+
logAttempt(context: ToolCallContext, decision: PolicyDecision, sessionGrantId?: string, metadata?: {
|
|
83
|
+
correlationId?: string;
|
|
84
|
+
clientId?: string;
|
|
85
|
+
}): string;
|
|
86
|
+
/**
|
|
87
|
+
* Updates a tool call record with the final result.
|
|
88
|
+
*
|
|
89
|
+
* @param id - The audit record ID from logAttempt
|
|
90
|
+
* @param userDecision - The user's approval decision (if prompted)
|
|
91
|
+
* @param result - Whether the tool call succeeded or failed
|
|
92
|
+
* @param errorMessage - Error message (if result is 'error')
|
|
93
|
+
* @param durationMs - Total duration of the tool call
|
|
94
|
+
*/
|
|
95
|
+
logResult(id: string, userDecision: ApprovalResult | null, result: 'success' | 'error', errorMessage?: string, durationMs?: number): void;
|
|
96
|
+
/**
|
|
97
|
+
* Logs a new session grant.
|
|
98
|
+
*
|
|
99
|
+
* @param grant - The session grant to log
|
|
100
|
+
*/
|
|
101
|
+
logSessionGrant(grant: SessionGrant): void;
|
|
102
|
+
/**
|
|
103
|
+
* Increments the usage count for a session grant.
|
|
104
|
+
*
|
|
105
|
+
* @param grantId - The session grant ID
|
|
106
|
+
*/
|
|
107
|
+
logSessionGrantUsage(grantId: string): void;
|
|
108
|
+
/**
|
|
109
|
+
* Marks a session grant as revoked.
|
|
110
|
+
*
|
|
111
|
+
* @param grantId - The session grant ID
|
|
112
|
+
* @param revokedBy - Who revoked it (e.g., 'user', 'timeout', 'policy')
|
|
113
|
+
*/
|
|
114
|
+
revokeSessionGrant(grantId: string, revokedBy: string): void;
|
|
115
|
+
/**
|
|
116
|
+
* Gets recent tool calls with optional filtering.
|
|
117
|
+
*/
|
|
118
|
+
getRecentCalls(limitOrOptions?: number | {
|
|
119
|
+
limit?: number;
|
|
120
|
+
server?: string;
|
|
121
|
+
since?: Date;
|
|
122
|
+
until?: Date;
|
|
123
|
+
riskLevel?: RiskLevel;
|
|
124
|
+
includeRedacted?: boolean;
|
|
125
|
+
}): AuditRecord[];
|
|
126
|
+
/**
|
|
127
|
+
* Gets active session grants for a server.
|
|
128
|
+
*
|
|
129
|
+
* @param server - Server name to filter by (optional)
|
|
130
|
+
* @returns Array of active grants
|
|
131
|
+
*/
|
|
132
|
+
getActiveSessionGrants(server?: string): SessionGrantRecord[];
|
|
133
|
+
/**
|
|
134
|
+
* Gets aggregate statistics for tool calls.
|
|
135
|
+
*/
|
|
136
|
+
getStats(): {
|
|
137
|
+
total: number;
|
|
138
|
+
allowed: number;
|
|
139
|
+
denied: number;
|
|
140
|
+
prompted: number;
|
|
141
|
+
sessionAuthorized: number;
|
|
142
|
+
};
|
|
143
|
+
/**
|
|
144
|
+
* Gets session grant statistics.
|
|
145
|
+
*/
|
|
146
|
+
getSessionStats(): {
|
|
147
|
+
totalGrants: number;
|
|
148
|
+
activeGrants: number;
|
|
149
|
+
expiredGrants: number;
|
|
150
|
+
revokedGrants: number;
|
|
151
|
+
totalUsage: number;
|
|
152
|
+
};
|
|
153
|
+
/** Closes the database connection. */
|
|
154
|
+
close(): void;
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/audit/logger.ts"],"names":[],"mappings":"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"}
|