@panguard-ai/panguard-guard 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/analyze-agent.d.ts +62 -0
- package/dist/agent/analyze-agent.d.ts.map +1 -0
- package/dist/agent/analyze-agent.js +327 -0
- package/dist/agent/analyze-agent.js.map +1 -0
- package/dist/agent/detect-agent.d.ts +59 -0
- package/dist/agent/detect-agent.d.ts.map +1 -0
- package/dist/agent/detect-agent.js +214 -0
- package/dist/agent/detect-agent.js.map +1 -0
- package/dist/agent/index.d.ts +15 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +14 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/report-agent.d.ts +122 -0
- package/dist/agent/report-agent.d.ts.map +1 -0
- package/dist/agent/report-agent.js +468 -0
- package/dist/agent/report-agent.js.map +1 -0
- package/dist/agent/respond-agent.d.ts +113 -0
- package/dist/agent/respond-agent.d.ts.map +1 -0
- package/dist/agent/respond-agent.js +749 -0
- package/dist/agent/respond-agent.js.map +1 -0
- package/dist/agent-client/index.d.ts +81 -0
- package/dist/agent-client/index.d.ts.map +1 -0
- package/dist/agent-client/index.js +170 -0
- package/dist/agent-client/index.js.map +1 -0
- package/dist/cli/index.d.ts +17 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +295 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config.d.ts +23 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +108 -0
- package/dist/config.js.map +1 -0
- package/dist/daemon/index.d.ts +66 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +284 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/dashboard/index.d.ts +78 -0
- package/dist/dashboard/index.d.ts.map +1 -0
- package/dist/dashboard/index.js +455 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/guard-engine.d.ts +108 -0
- package/dist/guard-engine.d.ts.map +1 -0
- package/dist/guard-engine.js +740 -0
- package/dist/guard-engine.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/install/index.d.ts +23 -0
- package/dist/install/index.d.ts.map +1 -0
- package/dist/install/index.js +216 -0
- package/dist/install/index.js.map +1 -0
- package/dist/investigation/index.d.ts +80 -0
- package/dist/investigation/index.d.ts.map +1 -0
- package/dist/investigation/index.js +570 -0
- package/dist/investigation/index.js.map +1 -0
- package/dist/license/index.d.ts +46 -0
- package/dist/license/index.d.ts.map +1 -0
- package/dist/license/index.js +145 -0
- package/dist/license/index.js.map +1 -0
- package/dist/memory/baseline.d.ts +34 -0
- package/dist/memory/baseline.d.ts.map +1 -0
- package/dist/memory/baseline.js +224 -0
- package/dist/memory/baseline.js.map +1 -0
- package/dist/memory/index.d.ts +32 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +58 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/learning.d.ts +35 -0
- package/dist/memory/learning.d.ts.map +1 -0
- package/dist/memory/learning.js +60 -0
- package/dist/memory/learning.js.map +1 -0
- package/dist/monitors/falco-monitor.d.ts +62 -0
- package/dist/monitors/falco-monitor.d.ts.map +1 -0
- package/dist/monitors/falco-monitor.js +226 -0
- package/dist/monitors/falco-monitor.js.map +1 -0
- package/dist/monitors/suricata-monitor.d.ts +80 -0
- package/dist/monitors/suricata-monitor.d.ts.map +1 -0
- package/dist/monitors/suricata-monitor.js +227 -0
- package/dist/monitors/suricata-monitor.js.map +1 -0
- package/dist/notify/email.d.ts +23 -0
- package/dist/notify/email.d.ts.map +1 -0
- package/dist/notify/email.js +124 -0
- package/dist/notify/email.js.map +1 -0
- package/dist/notify/index.d.ts +31 -0
- package/dist/notify/index.d.ts.map +1 -0
- package/dist/notify/index.js +70 -0
- package/dist/notify/index.js.map +1 -0
- package/dist/notify/line-notify.d.ts.map +1 -0
- package/dist/notify/slack.d.ts +21 -0
- package/dist/notify/slack.d.ts.map +1 -0
- package/dist/notify/slack.js +92 -0
- package/dist/notify/slack.js.map +1 -0
- package/dist/notify/telegram.d.ts +21 -0
- package/dist/notify/telegram.d.ts.map +1 -0
- package/dist/notify/telegram.js +89 -0
- package/dist/notify/telegram.js.map +1 -0
- package/dist/response/file-quarantine.d.ts +63 -0
- package/dist/response/file-quarantine.d.ts.map +1 -0
- package/dist/response/file-quarantine.js +137 -0
- package/dist/response/file-quarantine.js.map +1 -0
- package/dist/response/index.d.ts +4 -0
- package/dist/response/index.d.ts.map +1 -0
- package/dist/response/index.js +4 -0
- package/dist/response/index.js.map +1 -0
- package/dist/response/ip-blocker.d.ts +69 -0
- package/dist/response/ip-blocker.d.ts.map +1 -0
- package/dist/response/ip-blocker.js +191 -0
- package/dist/response/ip-blocker.js.map +1 -0
- package/dist/response/process-killer.d.ts +49 -0
- package/dist/response/process-killer.d.ts.map +1 -0
- package/dist/response/process-killer.js +230 -0
- package/dist/response/process-killer.js.map +1 -0
- package/dist/rules/builtin-rules.d.ts +12 -0
- package/dist/rules/builtin-rules.d.ts.map +1 -0
- package/dist/rules/builtin-rules.js +471 -0
- package/dist/rules/builtin-rules.js.map +1 -0
- package/dist/threat-cloud/client-id.d.ts +13 -0
- package/dist/threat-cloud/client-id.d.ts.map +1 -0
- package/dist/threat-cloud/client-id.js +38 -0
- package/dist/threat-cloud/client-id.js.map +1 -0
- package/dist/threat-cloud/index.d.ts +103 -0
- package/dist/threat-cloud/index.d.ts.map +1 -0
- package/dist/threat-cloud/index.js +386 -0
- package/dist/threat-cloud/index.js.map +1 -0
- package/dist/types.d.ts +336 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +42 -0
- package/dist/types.js.map +1 -0
- package/package.json +35 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File Quarantine - Isolate suspicious files with metadata and restore
|
|
3
|
+
* 檔案隔離 - 隔離可疑檔案(含中繼資料與還原功能)
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - Move files to quarantine directory with restricted permissions
|
|
7
|
+
* - SHA-256 hash recording for evidence
|
|
8
|
+
* - Quarantine manifest (JSON) for tracking
|
|
9
|
+
* - Restore functionality to return files to original location
|
|
10
|
+
*
|
|
11
|
+
* @module @panguard-ai/panguard-guard/response/file-quarantine
|
|
12
|
+
*/
|
|
13
|
+
import { createHash } from 'node:crypto';
|
|
14
|
+
import { readFile, rename, mkdir, chmod, writeFile, readdir, stat } from 'node:fs/promises';
|
|
15
|
+
import { join, basename, resolve, normalize } from 'node:path';
|
|
16
|
+
import { homedir, platform } from 'node:os';
|
|
17
|
+
import { createLogger } from '@panguard-ai/core';
|
|
18
|
+
const logger = createLogger('panguard-guard:file-quarantine');
|
|
19
|
+
/**
|
|
20
|
+
* Manages file quarantine with metadata tracking and restore
|
|
21
|
+
* 管理檔案隔離(含中繼資料追蹤與還原功能)
|
|
22
|
+
*/
|
|
23
|
+
export class FileQuarantine {
|
|
24
|
+
quarantineDir;
|
|
25
|
+
manifestPath;
|
|
26
|
+
manifest = { version: 1, records: [] };
|
|
27
|
+
constructor(quarantineDir) {
|
|
28
|
+
this.quarantineDir = quarantineDir ?? join(homedir(), '.panguard', 'quarantine');
|
|
29
|
+
this.manifestPath = join(this.quarantineDir, 'manifest.json');
|
|
30
|
+
}
|
|
31
|
+
/** Initialize quarantine directory / 初始化隔離目錄 */
|
|
32
|
+
async initialize() {
|
|
33
|
+
await mkdir(this.quarantineDir, { recursive: true, mode: 0o700 });
|
|
34
|
+
try {
|
|
35
|
+
const data = await readFile(this.manifestPath, 'utf-8');
|
|
36
|
+
this.manifest = JSON.parse(data);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// No existing manifest
|
|
40
|
+
this.manifest = { version: 1, records: [] };
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Quarantine a file
|
|
45
|
+
* 隔離檔案
|
|
46
|
+
*/
|
|
47
|
+
async quarantine(filePath, reason) {
|
|
48
|
+
await this.initialize();
|
|
49
|
+
const absPath = resolve(normalize(filePath));
|
|
50
|
+
// Prevent quarantining files inside the quarantine directory
|
|
51
|
+
if (absPath.startsWith(this.quarantineDir)) {
|
|
52
|
+
throw new Error('Cannot quarantine a file already in quarantine directory');
|
|
53
|
+
}
|
|
54
|
+
// Read file and compute hash before moving
|
|
55
|
+
const fileBuffer = await readFile(absPath);
|
|
56
|
+
const sha256 = createHash('sha256').update(fileBuffer).digest('hex');
|
|
57
|
+
const fileStat = await stat(absPath);
|
|
58
|
+
// Generate unique quarantine name
|
|
59
|
+
const id = `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
60
|
+
const quarantineName = `${id}_${basename(absPath)}`;
|
|
61
|
+
const quarantinePath = join(this.quarantineDir, quarantineName);
|
|
62
|
+
// Move file to quarantine
|
|
63
|
+
await rename(absPath, quarantinePath);
|
|
64
|
+
// Restrict permissions (not on Windows)
|
|
65
|
+
if (platform() !== 'win32') {
|
|
66
|
+
await chmod(quarantinePath, 0o000);
|
|
67
|
+
}
|
|
68
|
+
const record = {
|
|
69
|
+
id,
|
|
70
|
+
originalPath: absPath,
|
|
71
|
+
quarantinePath,
|
|
72
|
+
sha256,
|
|
73
|
+
fileSize: fileStat.size,
|
|
74
|
+
reason,
|
|
75
|
+
quarantinedAt: new Date().toISOString(),
|
|
76
|
+
};
|
|
77
|
+
this.manifest.records.push(record);
|
|
78
|
+
await this.saveManifest();
|
|
79
|
+
logger.info(`Quarantined: ${absPath} -> ${quarantinePath} (SHA-256: ${sha256.slice(0, 16)}...)`);
|
|
80
|
+
return record;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Restore a quarantined file to its original location
|
|
84
|
+
* 還原隔離檔案到原始位置
|
|
85
|
+
*/
|
|
86
|
+
async restore(id) {
|
|
87
|
+
await this.initialize();
|
|
88
|
+
const record = this.manifest.records.find((r) => r.id === id);
|
|
89
|
+
if (!record) {
|
|
90
|
+
return { success: false, message: `Quarantine record not found: ${id}` };
|
|
91
|
+
}
|
|
92
|
+
if (record.restoredAt) {
|
|
93
|
+
return { success: false, message: `File already restored at ${record.restoredAt}` };
|
|
94
|
+
}
|
|
95
|
+
try {
|
|
96
|
+
// Restore permissions before moving
|
|
97
|
+
if (platform() !== 'win32') {
|
|
98
|
+
await chmod(record.quarantinePath, 0o644);
|
|
99
|
+
}
|
|
100
|
+
await rename(record.quarantinePath, record.originalPath);
|
|
101
|
+
record.restoredAt = new Date().toISOString();
|
|
102
|
+
await this.saveManifest();
|
|
103
|
+
logger.info(`Restored: ${record.quarantinePath} -> ${record.originalPath}`);
|
|
104
|
+
return { success: true, message: `File restored to ${record.originalPath}` };
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
108
|
+
return { success: false, message: `Restore failed: ${msg}` };
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/** Get all quarantine records / 取得所有隔離紀錄 */
|
|
112
|
+
getRecords() {
|
|
113
|
+
return [...this.manifest.records];
|
|
114
|
+
}
|
|
115
|
+
/** Get active (not restored) quarantine records / 取得未還原的隔離紀錄 */
|
|
116
|
+
getActiveRecords() {
|
|
117
|
+
return this.manifest.records.filter((r) => !r.restoredAt);
|
|
118
|
+
}
|
|
119
|
+
/** Find record by ID / 以 ID 搜尋紀錄 */
|
|
120
|
+
findRecord(id) {
|
|
121
|
+
return this.manifest.records.find((r) => r.id === id);
|
|
122
|
+
}
|
|
123
|
+
/** Count files in quarantine / 隔離區檔案數量 */
|
|
124
|
+
async getQuarantineCount() {
|
|
125
|
+
try {
|
|
126
|
+
const files = await readdir(this.quarantineDir);
|
|
127
|
+
return files.filter((f) => f !== 'manifest.json').length;
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return 0;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
async saveManifest() {
|
|
134
|
+
await writeFile(this.manifestPath, JSON.stringify(this.manifest, null, 2), 'utf-8');
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=file-quarantine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-quarantine.js","sourceRoot":"","sources":["../../src/response/file-quarantine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { IPBlocker, type BlockRecord, type IPBlockerConfig } from './ip-blocker.js';
|
|
2
|
+
export { FileQuarantine, type QuarantineRecord, type QuarantineManifest, } from './file-quarantine.js';
|
|
3
|
+
export { ProcessKiller, type KillResult } from './process-killer.js';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/response/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACpF,OAAO,EACL,cAAc,EACd,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,GACxB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/response/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA0C,MAAM,iBAAiB,CAAC;AACpF,OAAO,EACL,cAAc,GAGf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAmB,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IP Blocker - Cross-platform firewall rule management with auto-unblock
|
|
3
|
+
* IP 封鎖器 - 跨平台防火牆規則管理與自動解封
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - Platform-aware blocking (pfctl / iptables / netsh)
|
|
7
|
+
* - Auto-unblock timer (default 24h)
|
|
8
|
+
* - Persistent whitelist
|
|
9
|
+
* - Block manifest tracking
|
|
10
|
+
*
|
|
11
|
+
* @module @panguard-ai/panguard-guard/response/ip-blocker
|
|
12
|
+
*/
|
|
13
|
+
/** Record of a blocked IP / 封鎖 IP 紀錄 */
|
|
14
|
+
export interface BlockRecord {
|
|
15
|
+
ip: string;
|
|
16
|
+
blockedAt: string;
|
|
17
|
+
expiresAt: string;
|
|
18
|
+
reason: string;
|
|
19
|
+
autoUnblock: boolean;
|
|
20
|
+
}
|
|
21
|
+
/** IP Blocker configuration / IP 封鎖器設定 */
|
|
22
|
+
export interface IPBlockerConfig {
|
|
23
|
+
/** Default block duration in ms (default 24h) / 預設封鎖時長 */
|
|
24
|
+
defaultBlockDurationMs: number;
|
|
25
|
+
/** IPs that can never be blocked / 永不封鎖的 IP */
|
|
26
|
+
whitelist: string[];
|
|
27
|
+
/** Enable auto-unblock timer / 啟用自動解封 */
|
|
28
|
+
autoUnblockEnabled: boolean;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Manages IP blocking with auto-unblock timers
|
|
32
|
+
* 管理 IP 封鎖與自動解封計時器
|
|
33
|
+
*/
|
|
34
|
+
export declare class IPBlocker {
|
|
35
|
+
private readonly config;
|
|
36
|
+
private readonly blocked;
|
|
37
|
+
private readonly whitelist;
|
|
38
|
+
private unblockTimers;
|
|
39
|
+
constructor(config?: Partial<IPBlockerConfig>);
|
|
40
|
+
/** Check if IP is whitelisted / 檢查 IP 是否在白名單 */
|
|
41
|
+
isWhitelisted(ip: string): boolean;
|
|
42
|
+
/** Check if IP is currently blocked / 檢查 IP 是否已封鎖 */
|
|
43
|
+
isBlocked(ip: string): boolean;
|
|
44
|
+
/** Get all currently blocked IPs / 取得所有已封鎖的 IP */
|
|
45
|
+
getBlockedIPs(): BlockRecord[];
|
|
46
|
+
/**
|
|
47
|
+
* Block an IP address
|
|
48
|
+
* 封鎖 IP 位址
|
|
49
|
+
*/
|
|
50
|
+
block(ip: string, reason: string, durationMs?: number): Promise<{
|
|
51
|
+
success: boolean;
|
|
52
|
+
message: string;
|
|
53
|
+
}>;
|
|
54
|
+
/**
|
|
55
|
+
* Unblock an IP address
|
|
56
|
+
* 解封 IP 位址
|
|
57
|
+
*/
|
|
58
|
+
unblock(ip: string, reason: string): Promise<{
|
|
59
|
+
success: boolean;
|
|
60
|
+
message: string;
|
|
61
|
+
}>;
|
|
62
|
+
/** Add whitelist entry / 新增白名單條目 */
|
|
63
|
+
addToWhitelist(ip: string): void;
|
|
64
|
+
/** Clean up all timers / 清理所有計時器 */
|
|
65
|
+
destroy(): void;
|
|
66
|
+
private addFirewallRule;
|
|
67
|
+
private removeFirewallRule;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=ip-blocker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ip-blocker.d.ts","sourceRoot":"","sources":["../../src/response/ip-blocker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH,wCAAwC;AACxC,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,0CAA0C;AAC1C,MAAM,WAAW,eAAe;IAC9B,0DAA0D;IAC1D,sBAAsB,EAAE,MAAM,CAAC;IAC/B,+CAA+C;IAC/C,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,yCAAyC;IACzC,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAQD;;;GAGG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;IAC/D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,OAAO,CAAC,aAAa,CAAyD;gBAElE,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM;IAKjD,gDAAgD;IAChD,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIlC,qDAAqD;IACrD,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI9B,kDAAkD;IAClD,aAAa,IAAI,WAAW,EAAE;IAI9B;;;OAGG;IACG,KAAK,CACT,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAsDjD;;;OAGG;IACG,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IA0BzF,oCAAoC;IACpC,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAIhC,oCAAoC;IACpC,OAAO,IAAI,IAAI;YASD,eAAe;YAoBf,kBAAkB;CAgBjC"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IP Blocker - Cross-platform firewall rule management with auto-unblock
|
|
3
|
+
* IP 封鎖器 - 跨平台防火牆規則管理與自動解封
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - Platform-aware blocking (pfctl / iptables / netsh)
|
|
7
|
+
* - Auto-unblock timer (default 24h)
|
|
8
|
+
* - Persistent whitelist
|
|
9
|
+
* - Block manifest tracking
|
|
10
|
+
*
|
|
11
|
+
* @module @panguard-ai/panguard-guard/response/ip-blocker
|
|
12
|
+
*/
|
|
13
|
+
import { execFile } from 'node:child_process';
|
|
14
|
+
import { platform } from 'node:os';
|
|
15
|
+
import { createLogger } from '@panguard-ai/core';
|
|
16
|
+
const logger = createLogger('panguard-guard:ip-blocker');
|
|
17
|
+
const DEFAULT_CONFIG = {
|
|
18
|
+
defaultBlockDurationMs: 24 * 60 * 60 * 1000, // 24h
|
|
19
|
+
whitelist: ['127.0.0.1', '::1', '0.0.0.0', 'localhost'],
|
|
20
|
+
autoUnblockEnabled: true,
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Manages IP blocking with auto-unblock timers
|
|
24
|
+
* 管理 IP 封鎖與自動解封計時器
|
|
25
|
+
*/
|
|
26
|
+
export class IPBlocker {
|
|
27
|
+
config;
|
|
28
|
+
blocked = new Map();
|
|
29
|
+
whitelist;
|
|
30
|
+
unblockTimers = new Map();
|
|
31
|
+
constructor(config = {}) {
|
|
32
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
33
|
+
this.whitelist = new Set([...DEFAULT_CONFIG.whitelist, ...(config.whitelist ?? [])]);
|
|
34
|
+
}
|
|
35
|
+
/** Check if IP is whitelisted / 檢查 IP 是否在白名單 */
|
|
36
|
+
isWhitelisted(ip) {
|
|
37
|
+
return this.whitelist.has(ip);
|
|
38
|
+
}
|
|
39
|
+
/** Check if IP is currently blocked / 檢查 IP 是否已封鎖 */
|
|
40
|
+
isBlocked(ip) {
|
|
41
|
+
return this.blocked.has(ip);
|
|
42
|
+
}
|
|
43
|
+
/** Get all currently blocked IPs / 取得所有已封鎖的 IP */
|
|
44
|
+
getBlockedIPs() {
|
|
45
|
+
return Array.from(this.blocked.values());
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Block an IP address
|
|
49
|
+
* 封鎖 IP 位址
|
|
50
|
+
*/
|
|
51
|
+
async block(ip, reason, durationMs) {
|
|
52
|
+
// Whitelist check
|
|
53
|
+
if (this.whitelist.has(ip)) {
|
|
54
|
+
logger.warn(`Refusing to block whitelisted IP: ${ip}`);
|
|
55
|
+
return { success: false, message: `IP ${ip} is whitelisted` };
|
|
56
|
+
}
|
|
57
|
+
// Already blocked check
|
|
58
|
+
if (this.blocked.has(ip)) {
|
|
59
|
+
return { success: true, message: `IP ${ip} is already blocked` };
|
|
60
|
+
}
|
|
61
|
+
// Validate IP format
|
|
62
|
+
if (!isValidIP(ip)) {
|
|
63
|
+
return { success: false, message: `Invalid IP format: ${ip}` };
|
|
64
|
+
}
|
|
65
|
+
const duration = durationMs ?? this.config.defaultBlockDurationMs;
|
|
66
|
+
const now = new Date();
|
|
67
|
+
const expiresAt = new Date(now.getTime() + duration);
|
|
68
|
+
// Execute platform firewall command
|
|
69
|
+
try {
|
|
70
|
+
await this.addFirewallRule(ip);
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
74
|
+
logger.error(`Failed to block IP ${ip}: ${msg}`);
|
|
75
|
+
return { success: false, message: `Firewall error: ${msg}` };
|
|
76
|
+
}
|
|
77
|
+
// Record block
|
|
78
|
+
const record = {
|
|
79
|
+
ip,
|
|
80
|
+
blockedAt: now.toISOString(),
|
|
81
|
+
expiresAt: expiresAt.toISOString(),
|
|
82
|
+
reason,
|
|
83
|
+
autoUnblock: this.config.autoUnblockEnabled,
|
|
84
|
+
};
|
|
85
|
+
this.blocked.set(ip, record);
|
|
86
|
+
// Set auto-unblock timer
|
|
87
|
+
if (this.config.autoUnblockEnabled) {
|
|
88
|
+
const timer = setTimeout(() => {
|
|
89
|
+
void this.unblock(ip, 'auto-unblock: duration expired');
|
|
90
|
+
}, duration);
|
|
91
|
+
// Don't prevent process exit
|
|
92
|
+
if (timer.unref)
|
|
93
|
+
timer.unref();
|
|
94
|
+
this.unblockTimers.set(ip, timer);
|
|
95
|
+
}
|
|
96
|
+
logger.info(`Blocked IP ${ip} for ${Math.round(duration / 60000)} minutes. Reason: ${reason}`);
|
|
97
|
+
return { success: true, message: `IP ${ip} blocked until ${expiresAt.toISOString()}` };
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Unblock an IP address
|
|
101
|
+
* 解封 IP 位址
|
|
102
|
+
*/
|
|
103
|
+
async unblock(ip, reason) {
|
|
104
|
+
if (!this.blocked.has(ip)) {
|
|
105
|
+
return { success: true, message: `IP ${ip} is not blocked` };
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
await this.removeFirewallRule(ip);
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
112
|
+
logger.error(`Failed to unblock IP ${ip}: ${msg}`);
|
|
113
|
+
return { success: false, message: `Firewall error: ${msg}` };
|
|
114
|
+
}
|
|
115
|
+
this.blocked.delete(ip);
|
|
116
|
+
// Clear timer
|
|
117
|
+
const timer = this.unblockTimers.get(ip);
|
|
118
|
+
if (timer) {
|
|
119
|
+
clearTimeout(timer);
|
|
120
|
+
this.unblockTimers.delete(ip);
|
|
121
|
+
}
|
|
122
|
+
logger.info(`Unblocked IP ${ip}. Reason: ${reason}`);
|
|
123
|
+
return { success: true, message: `IP ${ip} unblocked` };
|
|
124
|
+
}
|
|
125
|
+
/** Add whitelist entry / 新增白名單條目 */
|
|
126
|
+
addToWhitelist(ip) {
|
|
127
|
+
this.whitelist.add(ip);
|
|
128
|
+
}
|
|
129
|
+
/** Clean up all timers / 清理所有計時器 */
|
|
130
|
+
destroy() {
|
|
131
|
+
for (const timer of this.unblockTimers.values()) {
|
|
132
|
+
clearTimeout(timer);
|
|
133
|
+
}
|
|
134
|
+
this.unblockTimers.clear();
|
|
135
|
+
}
|
|
136
|
+
// -- Platform firewall commands --
|
|
137
|
+
async addFirewallRule(ip) {
|
|
138
|
+
const os = platform();
|
|
139
|
+
if (os === 'darwin') {
|
|
140
|
+
await execFilePromise('/sbin/pfctl', ['-t', 'panguard_blocked', '-T', 'add', ip]);
|
|
141
|
+
}
|
|
142
|
+
else if (os === 'linux') {
|
|
143
|
+
await execFilePromise('/sbin/iptables', ['-A', 'INPUT', '-s', ip, '-j', 'DROP']);
|
|
144
|
+
}
|
|
145
|
+
else if (os === 'win32') {
|
|
146
|
+
await execFilePromise('netsh', [
|
|
147
|
+
'advfirewall',
|
|
148
|
+
'firewall',
|
|
149
|
+
'add',
|
|
150
|
+
'rule',
|
|
151
|
+
`name=Panguard_Block_${ip}`,
|
|
152
|
+
'dir=in',
|
|
153
|
+
'action=block',
|
|
154
|
+
`remoteip=${ip}`,
|
|
155
|
+
]);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
async removeFirewallRule(ip) {
|
|
159
|
+
const os = platform();
|
|
160
|
+
if (os === 'darwin') {
|
|
161
|
+
await execFilePromise('/sbin/pfctl', ['-t', 'panguard_blocked', '-T', 'delete', ip]);
|
|
162
|
+
}
|
|
163
|
+
else if (os === 'linux') {
|
|
164
|
+
await execFilePromise('/sbin/iptables', ['-D', 'INPUT', '-s', ip, '-j', 'DROP']);
|
|
165
|
+
}
|
|
166
|
+
else if (os === 'win32') {
|
|
167
|
+
await execFilePromise('netsh', [
|
|
168
|
+
'advfirewall',
|
|
169
|
+
'firewall',
|
|
170
|
+
'delete',
|
|
171
|
+
'rule',
|
|
172
|
+
`name=Panguard_Block_${ip}`,
|
|
173
|
+
]);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/** Validate IPv4 or IPv6 format / 驗證 IPv4 或 IPv6 格式 */
|
|
178
|
+
function isValidIP(ip) {
|
|
179
|
+
return /^[\d.]+$/.test(ip) || /^[a-fA-F\d:]+$/.test(ip);
|
|
180
|
+
}
|
|
181
|
+
function execFilePromise(command, args) {
|
|
182
|
+
return new Promise((resolve, reject) => {
|
|
183
|
+
execFile(command, args, { timeout: 10000 }, (error, stdout) => {
|
|
184
|
+
if (error)
|
|
185
|
+
reject(error);
|
|
186
|
+
else
|
|
187
|
+
resolve(stdout);
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=ip-blocker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ip-blocker.js","sourceRoot":"","sources":["../../src/response/ip-blocker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Process Killer - Terminate processes with child cleanup and safety checks
|
|
3
|
+
* 程序終止器 - 終止程序(含子程序清理與安全檢查)
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - Kill process and all child processes (process tree)
|
|
7
|
+
* - Protected process list (never kill system-critical processes)
|
|
8
|
+
* - SIGTERM first, SIGKILL after timeout
|
|
9
|
+
* - Cross-platform support
|
|
10
|
+
*
|
|
11
|
+
* @module @panguard-ai/panguard-guard/response/process-killer
|
|
12
|
+
*/
|
|
13
|
+
/** Process kill result / 程序終止結果 */
|
|
14
|
+
export interface KillResult {
|
|
15
|
+
pid: number;
|
|
16
|
+
processName?: string;
|
|
17
|
+
success: boolean;
|
|
18
|
+
message: string;
|
|
19
|
+
childrenKilled: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Process Killer with safety checks and tree killing
|
|
23
|
+
* 程序終止器(含安全檢查與程序樹終止)
|
|
24
|
+
*/
|
|
25
|
+
export declare class ProcessKiller {
|
|
26
|
+
private readonly additionalProtected;
|
|
27
|
+
constructor(additionalProtectedProcesses?: string[]);
|
|
28
|
+
/** Check if process name is protected / 檢查程序名稱是否受保護 */
|
|
29
|
+
isProtected(nameOrPid: string | number): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Kill a process and optionally its children
|
|
32
|
+
* 終止程序(可選終止子程序)
|
|
33
|
+
*/
|
|
34
|
+
kill(pid: number, options?: {
|
|
35
|
+
processName?: string;
|
|
36
|
+
killChildren?: boolean;
|
|
37
|
+
gracePeriodMs?: number;
|
|
38
|
+
}): Promise<KillResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Get child PIDs of a process / 取得程序的子 PID
|
|
41
|
+
*/
|
|
42
|
+
private getChildPIDs;
|
|
43
|
+
/**
|
|
44
|
+
* Wait for process to exit, return true if still alive
|
|
45
|
+
* 等待程序退出,如果仍存活則回傳 true
|
|
46
|
+
*/
|
|
47
|
+
private waitForExit;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=process-killer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-killer.d.ts","sourceRoot":"","sources":["../../src/response/process-killer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH,mCAAmC;AACnC,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;CACxB;AA6CD;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAc;gBAEtC,4BAA4B,GAAE,MAAM,EAAO;IAIvD,uDAAuD;IACvD,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO;IAOhD;;;OAGG;IACG,IAAI,CACR,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAO,GACrF,OAAO,CAAC,UAAU,CAAC;IA6FtB;;OAEG;YACW,YAAY;IA4B1B;;;OAGG;IACH,OAAO,CAAC,WAAW;CAkBpB"}
|