@panguard-ai/security-hardening 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.
Files changed (77) hide show
  1. package/dist/audit/audit-logger.d.ts +44 -0
  2. package/dist/audit/audit-logger.d.ts.map +1 -0
  3. package/dist/audit/audit-logger.js +94 -0
  4. package/dist/audit/audit-logger.js.map +1 -0
  5. package/dist/audit/index.d.ts +9 -0
  6. package/dist/audit/index.d.ts.map +1 -0
  7. package/dist/audit/index.js +9 -0
  8. package/dist/audit/index.js.map +1 -0
  9. package/dist/audit/syslog-adapter.d.ts +48 -0
  10. package/dist/audit/syslog-adapter.d.ts.map +1 -0
  11. package/dist/audit/syslog-adapter.js +97 -0
  12. package/dist/audit/syslog-adapter.js.map +1 -0
  13. package/dist/credentials/credential-store.d.ts +51 -0
  14. package/dist/credentials/credential-store.d.ts.map +1 -0
  15. package/dist/credentials/credential-store.js +183 -0
  16. package/dist/credentials/credential-store.js.map +1 -0
  17. package/dist/credentials/index.d.ts +9 -0
  18. package/dist/credentials/index.d.ts.map +1 -0
  19. package/dist/credentials/index.js +9 -0
  20. package/dist/credentials/index.js.map +1 -0
  21. package/dist/credentials/migration.d.ts +37 -0
  22. package/dist/credentials/migration.d.ts.map +1 -0
  23. package/dist/credentials/migration.js +122 -0
  24. package/dist/credentials/migration.js.map +1 -0
  25. package/dist/index.d.ts +28 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +32 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/permissions/index.d.ts +9 -0
  30. package/dist/permissions/index.d.ts.map +1 -0
  31. package/dist/permissions/index.js +8 -0
  32. package/dist/permissions/index.js.map +1 -0
  33. package/dist/permissions/security-policy.d.ts +74 -0
  34. package/dist/permissions/security-policy.d.ts.map +1 -0
  35. package/dist/permissions/security-policy.js +109 -0
  36. package/dist/permissions/security-policy.js.map +1 -0
  37. package/dist/sandbox/command-whitelist.d.ts +43 -0
  38. package/dist/sandbox/command-whitelist.d.ts.map +1 -0
  39. package/dist/sandbox/command-whitelist.js +84 -0
  40. package/dist/sandbox/command-whitelist.js.map +1 -0
  41. package/dist/sandbox/filesystem-guard.d.ts +30 -0
  42. package/dist/sandbox/filesystem-guard.d.ts.map +1 -0
  43. package/dist/sandbox/filesystem-guard.js +67 -0
  44. package/dist/sandbox/filesystem-guard.js.map +1 -0
  45. package/dist/sandbox/index.d.ts +9 -0
  46. package/dist/sandbox/index.d.ts.map +1 -0
  47. package/dist/sandbox/index.js +9 -0
  48. package/dist/sandbox/index.js.map +1 -0
  49. package/dist/scanner/index.d.ts +8 -0
  50. package/dist/scanner/index.d.ts.map +1 -0
  51. package/dist/scanner/index.js +8 -0
  52. package/dist/scanner/index.js.map +1 -0
  53. package/dist/scanner/vulnerability-scanner.d.ts +22 -0
  54. package/dist/scanner/vulnerability-scanner.d.ts.map +1 -0
  55. package/dist/scanner/vulnerability-scanner.js +138 -0
  56. package/dist/scanner/vulnerability-scanner.js.map +1 -0
  57. package/dist/types.d.ts +143 -0
  58. package/dist/types.d.ts.map +1 -0
  59. package/dist/types.js +8 -0
  60. package/dist/types.js.map +1 -0
  61. package/dist/websocket/connection-validator.d.ts +35 -0
  62. package/dist/websocket/connection-validator.d.ts.map +1 -0
  63. package/dist/websocket/connection-validator.js +93 -0
  64. package/dist/websocket/connection-validator.js.map +1 -0
  65. package/dist/websocket/csrf-token.d.ts +65 -0
  66. package/dist/websocket/csrf-token.d.ts.map +1 -0
  67. package/dist/websocket/csrf-token.js +123 -0
  68. package/dist/websocket/csrf-token.js.map +1 -0
  69. package/dist/websocket/index.d.ts +13 -0
  70. package/dist/websocket/index.d.ts.map +1 -0
  71. package/dist/websocket/index.js +13 -0
  72. package/dist/websocket/index.js.map +1 -0
  73. package/dist/websocket/origin-validator.d.ts +28 -0
  74. package/dist/websocket/origin-validator.d.ts.map +1 -0
  75. package/dist/websocket/origin-validator.js +60 -0
  76. package/dist/websocket/origin-validator.js.map +1 -0
  77. package/package.json +62 -0
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Structured audit logging for security events
3
+ * 安全事件的結構化稽核日誌
4
+ *
5
+ * All security-relevant operations are logged in JSON format
6
+ * for SIEM integration and compliance.
7
+ * 所有安全相關操作以 JSON 格式記錄,用於 SIEM 整合和合規。
8
+ *
9
+ * @module @panguard-ai/security-hardening/audit/audit-logger
10
+ */
11
+ import type { AuditEvent } from '../types.js';
12
+ /**
13
+ * Log a security audit event
14
+ * 記錄安全稽核事件
15
+ *
16
+ * @param event - Partial audit event (timestamp auto-filled) / 部分稽核事件(時間戳自動填充)
17
+ */
18
+ export declare function logAuditEvent(event: Omit<AuditEvent, 'timestamp' | 'module'>): void;
19
+ /**
20
+ * Log WebSocket connection attempt
21
+ * 記錄 WebSocket 連線嘗試
22
+ */
23
+ export declare function logWebSocketConnect(origin: string, result: 'success' | 'blocked', ipAddress?: string): void;
24
+ /**
25
+ * Log credential access
26
+ * 記錄憑證存取
27
+ */
28
+ export declare function logCredentialAccess(service: string, account: string, result: 'success' | 'failure'): void;
29
+ /**
30
+ * Log file access attempt
31
+ * 記錄檔案存取嘗試
32
+ */
33
+ export declare function logFileAccess(filePath: string, result: 'success' | 'blocked'): void;
34
+ /**
35
+ * Log command execution attempt
36
+ * 記錄命令執行嘗試
37
+ */
38
+ export declare function logCommandExecution(command: string, result: 'success' | 'blocked'): void;
39
+ /**
40
+ * Log security policy check
41
+ * 記錄安全政策檢查
42
+ */
43
+ export declare function logPolicyCheck(operation: string, result: 'success' | 'blocked'): void;
44
+ //# sourceMappingURL=audit-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-logger.d.ts","sourceRoot":"","sources":["../../src/audit/audit-logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI9C;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,WAAW,GAAG,QAAQ,CAAC,GAAG,IAAI,CAcnF;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,GAAG,SAAS,EAC7B,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI,CAQN;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,SAAS,GAAG,SAAS,GAC5B,IAAI,CAON;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI,CAOnF;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI,CAOxF;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI,CAOrF"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Structured audit logging for security events
3
+ * 安全事件的結構化稽核日誌
4
+ *
5
+ * All security-relevant operations are logged in JSON format
6
+ * for SIEM integration and compliance.
7
+ * 所有安全相關操作以 JSON 格式記錄,用於 SIEM 整合和合規。
8
+ *
9
+ * @module @panguard-ai/security-hardening/audit/audit-logger
10
+ */
11
+ import { createLogger } from '@panguard-ai/core';
12
+ const logger = createLogger('audit');
13
+ /**
14
+ * Log a security audit event
15
+ * 記錄安全稽核事件
16
+ *
17
+ * @param event - Partial audit event (timestamp auto-filled) / 部分稽核事件(時間戳自動填充)
18
+ */
19
+ export function logAuditEvent(event) {
20
+ const fullEvent = {
21
+ timestamp: new Date().toISOString(),
22
+ module: 'audit',
23
+ ...event,
24
+ };
25
+ const logFn = event.result === 'blocked' ? logger.warn : logger.info;
26
+ logFn.call(logger, `[AUDIT] ${event.action}: ${event.result} -> ${event.target}`, {
27
+ action: fullEvent.action,
28
+ target: fullEvent.target,
29
+ result: fullEvent.result,
30
+ ...fullEvent.context,
31
+ });
32
+ }
33
+ /**
34
+ * Log WebSocket connection attempt
35
+ * 記錄 WebSocket 連線嘗試
36
+ */
37
+ export function logWebSocketConnect(origin, result, ipAddress) {
38
+ logAuditEvent({
39
+ level: result === 'blocked' ? 'warn' : 'info',
40
+ action: 'websocket_connect',
41
+ target: origin,
42
+ result,
43
+ context: ipAddress ? { ipAddress } : undefined,
44
+ });
45
+ }
46
+ /**
47
+ * Log credential access
48
+ * 記錄憑證存取
49
+ */
50
+ export function logCredentialAccess(service, account, result) {
51
+ logAuditEvent({
52
+ level: result === 'failure' ? 'warn' : 'info',
53
+ action: 'credential_access',
54
+ target: `${service}:${account}`,
55
+ result,
56
+ });
57
+ }
58
+ /**
59
+ * Log file access attempt
60
+ * 記錄檔案存取嘗試
61
+ */
62
+ export function logFileAccess(filePath, result) {
63
+ logAuditEvent({
64
+ level: result === 'blocked' ? 'warn' : 'info',
65
+ action: 'file_access',
66
+ target: filePath,
67
+ result,
68
+ });
69
+ }
70
+ /**
71
+ * Log command execution attempt
72
+ * 記錄命令執行嘗試
73
+ */
74
+ export function logCommandExecution(command, result) {
75
+ logAuditEvent({
76
+ level: result === 'blocked' ? 'warn' : 'info',
77
+ action: 'command_execution',
78
+ target: command,
79
+ result,
80
+ });
81
+ }
82
+ /**
83
+ * Log security policy check
84
+ * 記錄安全政策檢查
85
+ */
86
+ export function logPolicyCheck(operation, result) {
87
+ logAuditEvent({
88
+ level: result === 'blocked' ? 'warn' : 'info',
89
+ action: 'policy_check',
90
+ target: operation,
91
+ result,
92
+ });
93
+ }
94
+ //# sourceMappingURL=audit-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-logger.js","sourceRoot":"","sources":["../../src/audit/audit-logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;AAErC;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,KAA+C;IAC3E,MAAM,SAAS,GAAe;QAC5B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,MAAM,EAAE,OAAO;QACf,GAAG,KAAK;KACT,CAAC;IAEF,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;IACrE,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,EAAE;QAChF,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,GAAG,SAAS,CAAC,OAAO;KACrB,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAc,EACd,MAA6B,EAC7B,SAAkB;IAElB,aAAa,CAAC;QACZ,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;QAC7C,MAAM,EAAE,mBAAmB;QAC3B,MAAM,EAAE,MAAM;QACd,MAAM;QACN,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS;KAC/C,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAe,EACf,OAAe,EACf,MAA6B;IAE7B,aAAa,CAAC;QACZ,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;QAC7C,MAAM,EAAE,mBAAmB;QAC3B,MAAM,EAAE,GAAG,OAAO,IAAI,OAAO,EAAE;QAC/B,MAAM;KACP,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,MAA6B;IAC3E,aAAa,CAAC;QACZ,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;QAC7C,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,QAAQ;QAChB,MAAM;KACP,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe,EAAE,MAA6B;IAChF,aAAa,CAAC;QACZ,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;QAC7C,MAAM,EAAE,mBAAmB;QAC3B,MAAM,EAAE,OAAO;QACf,MAAM;KACP,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,MAA6B;IAC7E,aAAa,CAAC;QACZ,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;QAC7C,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,SAAS;QACjB,MAAM;KACP,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Audit logging module
3
+ * 稽核日誌模組
4
+ *
5
+ * @module @panguard-ai/security-hardening/audit
6
+ */
7
+ export { logAuditEvent, logWebSocketConnect, logCredentialAccess, logFileAccess, logCommandExecution, logPolicyCheck, } from './audit-logger.js';
8
+ export { SyslogAdapter, formatSyslogMessage } from './syslog-adapter.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/audit/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,mBAAmB,EACnB,cAAc,GACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Audit logging module
3
+ * 稽核日誌模組
4
+ *
5
+ * @module @panguard-ai/security-hardening/audit
6
+ */
7
+ export { logAuditEvent, logWebSocketConnect, logCredentialAccess, logFileAccess, logCommandExecution, logPolicyCheck, } from './audit-logger.js';
8
+ export { SyslogAdapter, formatSyslogMessage } from './syslog-adapter.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/audit/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,mBAAmB,EACnB,cAAc,GACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Syslog adapter for audit event forwarding
3
+ * 稽核事件轉發的 Syslog 適配器
4
+ *
5
+ * Sends audit events to a syslog server using RFC 5424 format over UDP.
6
+ * 使用 RFC 5424 格式透過 UDP 將稽核事件發送到 syslog 伺服器。
7
+ *
8
+ * @module @panguard-ai/security-hardening/audit/syslog-adapter
9
+ */
10
+ import type { AuditEvent } from '../types.js';
11
+ /**
12
+ * Format an audit event as RFC 5424 syslog message
13
+ * 將稽核事件格式化為 RFC 5424 syslog 訊息
14
+ *
15
+ * @param event - Audit event / 稽核事件
16
+ * @returns RFC 5424 formatted message / RFC 5424 格式化訊息
17
+ */
18
+ export declare function formatSyslogMessage(event: AuditEvent): string;
19
+ /**
20
+ * Syslog adapter for sending audit events via UDP
21
+ * 透過 UDP 發送稽核事件的 Syslog 適配器
22
+ */
23
+ export declare class SyslogAdapter {
24
+ private socket;
25
+ private readonly host;
26
+ private readonly port;
27
+ /**
28
+ * Create a new syslog adapter
29
+ * 建立新的 syslog 適配器
30
+ *
31
+ * @param host - Syslog server hostname / Syslog 伺服器主機名稱
32
+ * @param port - Syslog server port (default: 514) / Syslog 伺服器連接埠(預設:514)
33
+ */
34
+ constructor(host: string, port?: number);
35
+ /**
36
+ * Send an audit event to syslog
37
+ * 將稽核事件發送到 syslog
38
+ *
39
+ * @param event - Audit event to send / 要發送的稽核事件
40
+ */
41
+ send(event: AuditEvent): void;
42
+ /**
43
+ * Close the syslog socket
44
+ * 關閉 syslog socket
45
+ */
46
+ close(): void;
47
+ }
48
+ //# sourceMappingURL=syslog-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syslog-adapter.d.ts","sourceRoot":"","sources":["../../src/audit/syslog-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAc9C;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAa7D;AAED;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAE9B;;;;;;OAMG;gBACS,IAAI,EAAE,MAAM,EAAE,IAAI,SAAM;IAKpC;;;;;OAKG;IACH,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAsB7B;;;OAGG;IACH,KAAK,IAAI,IAAI;CAOd"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Syslog adapter for audit event forwarding
3
+ * 稽核事件轉發的 Syslog 適配器
4
+ *
5
+ * Sends audit events to a syslog server using RFC 5424 format over UDP.
6
+ * 使用 RFC 5424 格式透過 UDP 將稽核事件發送到 syslog 伺服器。
7
+ *
8
+ * @module @panguard-ai/security-hardening/audit/syslog-adapter
9
+ */
10
+ import { createSocket } from 'dgram';
11
+ import { hostname } from 'os';
12
+ import { createLogger } from '@panguard-ai/core';
13
+ const logger = createLogger('audit:syslog');
14
+ /** Syslog severity mapping / Syslog 嚴重程度映射 */
15
+ const SYSLOG_SEVERITY = {
16
+ error: 3, // Error
17
+ warn: 4, // Warning
18
+ info: 6, // Informational
19
+ };
20
+ /** Syslog facility: local0 = 16 / Syslog 設施:local0 = 16 */
21
+ const FACILITY = 16;
22
+ /**
23
+ * Format an audit event as RFC 5424 syslog message
24
+ * 將稽核事件格式化為 RFC 5424 syslog 訊息
25
+ *
26
+ * @param event - Audit event / 稽核事件
27
+ * @returns RFC 5424 formatted message / RFC 5424 格式化訊息
28
+ */
29
+ export function formatSyslogMessage(event) {
30
+ const severity = SYSLOG_SEVERITY[event.level] ?? 6;
31
+ const priority = FACILITY * 8 + severity;
32
+ const host = hostname();
33
+ const appName = 'panguard-ai';
34
+ const procId = process.pid;
35
+ const msgId = event.action;
36
+ const timestamp = event.timestamp;
37
+ const structuredData = `[panguard action="${event.action}" target="${event.target}" result="${event.result}"]`;
38
+ // RFC 5424: <priority>VERSION TIMESTAMP HOSTNAME APP-NAME PROCID MSGID STRUCTURED-DATA MSG
39
+ return `<${priority}>1 ${timestamp} ${host} ${appName} ${procId} ${msgId} ${structuredData} ${event.action}: ${event.result} -> ${event.target}`;
40
+ }
41
+ /**
42
+ * Syslog adapter for sending audit events via UDP
43
+ * 透過 UDP 發送稽核事件的 Syslog 適配器
44
+ */
45
+ export class SyslogAdapter {
46
+ socket = null;
47
+ host;
48
+ port;
49
+ /**
50
+ * Create a new syslog adapter
51
+ * 建立新的 syslog 適配器
52
+ *
53
+ * @param host - Syslog server hostname / Syslog 伺服器主機名稱
54
+ * @param port - Syslog server port (default: 514) / Syslog 伺服器連接埠(預設:514)
55
+ */
56
+ constructor(host, port = 514) {
57
+ this.host = host;
58
+ this.port = port;
59
+ }
60
+ /**
61
+ * Send an audit event to syslog
62
+ * 將稽核事件發送到 syslog
63
+ *
64
+ * @param event - Audit event to send / 要發送的稽核事件
65
+ */
66
+ send(event) {
67
+ if (!this.socket) {
68
+ this.socket = createSocket('udp4');
69
+ this.socket.on('error', (err) => {
70
+ logger.error('Syslog socket error', { error: String(err) });
71
+ });
72
+ }
73
+ const message = formatSyslogMessage(event);
74
+ const buffer = Buffer.from(message, 'utf-8');
75
+ this.socket.send(buffer, 0, buffer.length, this.port, this.host, (err) => {
76
+ if (err) {
77
+ logger.error('Failed to send syslog message', {
78
+ host: this.host,
79
+ port: this.port,
80
+ error: String(err),
81
+ });
82
+ }
83
+ });
84
+ }
85
+ /**
86
+ * Close the syslog socket
87
+ * 關閉 syslog socket
88
+ */
89
+ close() {
90
+ if (this.socket) {
91
+ this.socket.close();
92
+ this.socket = null;
93
+ logger.info('Syslog adapter closed');
94
+ }
95
+ }
96
+ }
97
+ //# sourceMappingURL=syslog-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syslog-adapter.js","sourceRoot":"","sources":["../../src/audit/syslog-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Platform-agnostic secure credential storage
3
+ * 平台無關的安全憑證儲存
4
+ *
5
+ * Provides encrypted credential storage using AES-256-GCM.
6
+ * No native dependencies required (unlike keytar).
7
+ * 使用 AES-256-GCM 提供加密憑證儲存。不需要原生相依套件。
8
+ *
9
+ * @module @panguard-ai/security-hardening/credentials/credential-store
10
+ */
11
+ import type { CredentialStore } from '../types.js';
12
+ /**
13
+ * In-memory credential store for testing
14
+ * 記憶體內憑證儲存(用於測試)
15
+ */
16
+ export declare class InMemoryCredentialStore implements CredentialStore {
17
+ private readonly store;
18
+ private key;
19
+ get(service: string, account: string): Promise<string | null>;
20
+ set(service: string, account: string, password: string): Promise<void>;
21
+ delete(service: string, account: string): Promise<boolean>;
22
+ list(service: string): Promise<string[]>;
23
+ }
24
+ /**
25
+ * Encrypted file-based credential store
26
+ * 基於加密檔案的憑證儲存
27
+ *
28
+ * Stores credentials in encrypted JSON files using AES-256-GCM.
29
+ * Key is derived from machine-specific entropy (hostname + username).
30
+ * 使用 AES-256-GCM 將憑證儲存在加密的 JSON 檔案中。
31
+ * 金鑰從機器特定的熵值衍生(主機名稱 + 使用者名稱)。
32
+ */
33
+ export declare class EncryptedFileCredentialStore implements CredentialStore {
34
+ private readonly storePath;
35
+ private readonly key;
36
+ /**
37
+ * Create a new encrypted file credential store
38
+ * 建立新的加密檔案憑證儲存
39
+ *
40
+ * @param storePath - Directory to store encrypted credentials / 儲存加密憑證的目錄
41
+ */
42
+ constructor(storePath: string);
43
+ private filePath;
44
+ private loadServiceData;
45
+ private saveServiceData;
46
+ get(service: string, account: string): Promise<string | null>;
47
+ set(service: string, account: string, password: string): Promise<void>;
48
+ delete(service: string, account: string): Promise<boolean>;
49
+ list(service: string): Promise<string[]>;
50
+ }
51
+ //# sourceMappingURL=credential-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-store.d.ts","sourceRoot":"","sources":["../../src/credentials/credential-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAwDnD;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,eAAe;IAC7D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;IAEnD,OAAO,CAAC,GAAG;IAIL,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAI7D,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAItE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI1D,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAU/C;AAED;;;;;;;;GAQG;AACH,qBAAa,4BAA6B,YAAW,eAAe;IAClE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAE7B;;;;;OAKG;gBACS,SAAS,EAAE,MAAM;IAU7B,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,eAAe;IAOjB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAW7D,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOtE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAkB1D,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAI/C"}
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Platform-agnostic secure credential storage
3
+ * 平台無關的安全憑證儲存
4
+ *
5
+ * Provides encrypted credential storage using AES-256-GCM.
6
+ * No native dependencies required (unlike keytar).
7
+ * 使用 AES-256-GCM 提供加密憑證儲存。不需要原生相依套件。
8
+ *
9
+ * @module @panguard-ai/security-hardening/credentials/credential-store
10
+ */
11
+ import { createCipheriv, createDecipheriv, randomBytes, createHash } from 'crypto';
12
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync } from 'fs';
13
+ import { join } from 'path';
14
+ import { hostname, userInfo } from 'os';
15
+ import { createLogger } from '@panguard-ai/core';
16
+ const logger = createLogger('credentials:store');
17
+ const ALGORITHM = 'aes-256-gcm';
18
+ const IV_LENGTH = 16;
19
+ /**
20
+ * Derive an encryption key from machine-specific entropy
21
+ * 從機器特定的熵值衍生加密金鑰
22
+ *
23
+ * @param salt - Additional salt / 額外鹽值
24
+ * @returns 32-byte key / 32 位元組金鑰
25
+ */
26
+ function deriveKey(salt) {
27
+ const machineId = `${hostname()}-${userInfo().username}-panguard-ai`;
28
+ return createHash('sha256').update(`${machineId}:${salt}`).digest();
29
+ }
30
+ /**
31
+ * Encrypt a string value
32
+ * 加密字串值
33
+ */
34
+ function encrypt(value, key) {
35
+ const iv = randomBytes(IV_LENGTH);
36
+ const cipher = createCipheriv(ALGORITHM, key, iv);
37
+ const encrypted = Buffer.concat([cipher.update(value, 'utf8'), cipher.final()]);
38
+ const authTag = cipher.getAuthTag();
39
+ // Format: iv:authTag:encrypted (all base64)
40
+ return `${iv.toString('base64')}:${authTag.toString('base64')}:${encrypted.toString('base64')}`;
41
+ }
42
+ /**
43
+ * Decrypt an encrypted string
44
+ * 解密已加密的字串
45
+ */
46
+ function decrypt(encryptedData, key) {
47
+ const parts = encryptedData.split(':');
48
+ if (parts.length !== 3) {
49
+ throw new Error('Invalid encrypted data format');
50
+ }
51
+ const [ivStr, authTagStr, dataStr] = parts;
52
+ if (!ivStr || !authTagStr || !dataStr) {
53
+ throw new Error('Invalid encrypted data format');
54
+ }
55
+ const iv = Buffer.from(ivStr, 'base64');
56
+ const authTag = Buffer.from(authTagStr, 'base64');
57
+ const encrypted = Buffer.from(dataStr, 'base64');
58
+ const decipher = createDecipheriv(ALGORITHM, key, iv);
59
+ decipher.setAuthTag(authTag);
60
+ const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]);
61
+ return decrypted.toString('utf8');
62
+ }
63
+ /**
64
+ * In-memory credential store for testing
65
+ * 記憶體內憑證儲存(用於測試)
66
+ */
67
+ export class InMemoryCredentialStore {
68
+ store = new Map();
69
+ key(service, account) {
70
+ return `${service}:${account}`;
71
+ }
72
+ async get(service, account) {
73
+ return this.store.get(this.key(service, account)) ?? null;
74
+ }
75
+ async set(service, account, password) {
76
+ this.store.set(this.key(service, account), password);
77
+ }
78
+ async delete(service, account) {
79
+ return this.store.delete(this.key(service, account));
80
+ }
81
+ async list(service) {
82
+ const prefix = `${service}:`;
83
+ const accounts = [];
84
+ for (const k of this.store.keys()) {
85
+ if (k.startsWith(prefix)) {
86
+ accounts.push(k.slice(prefix.length));
87
+ }
88
+ }
89
+ return accounts;
90
+ }
91
+ }
92
+ /**
93
+ * Encrypted file-based credential store
94
+ * 基於加密檔案的憑證儲存
95
+ *
96
+ * Stores credentials in encrypted JSON files using AES-256-GCM.
97
+ * Key is derived from machine-specific entropy (hostname + username).
98
+ * 使用 AES-256-GCM 將憑證儲存在加密的 JSON 檔案中。
99
+ * 金鑰從機器特定的熵值衍生(主機名稱 + 使用者名稱)。
100
+ */
101
+ export class EncryptedFileCredentialStore {
102
+ storePath;
103
+ key;
104
+ /**
105
+ * Create a new encrypted file credential store
106
+ * 建立新的加密檔案憑證儲存
107
+ *
108
+ * @param storePath - Directory to store encrypted credentials / 儲存加密憑證的目錄
109
+ */
110
+ constructor(storePath) {
111
+ this.storePath = storePath;
112
+ this.key = deriveKey('credential-store-v1');
113
+ if (!existsSync(storePath)) {
114
+ mkdirSync(storePath, { recursive: true, mode: 0o700 });
115
+ logger.info('Credential store directory created', { path: storePath });
116
+ }
117
+ }
118
+ filePath(service) {
119
+ // Sanitize service name for filesystem
120
+ const safe = service.replace(/[^a-zA-Z0-9_-]/g, '_');
121
+ return join(this.storePath, `${safe}.enc`);
122
+ }
123
+ loadServiceData(service) {
124
+ const path = this.filePath(service);
125
+ if (!existsSync(path)) {
126
+ return {};
127
+ }
128
+ try {
129
+ const encrypted = readFileSync(path, 'utf-8');
130
+ const json = decrypt(encrypted, this.key);
131
+ return JSON.parse(json);
132
+ }
133
+ catch (error) {
134
+ logger.error('Failed to load credential file', { service, error: String(error) });
135
+ return {};
136
+ }
137
+ }
138
+ saveServiceData(service, data) {
139
+ const path = this.filePath(service);
140
+ const json = JSON.stringify(data);
141
+ const encrypted = encrypt(json, this.key);
142
+ writeFileSync(path, encrypted, { mode: 0o600 });
143
+ }
144
+ async get(service, account) {
145
+ const data = this.loadServiceData(service);
146
+ const value = data[account];
147
+ if (value !== undefined) {
148
+ logger.info('Credential retrieved', { service, account });
149
+ return value;
150
+ }
151
+ logger.warn('Credential not found', { service, account });
152
+ return null;
153
+ }
154
+ async set(service, account, password) {
155
+ const data = this.loadServiceData(service);
156
+ data[account] = password;
157
+ this.saveServiceData(service, data);
158
+ logger.info('Credential stored securely', { service, account });
159
+ }
160
+ async delete(service, account) {
161
+ const data = this.loadServiceData(service);
162
+ if (!(account in data)) {
163
+ return false;
164
+ }
165
+ delete data[account];
166
+ if (Object.keys(data).length === 0) {
167
+ const path = this.filePath(service);
168
+ if (existsSync(path)) {
169
+ unlinkSync(path);
170
+ }
171
+ }
172
+ else {
173
+ this.saveServiceData(service, data);
174
+ }
175
+ logger.info('Credential deleted', { service, account });
176
+ return true;
177
+ }
178
+ async list(service) {
179
+ const data = this.loadServiceData(service);
180
+ return Object.keys(data);
181
+ }
182
+ }
183
+ //# sourceMappingURL=credential-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-store.js","sourceRoot":"","sources":["../../src/credentials/credential-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Credential security module
3
+ * 憑證安全模組
4
+ *
5
+ * @module @panguard-ai/security-hardening/credentials
6
+ */
7
+ export { InMemoryCredentialStore, EncryptedFileCredentialStore } from './credential-store.js';
8
+ export { scanPlaintextCredentials, migrateCredentials } from './migration.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/credentials/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAC9F,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Credential security module
3
+ * 憑證安全模組
4
+ *
5
+ * @module @panguard-ai/security-hardening/credentials
6
+ */
7
+ export { InMemoryCredentialStore, EncryptedFileCredentialStore } from './credential-store.js';
8
+ export { scanPlaintextCredentials, migrateCredentials } from './migration.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/credentials/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAC9F,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Migrate plaintext credentials to secure storage
3
+ * 將明文憑證遷移到安全儲存
4
+ *
5
+ * @module @panguard-ai/security-hardening/credentials/migration
6
+ */
7
+ import type { CredentialStore, MigrationReport } from '../types.js';
8
+ /**
9
+ * Plaintext credential file information
10
+ * 明文憑證檔案資訊
11
+ */
12
+ interface PlaintextCredential {
13
+ service: string;
14
+ account: string;
15
+ value: string;
16
+ filePath: string;
17
+ }
18
+ /**
19
+ * Scan for plaintext credential files
20
+ * 掃描明文憑證檔案
21
+ *
22
+ * @param credentialsDir - Directory to scan / 要掃描的目錄
23
+ * @returns Array of found plaintext credentials / 找到的明文憑證陣列
24
+ */
25
+ export declare function scanPlaintextCredentials(credentialsDir?: string): PlaintextCredential[];
26
+ /**
27
+ * Migrate plaintext credentials to secure storage
28
+ * 將明文憑證遷移到安全儲存
29
+ *
30
+ * @param store - Target credential store / 目標憑證儲存
31
+ * @param credentialsDir - Source directory / 來源目錄
32
+ * @param dryRun - If true, only report without migrating / 僅報告而不遷移
33
+ * @returns Migration report / 遷移報告
34
+ */
35
+ export declare function migrateCredentials(store: CredentialStore, credentialsDir?: string, dryRun?: boolean): Promise<MigrationReport>;
36
+ export {};
37
+ //# sourceMappingURL=migration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../src/credentials/migration.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAOpE;;;GAGG;AACH,UAAU,mBAAmB;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAiBD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,cAAc,GAAE,MAAgC,GAC/C,mBAAmB,EAAE,CA0CvB;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,eAAe,EACtB,cAAc,GAAE,MAAgC,EAChD,MAAM,UAAQ,GACb,OAAO,CAAC,eAAe,CAAC,CA2C1B"}