@grc-claw/ingest 0.8.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.
Files changed (41) hide show
  1. package/dist/cloud-severity.d.ts +5 -0
  2. package/dist/cloud-severity.d.ts.map +1 -0
  3. package/dist/cloud-severity.js +21 -0
  4. package/dist/cloud-severity.js.map +1 -0
  5. package/dist/index.d.ts +16 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +38 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/normalizers/cloud.d.ts +15 -0
  10. package/dist/normalizers/cloud.d.ts.map +1 -0
  11. package/dist/normalizers/cloud.js +136 -0
  12. package/dist/normalizers/cloud.js.map +1 -0
  13. package/dist/normalizers/elastic.d.ts +12 -0
  14. package/dist/normalizers/elastic.d.ts.map +1 -0
  15. package/dist/normalizers/elastic.js +39 -0
  16. package/dist/normalizers/elastic.js.map +1 -0
  17. package/dist/normalizers/snort.d.ts +16 -0
  18. package/dist/normalizers/snort.d.ts.map +1 -0
  19. package/dist/normalizers/snort.js +23 -0
  20. package/dist/normalizers/snort.js.map +1 -0
  21. package/dist/normalizers/suricata.d.ts +19 -0
  22. package/dist/normalizers/suricata.d.ts.map +1 -0
  23. package/dist/normalizers/suricata.js +27 -0
  24. package/dist/normalizers/suricata.js.map +1 -0
  25. package/dist/normalizers/ufw.d.ts +3 -0
  26. package/dist/normalizers/ufw.d.ts.map +1 -0
  27. package/dist/normalizers/ufw.js +26 -0
  28. package/dist/normalizers/ufw.js.map +1 -0
  29. package/dist/normalizers/wazuh.d.ts +18 -0
  30. package/dist/normalizers/wazuh.d.ts.map +1 -0
  31. package/dist/normalizers/wazuh.js +27 -0
  32. package/dist/normalizers/wazuh.js.map +1 -0
  33. package/dist/severity.d.ts +6 -0
  34. package/dist/severity.d.ts.map +1 -0
  35. package/dist/severity.js +34 -0
  36. package/dist/severity.js.map +1 -0
  37. package/dist/uuid.d.ts +3 -0
  38. package/dist/uuid.d.ts.map +1 -0
  39. package/dist/uuid.js +8 -0
  40. package/dist/uuid.js.map +1 -0
  41. package/package.json +38 -0
@@ -0,0 +1,5 @@
1
+ import type { Severity } from '@grc-claw/core';
2
+ export declare function labelToSeverity(label: string | undefined): Severity;
3
+ /** GuardDuty 0.1–8.0 */
4
+ export declare function guardDutyScore(score: number): Severity;
5
+ //# sourceMappingURL=cloud-severity.d.ts.map
@@ -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"}
@@ -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,3 @@
1
+ import type { SecurityEventCanonical } from '@grc-claw/core';
2
+ export declare function normalizeUfwLine(line: string, tenantId: number): SecurityEventCanonical | null;
3
+ //# sourceMappingURL=ufw.d.ts.map
@@ -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"}
@@ -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,3 @@
1
+ /** Stable id for dedupe on retry (ingest-oss-siem-ids-logs) */
2
+ export declare function stableEventUuid(parts: (string | number | undefined)[]): string;
3
+ //# sourceMappingURL=uuid.d.ts.map
@@ -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
@@ -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,38 @@
1
+ {
2
+ "name": "@grc-claw/ingest",
3
+ "version": "0.8.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
+ "repository": {
35
+ "type": "git",
36
+ "url": "https://github.com/AAH20/GRC_Claw"
37
+ }
38
+ }