@grc-claw/ingest 2.0.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/dist/cloud-severity.d.ts +5 -0
- package/dist/cloud-severity.d.ts.map +1 -0
- package/dist/cloud-severity.js +21 -0
- package/dist/cloud-severity.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/normalizers/cloud.d.ts +15 -0
- package/dist/normalizers/cloud.d.ts.map +1 -0
- package/dist/normalizers/cloud.js +136 -0
- package/dist/normalizers/cloud.js.map +1 -0
- package/dist/normalizers/elastic.d.ts +12 -0
- package/dist/normalizers/elastic.d.ts.map +1 -0
- package/dist/normalizers/elastic.js +39 -0
- package/dist/normalizers/elastic.js.map +1 -0
- package/dist/normalizers/snort.d.ts +16 -0
- package/dist/normalizers/snort.d.ts.map +1 -0
- package/dist/normalizers/snort.js +23 -0
- package/dist/normalizers/snort.js.map +1 -0
- package/dist/normalizers/suricata.d.ts +19 -0
- package/dist/normalizers/suricata.d.ts.map +1 -0
- package/dist/normalizers/suricata.js +27 -0
- package/dist/normalizers/suricata.js.map +1 -0
- package/dist/normalizers/ufw.d.ts +3 -0
- package/dist/normalizers/ufw.d.ts.map +1 -0
- package/dist/normalizers/ufw.js +26 -0
- package/dist/normalizers/ufw.js.map +1 -0
- package/dist/normalizers/wazuh.d.ts +18 -0
- package/dist/normalizers/wazuh.d.ts.map +1 -0
- package/dist/normalizers/wazuh.js +27 -0
- package/dist/normalizers/wazuh.js.map +1 -0
- package/dist/severity.d.ts +6 -0
- package/dist/severity.d.ts.map +1 -0
- package/dist/severity.js +34 -0
- package/dist/severity.js.map +1 -0
- package/dist/uuid.d.ts +3 -0
- package/dist/uuid.d.ts.map +1 -0
- package/dist/uuid.js +8 -0
- package/dist/uuid.js.map +1 -0
- package/package.json +34 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-severity.d.ts","sourceRoot":"","sources":["../src/cloud-severity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CAMnE;AAED,wBAAwB;AACxB,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAKtD"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export function labelToSeverity(label) {
|
|
2
|
+
const v = (label ?? 'low').toUpperCase();
|
|
3
|
+
if (v.includes('CRIT'))
|
|
4
|
+
return 'critical';
|
|
5
|
+
if (v === 'HIGH' || v === '4')
|
|
6
|
+
return 'high';
|
|
7
|
+
if (v === 'MEDIUM' || v === '3')
|
|
8
|
+
return 'medium';
|
|
9
|
+
return 'low';
|
|
10
|
+
}
|
|
11
|
+
/** GuardDuty 0.1–8.0 */
|
|
12
|
+
export function guardDutyScore(score) {
|
|
13
|
+
if (score >= 7)
|
|
14
|
+
return 'critical';
|
|
15
|
+
if (score >= 4)
|
|
16
|
+
return 'high';
|
|
17
|
+
if (score >= 2)
|
|
18
|
+
return 'medium';
|
|
19
|
+
return 'low';
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=cloud-severity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-severity.js","sourceRoot":"","sources":["../src/cloud-severity.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,CAAC,KAAyB;IACvD,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACzC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,UAAU,CAAC;IAC1C,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,MAAM,CAAC;IAC7C,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,QAAQ,CAAC;IACjD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,wBAAwB;AACxB,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,UAAU,CAAC;IAClC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IAC9B,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC;IAChC,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export * from './severity.js';
|
|
2
|
+
export * from './cloud-severity.js';
|
|
3
|
+
export * from './uuid.js';
|
|
4
|
+
export { normalizeWazuh, type WazuhAlert } from './normalizers/wazuh.js';
|
|
5
|
+
export { normalizeSuricata, type SuricataEveAlert } from './normalizers/suricata.js';
|
|
6
|
+
export { normalizeSnort, type SnortAlertJson } from './normalizers/snort.js';
|
|
7
|
+
export { normalizeElastic, type ElasticAlertDoc } from './normalizers/elastic.js';
|
|
8
|
+
export { normalizeUfwLine } from './normalizers/ufw.js';
|
|
9
|
+
export { normalizeCloud, normalizeAwsGuardDuty, normalizeAzureSentinel, normalizeGcpChronicle, CLOUD_INGEST_SOURCES, type CloudIngestSource, } from './normalizers/cloud.js';
|
|
10
|
+
import type { SecurityEventCanonical } from '@grc-claw/core';
|
|
11
|
+
import { type CloudIngestSource } from './normalizers/cloud.js';
|
|
12
|
+
export type OssIngestSource = 'wazuh' | 'suricata' | 'snort' | 'elastic' | 'ufw';
|
|
13
|
+
export type IngestSource = OssIngestSource | CloudIngestSource;
|
|
14
|
+
export declare function isCloudSource(source: string): source is CloudIngestSource;
|
|
15
|
+
export declare function normalizeBySource(source: IngestSource, payload: unknown, tenantId: number): SecurityEventCanonical | null;
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,KAAK,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,KAAK,iBAAiB,GACvB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,wBAAwB,CAAC;AAOhC,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,CAAC;AACjF,MAAM,MAAM,YAAY,GAAG,eAAe,GAAG,iBAAiB,CAAC;AAE/D,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,IAAI,iBAAiB,CAEzE;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,GACf,sBAAsB,GAAG,IAAI,CAkB/B"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export * from './severity.js';
|
|
2
|
+
export * from './cloud-severity.js';
|
|
3
|
+
export * from './uuid.js';
|
|
4
|
+
export { normalizeWazuh } from './normalizers/wazuh.js';
|
|
5
|
+
export { normalizeSuricata } from './normalizers/suricata.js';
|
|
6
|
+
export { normalizeSnort } from './normalizers/snort.js';
|
|
7
|
+
export { normalizeElastic } from './normalizers/elastic.js';
|
|
8
|
+
export { normalizeUfwLine } from './normalizers/ufw.js';
|
|
9
|
+
export { normalizeCloud, normalizeAwsGuardDuty, normalizeAzureSentinel, normalizeGcpChronicle, CLOUD_INGEST_SOURCES, } from './normalizers/cloud.js';
|
|
10
|
+
import { CLOUD_INGEST_SOURCES, normalizeCloud, } from './normalizers/cloud.js';
|
|
11
|
+
import { normalizeElastic } from './normalizers/elastic.js';
|
|
12
|
+
import { normalizeSnort } from './normalizers/snort.js';
|
|
13
|
+
import { normalizeSuricata } from './normalizers/suricata.js';
|
|
14
|
+
import { normalizeUfwLine } from './normalizers/ufw.js';
|
|
15
|
+
import { normalizeWazuh } from './normalizers/wazuh.js';
|
|
16
|
+
export function isCloudSource(source) {
|
|
17
|
+
return CLOUD_INGEST_SOURCES.includes(source);
|
|
18
|
+
}
|
|
19
|
+
export function normalizeBySource(source, payload, tenantId) {
|
|
20
|
+
if (isCloudSource(source)) {
|
|
21
|
+
return normalizeCloud(source, payload, tenantId);
|
|
22
|
+
}
|
|
23
|
+
switch (source) {
|
|
24
|
+
case 'wazuh':
|
|
25
|
+
return normalizeWazuh(payload, tenantId);
|
|
26
|
+
case 'suricata':
|
|
27
|
+
return normalizeSuricata(payload, tenantId);
|
|
28
|
+
case 'snort':
|
|
29
|
+
return normalizeSnort(payload, tenantId);
|
|
30
|
+
case 'elastic':
|
|
31
|
+
return normalizeElastic(payload, tenantId);
|
|
32
|
+
case 'ufw':
|
|
33
|
+
return typeof payload === 'string' ? normalizeUfwLine(payload, tenantId) : null;
|
|
34
|
+
default:
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAmB,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAyB,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,cAAc,EAAuB,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAwB,MAAM,0BAA0B,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,GAErB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,oBAAoB,EACpB,cAAc,GAEf,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAKxD,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,OAAQ,oBAA0C,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,MAAoB,EACpB,OAAgB,EAChB,QAAgB;IAEhB,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC;IACD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,OAAO;YACV,OAAO,cAAc,CAAC,OAA+C,EAAE,QAAQ,CAAC,CAAC;QACnF,KAAK,UAAU;YACb,OAAO,iBAAiB,CAAC,OAAkD,EAAE,QAAQ,CAAC,CAAC;QACzF,KAAK,OAAO;YACV,OAAO,cAAc,CAAC,OAA+C,EAAE,QAAQ,CAAC,CAAC;QACnF,KAAK,SAAS;YACZ,OAAO,gBAAgB,CAAC,OAAiD,EAAE,QAAQ,CAAC,CAAC;QACvF,KAAK,KAAK;YACR,OAAO,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAClF;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { SecurityEventCanonical } from '@grc-claw/core';
|
|
2
|
+
export declare function normalizeAwsGuardDuty(raw: Record<string, unknown>, tenantId: number): SecurityEventCanonical;
|
|
3
|
+
export declare function normalizeAwsCloudWatch(raw: Record<string, unknown>, tenantId: number): SecurityEventCanonical;
|
|
4
|
+
export declare function normalizeAwsSecurityHub(raw: Record<string, unknown>, tenantId: number): SecurityEventCanonical;
|
|
5
|
+
export declare function normalizeAwsCloudTrail(raw: Record<string, unknown>, tenantId: number): SecurityEventCanonical;
|
|
6
|
+
export declare function normalizeAzureSentinel(raw: Record<string, unknown>, tenantId: number): SecurityEventCanonical;
|
|
7
|
+
export declare function normalizeAzureDefender(raw: Record<string, unknown>, tenantId: number): SecurityEventCanonical;
|
|
8
|
+
export declare function normalizeAzureMonitor(raw: Record<string, unknown>, tenantId: number): SecurityEventCanonical;
|
|
9
|
+
export declare function normalizeGcpChronicle(raw: Record<string, unknown>, tenantId: number): SecurityEventCanonical;
|
|
10
|
+
export declare function normalizeGcpScc(raw: Record<string, unknown>, tenantId: number): SecurityEventCanonical;
|
|
11
|
+
export declare function normalizeGcpCloudLogging(raw: Record<string, unknown>, tenantId: number): SecurityEventCanonical;
|
|
12
|
+
export type CloudIngestSource = 'aws_cloudwatch' | 'aws_guardduty' | 'aws_securityhub' | 'aws_cloudtrail' | 'azure_sentinel' | 'azure_defender' | 'azure_monitor' | 'gcp_chronicle' | 'gcp_scc' | 'gcp_cloud_logging';
|
|
13
|
+
export declare function normalizeCloud(source: CloudIngestSource, payload: unknown, tenantId: number): SecurityEventCanonical | null;
|
|
14
|
+
export declare const CLOUD_INGEST_SOURCES: CloudIngestSource[];
|
|
15
|
+
//# sourceMappingURL=cloud.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../../src/normalizers/cloud.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AA8B7D,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,sBAAsB,CAU5G;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,sBAAsB,CAK7G;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,sBAAsB,CAQ9G;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,sBAAsB,CAM7G;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,sBAAsB,CAO7G;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,sBAAsB,CAK7G;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,sBAAsB,CAM5G;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,sBAAsB,CAW5G;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,sBAAsB,CAKtG;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,sBAAsB,CAK/G;AAED,MAAM,MAAM,iBAAiB,GACzB,gBAAgB,GAChB,eAAe,GACf,iBAAiB,GACjB,gBAAgB,GAChB,gBAAgB,GAChB,gBAAgB,GAChB,eAAe,GACf,eAAe,GACf,SAAS,GACT,mBAAmB,CAAC;AAExB,wBAAgB,cAAc,CAC5B,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,GACf,sBAAsB,GAAG,IAAI,CA2B/B;AAED,eAAO,MAAM,oBAAoB,EAAE,iBAAiB,EAWnD,CAAC"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { guardDutyScore, labelToSeverity } from '../cloud-severity.js';
|
|
2
|
+
import { stableEventUuid } from '../uuid.js';
|
|
3
|
+
function base(sourceSystem, eventType, severity, tenantId, message, uuidParts, extra = {}) {
|
|
4
|
+
const ts = String(extra['@timestamp'] ?? new Date().toISOString());
|
|
5
|
+
return {
|
|
6
|
+
eventUuid: stableEventUuid([sourceSystem, ...uuidParts]),
|
|
7
|
+
eventType,
|
|
8
|
+
severity,
|
|
9
|
+
sourceSystem,
|
|
10
|
+
tenantId,
|
|
11
|
+
eventData: {
|
|
12
|
+
'@timestamp': ts,
|
|
13
|
+
message,
|
|
14
|
+
rule: { category: 'cloud' },
|
|
15
|
+
raw: extra.raw,
|
|
16
|
+
...extra,
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export function normalizeAwsGuardDuty(raw, tenantId) {
|
|
21
|
+
const detail = raw.detail ?? raw;
|
|
22
|
+
const score = Number(detail.severity ?? 5);
|
|
23
|
+
const id = String(detail.id ?? detail.findingId ?? 'gd-unknown');
|
|
24
|
+
const type = String(detail.type ?? 'GuardDutyFinding');
|
|
25
|
+
return base('aws_guardduty', 'identity.compromise', guardDutyScore(score), tenantId, type, [
|
|
26
|
+
id,
|
|
27
|
+
type,
|
|
28
|
+
score,
|
|
29
|
+
], { raw, '@timestamp': detail.updatedAt });
|
|
30
|
+
}
|
|
31
|
+
export function normalizeAwsCloudWatch(raw, tenantId) {
|
|
32
|
+
const alarm = raw.alarmName ?? raw.AlarmName ?? 'CloudWatch alarm';
|
|
33
|
+
const state = String(raw.newStateValue ?? raw.state ?? 'ALARM');
|
|
34
|
+
const sev = state === 'ALARM' ? 'high' : 'low';
|
|
35
|
+
return base('aws_cloudwatch', 'host.anomaly', sev, tenantId, alarm, [alarm, state], { raw });
|
|
36
|
+
}
|
|
37
|
+
export function normalizeAwsSecurityHub(raw, tenantId) {
|
|
38
|
+
const finding = raw.Finding ?? raw;
|
|
39
|
+
const sev = labelToSeverity(String(finding.Severity?.Label ?? finding.Severity ?? 'LOW'));
|
|
40
|
+
const id = String(finding.Id ?? finding.id ?? 'sh-unknown');
|
|
41
|
+
const title = String(finding.Title ?? finding.description ?? 'Security Hub finding');
|
|
42
|
+
return base('aws_securityhub', 'cloud.misconfig', sev, tenantId, title, [id], { raw: finding });
|
|
43
|
+
}
|
|
44
|
+
export function normalizeAwsCloudTrail(raw, tenantId) {
|
|
45
|
+
const eventName = String(raw.eventName ?? raw.EventName ?? 'CloudTrailEvent');
|
|
46
|
+
const user = String(raw.userIdentity?.arn ?? raw.userName ?? '');
|
|
47
|
+
const sev = /Delete|PutBucketPolicy|AttachUserPolicy|CreateAccessKey/i.test(eventName) ? 'high' : 'medium';
|
|
48
|
+
return base('aws_cloudtrail', 'cloud.api', sev, tenantId, eventName, [eventName, user], { raw });
|
|
49
|
+
}
|
|
50
|
+
export function normalizeAzureSentinel(raw, tenantId) {
|
|
51
|
+
const props = raw.properties ?? raw;
|
|
52
|
+
const sev = labelToSeverity(String(props.severity ?? props.Severity ?? 'Low'));
|
|
53
|
+
const title = String(props.title ?? props.displayName ?? 'Sentinel incident');
|
|
54
|
+
const id = String(raw.id ?? props.incidentNumber ?? 'sentinel-unknown');
|
|
55
|
+
const eventType = /sign-?in|auth/i.test(title) ? 'auth.failure' : 'network.intrusion';
|
|
56
|
+
return base('azure_sentinel', eventType, sev, tenantId, title, [id], { raw: props });
|
|
57
|
+
}
|
|
58
|
+
export function normalizeAzureDefender(raw, tenantId) {
|
|
59
|
+
const props = raw.properties ?? raw;
|
|
60
|
+
const sev = labelToSeverity(String(props.severity ?? 'Medium'));
|
|
61
|
+
const title = String(props.alertDisplayName ?? props.title ?? 'Defender alert');
|
|
62
|
+
return base('azure_defender', 'cloud.misconfig', sev, tenantId, title, [title], { raw: props });
|
|
63
|
+
}
|
|
64
|
+
export function normalizeAzureMonitor(raw, tenantId) {
|
|
65
|
+
const data = raw.data ?? raw;
|
|
66
|
+
const essentials = data.essentials ?? data;
|
|
67
|
+
const sev = labelToSeverity(String(essentials.severity ?? 'Sev3'));
|
|
68
|
+
const alert = String(essentials.alertRule ?? essentials.alertId ?? 'Azure Monitor alert');
|
|
69
|
+
return base('azure_monitor', 'host.anomaly', sev, tenantId, alert, [alert], { raw: data });
|
|
70
|
+
}
|
|
71
|
+
export function normalizeGcpChronicle(raw, tenantId) {
|
|
72
|
+
const results = raw.security_result ?? [];
|
|
73
|
+
const first = results[0] ?? {};
|
|
74
|
+
const sev = labelToSeverity(String(first.severity ?? 'LOW'));
|
|
75
|
+
const summary = String(first.summary ?? first.description ?? 'Chronicle alert');
|
|
76
|
+
const principal = raw.principal;
|
|
77
|
+
const src = Array.isArray(principal?.ip) ? principal.ip[0] : principal?.ip;
|
|
78
|
+
return base('gcp_chronicle', 'network.intrusion', sev, tenantId, summary, [summary, src], {
|
|
79
|
+
raw,
|
|
80
|
+
source: src ? { ip: String(src) } : undefined,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
export function normalizeGcpScc(raw, tenantId) {
|
|
84
|
+
const finding = raw.finding ?? raw;
|
|
85
|
+
const sev = labelToSeverity(String(finding.severity ?? 'SEVERITY_UNSPECIFIED'));
|
|
86
|
+
const category = String(finding.category ?? 'SCC finding');
|
|
87
|
+
return base('gcp_scc', 'cloud.misconfig', sev, tenantId, category, [category], { raw: finding });
|
|
88
|
+
}
|
|
89
|
+
export function normalizeGcpCloudLogging(raw, tenantId) {
|
|
90
|
+
const proto = raw.protoPayload ?? raw;
|
|
91
|
+
const method = String(proto.methodName ?? proto.method ?? 'logging.event');
|
|
92
|
+
const sev = /delete|setIamPolicy/i.test(method) ? 'high' : 'medium';
|
|
93
|
+
return base('gcp_cloud_logging', 'cloud.api', sev, tenantId, method, [method], { raw: proto });
|
|
94
|
+
}
|
|
95
|
+
export function normalizeCloud(source, payload, tenantId) {
|
|
96
|
+
if (!payload || typeof payload !== 'object')
|
|
97
|
+
return null;
|
|
98
|
+
const raw = payload;
|
|
99
|
+
switch (source) {
|
|
100
|
+
case 'aws_guardduty':
|
|
101
|
+
return normalizeAwsGuardDuty(raw, tenantId);
|
|
102
|
+
case 'aws_cloudwatch':
|
|
103
|
+
return normalizeAwsCloudWatch(raw, tenantId);
|
|
104
|
+
case 'aws_securityhub':
|
|
105
|
+
return normalizeAwsSecurityHub(raw, tenantId);
|
|
106
|
+
case 'aws_cloudtrail':
|
|
107
|
+
return normalizeAwsCloudTrail(raw, tenantId);
|
|
108
|
+
case 'azure_sentinel':
|
|
109
|
+
return normalizeAzureSentinel(raw, tenantId);
|
|
110
|
+
case 'azure_defender':
|
|
111
|
+
return normalizeAzureDefender(raw, tenantId);
|
|
112
|
+
case 'azure_monitor':
|
|
113
|
+
return normalizeAzureMonitor(raw, tenantId);
|
|
114
|
+
case 'gcp_chronicle':
|
|
115
|
+
return normalizeGcpChronicle(raw, tenantId);
|
|
116
|
+
case 'gcp_scc':
|
|
117
|
+
return normalizeGcpScc(raw, tenantId);
|
|
118
|
+
case 'gcp_cloud_logging':
|
|
119
|
+
return normalizeGcpCloudLogging(raw, tenantId);
|
|
120
|
+
default:
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
export const CLOUD_INGEST_SOURCES = [
|
|
125
|
+
'aws_cloudwatch',
|
|
126
|
+
'aws_guardduty',
|
|
127
|
+
'aws_securityhub',
|
|
128
|
+
'aws_cloudtrail',
|
|
129
|
+
'azure_sentinel',
|
|
130
|
+
'azure_defender',
|
|
131
|
+
'azure_monitor',
|
|
132
|
+
'gcp_chronicle',
|
|
133
|
+
'gcp_scc',
|
|
134
|
+
'gcp_cloud_logging',
|
|
135
|
+
];
|
|
136
|
+
//# sourceMappingURL=cloud.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud.js","sourceRoot":"","sources":["../../src/normalizers/cloud.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SecurityEventCanonical } from '@grc-claw/core';
|
|
2
|
+
export interface ElasticAlertDoc {
|
|
3
|
+
'@timestamp'?: string;
|
|
4
|
+
'kibana.alert.rule.name'?: string;
|
|
5
|
+
'kibana.alert.severity'?: string;
|
|
6
|
+
'kibana.alert.uuid'?: string;
|
|
7
|
+
'source.ip'?: string;
|
|
8
|
+
'destination.ip'?: string;
|
|
9
|
+
'event.category'?: string[];
|
|
10
|
+
}
|
|
11
|
+
export declare function normalizeElastic(raw: ElasticAlertDoc, tenantId: number): SecurityEventCanonical;
|
|
12
|
+
//# sourceMappingURL=elastic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elastic.d.ts","sourceRoot":"","sources":["../../src/normalizers/elastic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAY,MAAM,gBAAgB,CAAC;AAGvE,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAUD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,sBAAsB,CA2B/F"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { stableEventUuid } from '../uuid.js';
|
|
2
|
+
function elasticSeverity(s) {
|
|
3
|
+
const v = (s ?? 'low').toLowerCase();
|
|
4
|
+
if (v === 'critical')
|
|
5
|
+
return 'critical';
|
|
6
|
+
if (v === 'high')
|
|
7
|
+
return 'high';
|
|
8
|
+
if (v === 'medium')
|
|
9
|
+
return 'medium';
|
|
10
|
+
return 'low';
|
|
11
|
+
}
|
|
12
|
+
export function normalizeElastic(raw, tenantId) {
|
|
13
|
+
const ts = raw['@timestamp'] ?? new Date().toISOString();
|
|
14
|
+
const ruleName = raw['kibana.alert.rule.name'] ?? 'Elastic alert';
|
|
15
|
+
const src = raw['source.ip'];
|
|
16
|
+
const dst = raw['destination.ip'];
|
|
17
|
+
const categories = raw['event.category'] ?? [];
|
|
18
|
+
const eventType = categories.includes('intrusion_detection')
|
|
19
|
+
? 'network.intrusion'
|
|
20
|
+
: categories.includes('authentication')
|
|
21
|
+
? 'auth.failure'
|
|
22
|
+
: 'host.anomaly';
|
|
23
|
+
return {
|
|
24
|
+
eventUuid: stableEventUuid(['elastic', ruleName, src, dst, ts, raw['kibana.alert.uuid']]),
|
|
25
|
+
eventType,
|
|
26
|
+
severity: elasticSeverity(raw['kibana.alert.severity']),
|
|
27
|
+
sourceSystem: 'elastic',
|
|
28
|
+
tenantId,
|
|
29
|
+
eventData: {
|
|
30
|
+
'@timestamp': ts,
|
|
31
|
+
message: ruleName,
|
|
32
|
+
source: src ? { ip: src } : undefined,
|
|
33
|
+
destination: dst ? { ip: dst } : undefined,
|
|
34
|
+
rule: { id: raw['kibana.alert.uuid'], name: ruleName, category: 'elastic' },
|
|
35
|
+
raw: raw,
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=elastic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elastic.js","sourceRoot":"","sources":["../../src/normalizers/elastic.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAY7C,SAAS,eAAe,CAAC,CAAU;IACjC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,CAAC,KAAK,UAAU;QAAE,OAAO,UAAU,CAAC;IACxC,IAAI,CAAC,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IAChC,IAAI,CAAC,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACpC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAoB,EAAE,QAAgB;IACrE,MAAM,EAAE,GAAG,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACzD,MAAM,QAAQ,GAAG,GAAG,CAAC,wBAAwB,CAAC,IAAI,eAAe,CAAC;IAClE,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC;IAC7B,MAAM,GAAG,GAAG,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAClC,MAAM,UAAU,GAAG,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;IAC/C,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QAC1D,CAAC,CAAC,mBAAmB;QACrB,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YACrC,CAAC,CAAC,cAAc;YAChB,CAAC,CAAC,cAAc,CAAC;IAErB,OAAO;QACL,SAAS,EAAE,eAAe,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;QACzF,SAAS;QACT,QAAQ,EAAE,eAAe,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACvD,YAAY,EAAE,SAAS;QACvB,QAAQ;QACR,SAAS,EAAE;YACT,YAAY,EAAE,EAAE;YAChB,OAAO,EAAE,QAAQ;YACjB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS;YACrC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS;YAC1C,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,mBAAmB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE;YAC3E,GAAG,EAAE,GAA8B;SACpC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { SecurityEventCanonical } from '@grc-claw/core';
|
|
2
|
+
export interface SnortAlertJson {
|
|
3
|
+
timestamp?: string;
|
|
4
|
+
msg?: string;
|
|
5
|
+
gid?: number;
|
|
6
|
+
sid?: number;
|
|
7
|
+
rev?: number;
|
|
8
|
+
priority?: number;
|
|
9
|
+
proto?: string;
|
|
10
|
+
src_addr?: string;
|
|
11
|
+
src_port?: number;
|
|
12
|
+
dst_addr?: string;
|
|
13
|
+
dst_port?: number;
|
|
14
|
+
}
|
|
15
|
+
export declare function normalizeSnort(raw: SnortAlertJson, tenantId: number): SecurityEventCanonical;
|
|
16
|
+
//# sourceMappingURL=snort.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snort.d.ts","sourceRoot":"","sources":["../../src/normalizers/snort.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAI7D,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,sBAAsB,CAoB5F"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { snortPriorityToSeverity } from '../severity.js';
|
|
2
|
+
import { stableEventUuid } from '../uuid.js';
|
|
3
|
+
export function normalizeSnort(raw, tenantId) {
|
|
4
|
+
const ruleId = `${raw.gid ?? 1}:${raw.sid ?? 0}:${raw.rev ?? 0}`;
|
|
5
|
+
const priority = raw.priority ?? 3;
|
|
6
|
+
const ts = raw.timestamp ?? new Date().toISOString();
|
|
7
|
+
return {
|
|
8
|
+
eventUuid: stableEventUuid(['snort', ruleId, raw.src_addr, raw.dst_addr, ts]),
|
|
9
|
+
eventType: 'network.intrusion',
|
|
10
|
+
severity: snortPriorityToSeverity(priority),
|
|
11
|
+
sourceSystem: 'snort',
|
|
12
|
+
tenantId,
|
|
13
|
+
eventData: {
|
|
14
|
+
'@timestamp': ts,
|
|
15
|
+
message: raw.msg ?? 'Snort alert',
|
|
16
|
+
source: raw.src_addr ? { ip: raw.src_addr, port: raw.src_port ?? 0 } : undefined,
|
|
17
|
+
destination: raw.dst_addr ? { ip: raw.dst_addr, port: raw.dst_port ?? 0 } : undefined,
|
|
18
|
+
rule: { id: ruleId, name: raw.msg, category: 'snort' },
|
|
19
|
+
raw: raw,
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=snort.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snort.js","sourceRoot":"","sources":["../../src/normalizers/snort.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAgB7C,MAAM,UAAU,cAAc,CAAC,GAAmB,EAAE,QAAgB;IAClE,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;IACjE,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErD,OAAO;QACL,SAAS,EAAE,eAAe,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC7E,SAAS,EAAE,mBAAmB;QAC9B,QAAQ,EAAE,uBAAuB,CAAC,QAAQ,CAAC;QAC3C,YAAY,EAAE,OAAO;QACrB,QAAQ;QACR,SAAS,EAAE;YACT,YAAY,EAAE,EAAE;YAChB,OAAO,EAAE,GAAG,CAAC,GAAG,IAAI,aAAa;YACjC,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;YAChF,WAAW,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;YACrF,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE;YACtD,GAAG,EAAE,GAA8B;SACpC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { SecurityEventCanonical } from '@grc-claw/core';
|
|
2
|
+
export interface SuricataEveAlert {
|
|
3
|
+
timestamp?: string;
|
|
4
|
+
event_type?: string;
|
|
5
|
+
src_ip?: string;
|
|
6
|
+
src_port?: number;
|
|
7
|
+
dest_ip?: string;
|
|
8
|
+
dest_port?: number;
|
|
9
|
+
proto?: string;
|
|
10
|
+
alert?: {
|
|
11
|
+
signature_id?: number;
|
|
12
|
+
signature?: string;
|
|
13
|
+
severity?: number;
|
|
14
|
+
category?: string;
|
|
15
|
+
};
|
|
16
|
+
flow_id?: number;
|
|
17
|
+
}
|
|
18
|
+
export declare function normalizeSuricata(raw: SuricataEveAlert, tenantId: number): SecurityEventCanonical;
|
|
19
|
+
//# sourceMappingURL=suricata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suricata.d.ts","sourceRoot":"","sources":["../../src/normalizers/suricata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAI7D,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE;QACN,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,GAAG,sBAAsB,CAwBjG"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { suricataSeverityToSeverity } from '../severity.js';
|
|
2
|
+
import { stableEventUuid } from '../uuid.js';
|
|
3
|
+
export function normalizeSuricata(raw, tenantId) {
|
|
4
|
+
const sev = raw.alert?.severity ?? 3;
|
|
5
|
+
const sigId = String(raw.alert?.signature_id ?? 0);
|
|
6
|
+
const ts = raw.timestamp ?? new Date().toISOString();
|
|
7
|
+
return {
|
|
8
|
+
eventUuid: stableEventUuid(['suricata', sigId, raw.src_ip, raw.dest_ip, ts, raw.flow_id]),
|
|
9
|
+
eventType: 'network.intrusion',
|
|
10
|
+
severity: suricataSeverityToSeverity(sev),
|
|
11
|
+
sourceSystem: 'suricata',
|
|
12
|
+
tenantId,
|
|
13
|
+
eventData: {
|
|
14
|
+
'@timestamp': ts,
|
|
15
|
+
message: raw.alert?.signature ?? 'Suricata alert',
|
|
16
|
+
source: raw.src_ip ? { ip: raw.src_ip, port: raw.src_port ?? 0 } : undefined,
|
|
17
|
+
destination: raw.dest_ip ? { ip: raw.dest_ip, port: raw.dest_port ?? 0 } : undefined,
|
|
18
|
+
rule: {
|
|
19
|
+
id: sigId,
|
|
20
|
+
name: raw.alert?.signature,
|
|
21
|
+
category: raw.alert?.category,
|
|
22
|
+
},
|
|
23
|
+
raw: raw,
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=suricata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suricata.js","sourceRoot":"","sources":["../../src/normalizers/suricata.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAmB7C,MAAM,UAAU,iBAAiB,CAAC,GAAqB,EAAE,QAAgB;IACvE,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,EAAE,QAAQ,IAAI,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,IAAI,CAAC,CAAC,CAAC;IACnD,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErD,OAAO;QACL,SAAS,EAAE,eAAe,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACzF,SAAS,EAAE,mBAAmB;QAC9B,QAAQ,EAAE,0BAA0B,CAAC,GAAG,CAAC;QACzC,YAAY,EAAE,UAAU;QACxB,QAAQ;QACR,SAAS,EAAE;YACT,YAAY,EAAE,EAAE;YAChB,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,SAAS,IAAI,gBAAgB;YACjD,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;YAC5E,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;YACpF,IAAI,EAAE;gBACJ,EAAE,EAAE,KAAK;gBACT,IAAI,EAAE,GAAG,CAAC,KAAK,EAAE,SAAS;gBAC1B,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ;aAC9B;YACD,GAAG,EAAE,GAA8B;SACpC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ufw.d.ts","sourceRoot":"","sources":["../../src/normalizers/ufw.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAO7D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,sBAAsB,GAAG,IAAI,CAqB9F"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { firewallActionToSeverity } from '../severity.js';
|
|
2
|
+
import { stableEventUuid } from '../uuid.js';
|
|
3
|
+
const UFW_RE = /\[UFW\s+(?<action>BLOCK|ALLOW|AUDIT)[^\]]*\].*SRC=(?<src>[\d.]+).*DST=(?<dst>[\d.]+).*PROTO=(?<proto>\w+)(?:.*DPT=(?<dpt>\d+))?/;
|
|
4
|
+
export function normalizeUfwLine(line, tenantId) {
|
|
5
|
+
const m = line.match(UFW_RE);
|
|
6
|
+
if (!m?.groups)
|
|
7
|
+
return null;
|
|
8
|
+
const { action, src, dst, proto, dpt } = m.groups;
|
|
9
|
+
const ts = new Date().toISOString();
|
|
10
|
+
return {
|
|
11
|
+
eventUuid: stableEventUuid(['ufw', action, src, dst, proto, dpt, line.slice(0, 80)]),
|
|
12
|
+
eventType: 'firewall.block',
|
|
13
|
+
severity: firewallActionToSeverity(action),
|
|
14
|
+
sourceSystem: 'ufw',
|
|
15
|
+
tenantId,
|
|
16
|
+
eventData: {
|
|
17
|
+
'@timestamp': ts,
|
|
18
|
+
message: line.trim(),
|
|
19
|
+
source: { ip: src },
|
|
20
|
+
destination: { ip: dst, port: dpt ? Number(dpt) : 0 },
|
|
21
|
+
rule: { category: 'firewall', name: `UFW ${action}` },
|
|
22
|
+
raw: { line },
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=ufw.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ufw.js","sourceRoot":"","sources":["../../src/normalizers/ufw.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,MAAM,GACV,iIAAiI,CAAC;AAEpI,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,QAAgB;IAC7D,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7B,IAAI,CAAC,CAAC,EAAE,MAAM;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC;IAClD,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAEpC,OAAO;QACL,SAAS,EAAE,eAAe,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACpF,SAAS,EAAE,gBAAgB;QAC3B,QAAQ,EAAE,wBAAwB,CAAC,MAAM,CAAC;QAC1C,YAAY,EAAE,KAAK;QACnB,QAAQ;QACR,SAAS,EAAE;YACT,YAAY,EAAE,EAAE;YAChB,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;YACpB,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;YACnB,WAAW,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;YACrD,IAAI,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,MAAM,EAAE,EAAE;YACrD,GAAG,EAAE,EAAE,IAAI,EAAE;SACd;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { SecurityEventCanonical } from '@grc-claw/core';
|
|
2
|
+
export interface WazuhAlert {
|
|
3
|
+
rule?: {
|
|
4
|
+
id?: string | number;
|
|
5
|
+
level?: number;
|
|
6
|
+
description?: string;
|
|
7
|
+
};
|
|
8
|
+
data?: {
|
|
9
|
+
srcip?: string;
|
|
10
|
+
dstip?: string;
|
|
11
|
+
srcport?: string;
|
|
12
|
+
dstport?: string;
|
|
13
|
+
};
|
|
14
|
+
timestamp?: string;
|
|
15
|
+
id?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function normalizeWazuh(raw: WazuhAlert, tenantId: number): SecurityEventCanonical;
|
|
18
|
+
//# sourceMappingURL=wazuh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wazuh.d.ts","sourceRoot":"","sources":["../../src/normalizers/wazuh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAI7D,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,sBAAsB,CAwBxF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { wazuhLevelToSeverity } from '../severity.js';
|
|
2
|
+
import { stableEventUuid } from '../uuid.js';
|
|
3
|
+
export function normalizeWazuh(raw, tenantId) {
|
|
4
|
+
const level = Number(raw.rule?.level ?? 5);
|
|
5
|
+
const ruleId = String(raw.rule?.id ?? '0');
|
|
6
|
+
const src = raw.data?.srcip;
|
|
7
|
+
const dst = raw.data?.dstip;
|
|
8
|
+
const ts = raw.timestamp ?? new Date().toISOString();
|
|
9
|
+
const eventType = level >= 10 ? 'auth.failure' : 'host.anomaly';
|
|
10
|
+
return {
|
|
11
|
+
eventUuid: stableEventUuid(['wazuh', ruleId, src, dst, ts, raw.id]),
|
|
12
|
+
eventType,
|
|
13
|
+
severity: wazuhLevelToSeverity(level),
|
|
14
|
+
sourceSystem: 'wazuh',
|
|
15
|
+
tenantId,
|
|
16
|
+
eventData: {
|
|
17
|
+
'@timestamp': ts,
|
|
18
|
+
message: raw.rule?.description ?? 'Wazuh alert',
|
|
19
|
+
host: {},
|
|
20
|
+
source: src ? { ip: src, port: Number(raw.data?.srcport) || undefined } : undefined,
|
|
21
|
+
destination: dst ? { ip: dst, port: Number(raw.data?.dstport) || undefined } : undefined,
|
|
22
|
+
rule: { id: ruleId, name: raw.rule?.description, category: 'wazuh' },
|
|
23
|
+
raw: raw,
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=wazuh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wazuh.js","sourceRoot":"","sources":["../../src/normalizers/wazuh.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAS7C,MAAM,UAAU,cAAc,CAAC,GAAe,EAAE,QAAgB;IAC9D,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,GAAG,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC;IAC5B,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC;IAC5B,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrD,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC;IAEhE,OAAO;QACL,SAAS,EAAE,eAAe,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACnE,SAAS;QACT,QAAQ,EAAE,oBAAoB,CAAC,KAAK,CAAC;QACrC,YAAY,EAAE,OAAO;QACrB,QAAQ;QACR,SAAS,EAAE;YACT,YAAY,EAAE,EAAE;YAChB,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,WAAW,IAAI,aAAa;YAC/C,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS;YACnF,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS;YACxF,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE;YACpE,GAAG,EAAE,GAA8B;SACpC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Severity } from '@grc-claw/core';
|
|
2
|
+
export declare function wazuhLevelToSeverity(level: number): Severity;
|
|
3
|
+
export declare function suricataSeverityToSeverity(sev: number): Severity;
|
|
4
|
+
export declare function snortPriorityToSeverity(priority: number): Severity;
|
|
5
|
+
export declare function firewallActionToSeverity(action: string): Severity;
|
|
6
|
+
//# sourceMappingURL=severity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"severity.d.ts","sourceRoot":"","sources":["../src/severity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAK5D;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAKhE;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAKlE;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAIjE"}
|
package/dist/severity.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export function wazuhLevelToSeverity(level) {
|
|
2
|
+
if (level >= 12)
|
|
3
|
+
return 'critical';
|
|
4
|
+
if (level >= 8)
|
|
5
|
+
return 'high';
|
|
6
|
+
if (level >= 5)
|
|
7
|
+
return 'medium';
|
|
8
|
+
return 'low';
|
|
9
|
+
}
|
|
10
|
+
export function suricataSeverityToSeverity(sev) {
|
|
11
|
+
if (sev <= 1)
|
|
12
|
+
return 'critical';
|
|
13
|
+
if (sev === 2)
|
|
14
|
+
return 'high';
|
|
15
|
+
if (sev === 3)
|
|
16
|
+
return 'medium';
|
|
17
|
+
return 'low';
|
|
18
|
+
}
|
|
19
|
+
export function snortPriorityToSeverity(priority) {
|
|
20
|
+
if (priority <= 1)
|
|
21
|
+
return 'critical';
|
|
22
|
+
if (priority === 2)
|
|
23
|
+
return 'high';
|
|
24
|
+
if (priority === 3)
|
|
25
|
+
return 'medium';
|
|
26
|
+
return 'low';
|
|
27
|
+
}
|
|
28
|
+
export function firewallActionToSeverity(action) {
|
|
29
|
+
const a = action.toUpperCase();
|
|
30
|
+
if (a.includes('BLOCK') || a.includes('DROP') || a.includes('REJECT'))
|
|
31
|
+
return 'medium';
|
|
32
|
+
return 'low';
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=severity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"severity.js","sourceRoot":"","sources":["../src/severity.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,UAAU,CAAC;IACnC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IAC9B,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC;IAChC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,GAAW;IACpD,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,UAAU,CAAC;IAChC,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAC7B,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC/B,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,QAAgB;IACtD,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,UAAU,CAAC;IACrC,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IACpC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,MAAc;IACrD,MAAM,CAAC,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAC/B,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IACvF,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/uuid.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uuid.d.ts","sourceRoot":"","sources":["../src/uuid.ts"],"names":[],"mappings":"AAEA,+DAA+D;AAC/D,wBAAgB,eAAe,CAAC,KAAK,EAAE,CAAC,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,EAAE,GAAG,MAAM,CAI9E"}
|
package/dist/uuid.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
/** Stable id for dedupe on retry (ingest-oss-siem-ids-logs) */
|
|
3
|
+
export function stableEventUuid(parts) {
|
|
4
|
+
const payload = parts.filter((p) => p !== undefined && p !== '').join('|');
|
|
5
|
+
const hash = createHash('sha256').update(payload).digest('hex').slice(0, 32);
|
|
6
|
+
return `${hash.slice(0, 8)}-${hash.slice(8, 12)}-${hash.slice(12, 16)}-${hash.slice(16, 20)}-${hash.slice(20, 32)}`;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=uuid.js.map
|
package/dist/uuid.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uuid.js","sourceRoot":"","sources":["../src/uuid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,+DAA+D;AAC/D,MAAM,UAAU,eAAe,CAAC,KAAsC;IACpE,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3E,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7E,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;AACtH,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@grc-claw/ingest",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"description": "OSS SIEM/IDS/firewall log normalizers (ingest-oss-siem-ids-logs)",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc -p tsconfig.json",
|
|
17
|
+
"test": "npm run build && tsc -p tsconfig.test.json && node --test dist-test/comprehensive.test.js dist-test/cloud-integration.test.js"
|
|
18
|
+
},
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"@grc-claw/core": "*"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@grc-claw/agent-runtime": "*",
|
|
24
|
+
"@grc-claw/a2z-connector": "*",
|
|
25
|
+
"@grc-claw/evidence": "*",
|
|
26
|
+
"@grc-claw/frameworks": "*"
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"dist"
|
|
30
|
+
],
|
|
31
|
+
"publishConfig": {
|
|
32
|
+
"access": "public"
|
|
33
|
+
}
|
|
34
|
+
}
|