From c83c27bd532b009e997d39076c10c446815bdc86 Mon Sep 17 00:00:00 2001 From: XiaoTan <16686956+bh1xaq@users.noreply.github.com> Date: Mon, 24 Nov 2025 14:31:24 +0800 Subject: [PATCH 01/27] feat: add Loong64 support for the agent. --- Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 111228c..a54e4d4 100644 --- a/Makefile +++ b/Makefile @@ -33,6 +33,7 @@ build-agents: $(GOFLAGS) GOOS=linux GOARCH=amd64 go build -ldflags="$(LDFLAGS)" -o bin/agents/pika-agent-linux-amd64 cmd/agent/*.go $(GOFLAGS) GOOS=linux GOARCH=arm64 go build -ldflags="$(LDFLAGS)" -o bin/agents/pika-agent-linux-arm64 cmd/agent/*.go $(GOFLAGS) GOOS=linux GOARCH=arm GOARM=7 go build -ldflags="$(LDFLAGS)" -o bin/agents/pika-agent-linux-armv7 cmd/agent/*.go + $(GOFLAGS) GOOS=linux GOARCH=loong64 go build -ldflags="$(LDFLAGS)" -o bin/agents/pika-agent-linux-loong64 cmd/agent/*.go # macOS $(GOFLAGS) GOOS=darwin GOARCH=amd64 go build -ldflags="$(LDFLAGS)" -o bin/agents/pika-agent-darwin-amd64 cmd/agent/*.go @@ -82,4 +83,4 @@ version: @echo "Version: $(VERSION)" @echo "Git Revision: $(GIT_REVISION)" @echo "Go Version: $(GO_VERSION)" - @echo "Build Time: $(BUILD_TIME)" \ No newline at end of file + @echo "Build Time: $(BUILD_TIME)" From a46fd545e43a2d481986fb54607bf6fb15785103 Mon Sep 17 00:00:00 2001 From: XiaoTan <16686956+bh1xaq@users.noreply.github.com> Date: Mon, 24 Nov 2025 08:34:18 +0000 Subject: [PATCH 02/27] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E5=AF=B9=20Loo?= =?UTF-8?q?ng64=20=E6=9E=B6=E6=9E=84=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 2 +- web/src/pages/Agents/AgentInstall.tsx | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index a54e4d4..f6e3862 100644 --- a/Makefile +++ b/Makefile @@ -33,7 +33,7 @@ build-agents: $(GOFLAGS) GOOS=linux GOARCH=amd64 go build -ldflags="$(LDFLAGS)" -o bin/agents/pika-agent-linux-amd64 cmd/agent/*.go $(GOFLAGS) GOOS=linux GOARCH=arm64 go build -ldflags="$(LDFLAGS)" -o bin/agents/pika-agent-linux-arm64 cmd/agent/*.go $(GOFLAGS) GOOS=linux GOARCH=arm GOARM=7 go build -ldflags="$(LDFLAGS)" -o bin/agents/pika-agent-linux-armv7 cmd/agent/*.go - $(GOFLAGS) GOOS=linux GOARCH=loong64 go build -ldflags="$(LDFLAGS)" -o bin/agents/pika-agent-linux-loong64 cmd/agent/*.go + $(GOFLAGS) GOOS=linux GOARCH=loong64 go build -ldflags="$(LDFLAGS)" -o bin/agents/pika-agent-linux-loong64 cmd/agent/*.go # macOS $(GOFLAGS) GOOS=darwin GOARCH=amd64 go build -ldflags="$(LDFLAGS)" -o bin/agents/pika-agent-darwin-amd64 cmd/agent/*.go diff --git a/web/src/pages/Agents/AgentInstall.tsx b/web/src/pages/Agents/AgentInstall.tsx index 8ccebd3..82c9a84 100644 --- a/web/src/pages/Agents/AgentInstall.tsx +++ b/web/src/pages/Agents/AgentInstall.tsx @@ -52,6 +52,11 @@ const AgentInstall = () => { icon: Linux, downloadUrl: '/api/agent/downloads/agent-linux-arm64', }, + 'linux-loong64': { + name: 'Linux (LoongArch64)', + icon: Linux, + downloadUrl: '/api/agent/downloads/agent-linux-loong64', + }, 'darwin-amd64': { name: 'macOS (Intel)', icon: macOS, From 15cee6a1a03642ca4170eb3bf3164c26d70a5fbe Mon Sep 17 00:00:00 2001 From: dushixiang Date: Mon, 24 Nov 2025 21:32:21 +0800 Subject: [PATCH 03/27] =?UTF-8?q?=E7=A7=BB=E9=99=A4SSH=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=A3=80=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/agent/agent.example.yaml | 5 ++++ go.mod | 16 ++++++------ go.sum | 20 +++++++++++++++ pkg/agent/audit/check_ssh.go | 48 ++---------------------------------- 4 files changed, 35 insertions(+), 54 deletions(-) diff --git a/cmd/agent/agent.example.yaml b/cmd/agent/agent.example.yaml index 006e556..e95b70c 100644 --- a/cmd/agent/agent.example.yaml +++ b/cmd/agent/agent.example.yaml @@ -31,6 +31,11 @@ collector: # 建议: 30-120 秒 heartbeat_interval: 30 + # 网络采集包含的网卡列表(白名单,支持正则表达式) + # 如果配置了此项,则只采集匹配的网卡,忽略 network_exclude + # 例如: ["^eth0$", "^en0$", "^ens.*"] + network_include: [] + # 网络采集排除的网卡列表(可选,支持正则表达式) # 如果不配置,默认只排除回环地址(lo, lo0) # 支持正则表达式匹配网卡名称 diff --git a/go.mod b/go.mod index 7c5ebfd..eea15e2 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/dushixiang/pika go 1.25.0 require ( - github.com/coreos/go-oidc/v3 v3.16.0 + github.com/coreos/go-oidc/v3 v3.17.0 github.com/fsnotify/fsnotify v1.9.0 github.com/go-errors/errors v1.5.1 github.com/go-orz/orz v0.2.9 @@ -21,8 +21,8 @@ require ( github.com/prometheus-community/pro-bing v0.7.0 github.com/shirou/gopsutil/v4 v4.25.10 github.com/spf13/cobra v1.10.1 - go.uber.org/zap v1.27.0 - golang.org/x/crypto v0.43.0 + go.uber.org/zap v1.27.1 + golang.org/x/crypto v0.45.0 golang.org/x/oauth2 v0.33.0 gopkg.in/yaml.v3 v3.0.1 gorm.io/datatypes v1.2.7 @@ -70,17 +70,17 @@ require ( github.com/yusufpapurcu/wmi v1.2.4 // indirect go.uber.org/multierr v1.11.0 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 // indirect - golang.org/x/net v0.46.0 // indirect + golang.org/x/exp v0.0.0-20251113190631-e25ba8c21ef6 // indirect + golang.org/x/net v0.47.0 // indirect golang.org/x/sync v0.18.0 // indirect golang.org/x/sys v0.38.0 // indirect - golang.org/x/text v0.30.0 // indirect + golang.org/x/text v0.31.0 // indirect golang.org/x/time v0.11.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gorm.io/driver/mysql v1.6.0 // indirect gorm.io/driver/postgres v1.6.0 // indirect - modernc.org/libc v1.66.10 // indirect + modernc.org/libc v1.67.1 // indirect modernc.org/mathutil v1.7.1 // indirect modernc.org/memory v1.11.0 // indirect - modernc.org/sqlite v1.40.0 // indirect + modernc.org/sqlite v1.40.1 // indirect ) diff --git a/go.sum b/go.sum index d1b9269..7ea88ed 100644 --- a/go.sum +++ b/go.sum @@ -2,6 +2,8 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= github.com/coreos/go-oidc/v3 v3.16.0 h1:qRQUCFstKpXwmEjDQTIbyY/5jF00+asXzSkmkoa/mow= github.com/coreos/go-oidc/v3 v3.16.0/go.mod h1:wqPbKFrVnE90vty060SB40FCJ8fTHTxSwyXJqZH+sI8= +github.com/coreos/go-oidc/v3 v3.17.0 h1:hWBGaQfbi0iVviX4ibC7bk8OKT5qNr4klBaCHVNvehc= +github.com/coreos/go-oidc/v3 v3.17.0/go.mod h1:wqPbKFrVnE90vty060SB40FCJ8fTHTxSwyXJqZH+sI8= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -150,16 +152,25 @@ go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= +go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 h1:mgKeJMpvi0yx/sU5GsxQ7p6s2wtOnGAHZWCHUM4KGzY= golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546/go.mod h1:j/pmGrbnkbPtQfxEe5D0VQhZC6qKbfKifgD0oM7sR70= +golang.org/x/exp v0.0.0-20251113190631-e25ba8c21ef6 h1:zfMcR1Cs4KNuomFFgGefv5N0czO2XZpUbxGUy8i8ug0= +golang.org/x/exp v0.0.0-20251113190631-e25ba8c21ef6/go.mod h1:46edojNIoXTNOhySWIWdix628clX9ODXwPsQuG6hsK0= golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk= golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= golang.org/x/oauth2 v0.33.0 h1:4Q+qn+E5z8gPRJfmRy7C2gGG3T4jIprK6aSYgTXGRpo= golang.org/x/oauth2 v0.33.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= @@ -171,10 +182,13 @@ golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= +golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= @@ -198,8 +212,10 @@ gorm.io/gorm v1.31.1 h1:7CA8FTFz/gRfgqgpeKIBcervUn3xSyPUmr6B2WXJ7kg= gorm.io/gorm v1.31.1/go.mod h1:XyQVbO2k6YkOis7C2437jSit3SsDK72s7n7rsSHd+Gs= modernc.org/cc/v4 v4.26.5 h1:xM3bX7Mve6G8K8b+T11ReenJOT+BmVqQj0FY5T4+5Y4= modernc.org/cc/v4 v4.26.5/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= +modernc.org/cc/v4 v4.27.1 h1:9W30zRlYrefrDV2JE2O8VDtJ1yPGownxciz5rrbQZis= modernc.org/ccgo/v4 v4.28.1 h1:wPKYn5EC/mYTqBO373jKjvX2n+3+aK7+sICCv4Fjy1A= modernc.org/ccgo/v4 v4.28.1/go.mod h1:uD+4RnfrVgE6ec9NGguUNdhqzNIeeomeXf6CL0GTE5Q= +modernc.org/ccgo/v4 v4.30.1 h1:4r4U1J6Fhj98NKfSjnPUN7Ze2c6MnAdL0hWw6+LrJpc= modernc.org/fileutil v1.3.40 h1:ZGMswMNc9JOCrcrakF1HrvmergNLAmxOPjizirpfqBA= modernc.org/fileutil v1.3.40/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc= modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI= @@ -208,6 +224,8 @@ modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks= modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI= modernc.org/libc v1.66.10 h1:yZkb3YeLx4oynyR+iUsXsybsX4Ubx7MQlSYEw4yj59A= modernc.org/libc v1.66.10/go.mod h1:8vGSEwvoUoltr4dlywvHqjtAqHBaw0j1jI7iFBTAr2I= +modernc.org/libc v1.67.1 h1:bFaqOaa5/zbWYJo8aW0tXPX21hXsngG2M7mckCnFSVk= +modernc.org/libc v1.67.1/go.mod h1:QvvnnJ5P7aitu0ReNpVIEyesuhmDLQ8kaEoyMjIFZJA= modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI= @@ -218,6 +236,8 @@ modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= modernc.org/sqlite v1.40.0 h1:bNWEDlYhNPAUdUdBzjAvn8icAs/2gaKlj4vM+tQ6KdQ= modernc.org/sqlite v1.40.0/go.mod h1:9fjQZ0mB1LLP0GYrp39oOJXx/I2sxEnZtzCmEQIKvGE= +modernc.org/sqlite v1.40.1 h1:VfuXcxcUWWKRBuP8+BR9L7VnmusMgBNNnBYGEe9w/iY= +modernc.org/sqlite v1.40.1/go.mod h1:9fjQZ0mB1LLP0GYrp39oOJXx/I2sxEnZtzCmEQIKvGE= modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= diff --git a/pkg/agent/audit/check_ssh.go b/pkg/agent/audit/check_ssh.go index 38614c3..071e997 100644 --- a/pkg/agent/audit/check_ssh.go +++ b/pkg/agent/audit/check_ssh.go @@ -100,20 +100,7 @@ func (sc *SSHChecker) Check() protocol.SecurityCheck { }) } - // 3. 检查 SSH 后门进程 - suspiciousSSHD := sc.checkSuspiciousSSHD() - if len(suspiciousSSHD) > 0 { - check.Status = StatusFail - for _, sshd := range suspiciousSSHD { - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: "backdoor_sshd", - Status: StatusFail, - Message: sshd, - }) - } - } - - // 4. 检查 SSH 二进制文件完整性 + // 3. 检查 SSH 二进制文件完整性 for _, binPath := range sc.config.SSHConfig.BinaryPaths { info, err := os.Stat(binPath) if err != nil { @@ -162,7 +149,7 @@ func (sc *SSHChecker) Check() protocol.SecurityCheck { case StatusWarn: check.Message = "SSH配置存在风险" case StatusFail: - check.Message = "检测到SSH后门" + check.Message = "SSH配置存在严重风险" } return check @@ -307,37 +294,6 @@ func (sc *SSHChecker) readSSHConfig() map[string]string { return config } -// checkSuspiciousSSHD 检查可疑的 sshd 进程 -func (sc *SSHChecker) checkSuspiciousSSHD() []string { - var suspicious []string - - procs, err := sc.cache.Get() - if err != nil { - return suspicious - } - - sshdCount := 0 - for _, p := range procs { - name, _ := p.Name() - if strings.Contains(name, "sshd") { - sshdCount++ - exe, _ := p.Exe() - - // 检查 sshd 路径是否正常 - if exe != "" && !strings.HasPrefix(exe, "/usr/sbin/sshd") { - suspicious = append(suspicious, fmt.Sprintf("异常sshd路径: %s (PID: %d)", exe, p.Pid)) - } - } - } - - // 如果有多个 sshd 守护进程可能异常 - if sshdCount > 10 { - suspicious = append(suspicious, fmt.Sprintf("sshd进程数异常: %d", sshdCount)) - } - - return suspicious -} - // UserDirectory 用户目录信息 type UserDirectory struct { Username string From 935bcaa8ed344607e0e3acec5b8128119d2c125a Mon Sep 17 00:00:00 2001 From: dushixiang Date: Mon, 24 Nov 2025 21:47:34 +0800 Subject: [PATCH 04/27] =?UTF-8?q?=E6=8E=A2=E9=92=88=E9=83=A8=E7=BD=B2?= =?UTF-8?q?=E6=8C=87=E5=8D=97=E9=A1=B5=E9=9D=A2=E5=A2=9E=E5=8A=A0=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E6=8C=89=E9=92=AE&=E4=BC=98=E5=8C=96=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E9=80=89=E4=B8=AD=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/pages/AdminLayout/index.tsx | 87 +++++------- web/src/pages/Agents/AgentInstall.tsx | 184 +++++++++++++------------- 2 files changed, 126 insertions(+), 145 deletions(-) diff --git a/web/src/pages/AdminLayout/index.tsx b/web/src/pages/AdminLayout/index.tsx index 5ce3c67..80e2001 100644 --- a/web/src/pages/AdminLayout/index.tsx +++ b/web/src/pages/AdminLayout/index.tsx @@ -1,12 +1,12 @@ -import { type JSX, useEffect, useMemo, useState } from 'react'; -import { Outlet, useLocation, useNavigate } from 'react-router-dom'; -import type { MenuProps } from 'antd'; -import { App, Avatar, Button, Dropdown, Space } from 'antd'; -import { Eye, Key, LogOut, Server, User as UserIcon, BookOpen, Settings, Activity } from 'lucide-react'; -import { logout } from '../../api/auth'; -import { getServerVersion } from '../../api/agent'; -import type { User } from '../../types'; -import { cn } from '../../lib/utils'; +import {type JSX, useEffect, useMemo, useState} from 'react'; +import {Outlet, useLocation, useNavigate} from 'react-router-dom'; +import type {MenuProps} from 'antd'; +import {App, Avatar, Button, Dropdown, Space} from 'antd'; +import {Activity, Eye, Key, LogOut, Server, Settings, User as UserIcon} from 'lucide-react'; +import {logout} from '../../api/auth'; +import {getServerVersion} from '../../api/agent'; +import type {User} from '../../types'; +import {cn} from '../../lib/utils'; interface NavItem { key: string; @@ -21,9 +21,8 @@ const HEADER_HEIGHT = 56; const AdminLayout = () => { const navigate = useNavigate(); const location = useLocation(); - const { message: messageApi, modal } = App.useApp(); + const {message: messageApi, modal} = App.useApp(); const [userInfo, setUserInfo] = useState(null); - const [selectedKey, setSelectedKey] = useState('agents'); const [version, setVersion] = useState(''); const menuItems: NavItem[] = useMemo( @@ -32,25 +31,25 @@ const AdminLayout = () => { key: 'agents', label: '探针管理', path: '/admin/agents', - icon: , + icon: , }, { key: 'api-keys', label: 'API密钥', path: '/admin/api-keys', - icon: , + icon: , }, { key: 'monitors', label: '服务监控', path: '/admin/monitors', - icon: , + icon: , }, { key: 'settings', label: '系统设置', path: '/admin/settings', - icon: , + icon: , }, ], [], @@ -67,17 +66,6 @@ const AdminLayout = () => { setUserInfo(JSON.parse(userInfoStr)); - const path = location.pathname; - if (path.startsWith('/admin/api-keys')) { - setSelectedKey('api-keys'); - } else if (path.startsWith('/admin/monitors')) { - setSelectedKey('monitors'); - } else if (path.startsWith('/admin/settings')) { - setSelectedKey('settings'); - } else { - setSelectedKey('agents'); - } - // 获取服务端版本信息 getServerVersion() .then((res) => { @@ -108,29 +96,25 @@ const AdminLayout = () => { const userMenuItems: MenuProps['items'] = [ { key: 'logout', - icon: , + icon: , label: '退出登录', onClick: handleLogout, }, ]; const handleNavigate = (item: NavItem) => { - if (item.key === selectedKey) { - return; - } - - setSelectedKey(item.key); navigate(item.path); }; return (
{/* 顶部导航栏 */} -
+
- Pika + Pika

Pika Monitor

@@ -141,28 +125,20 @@ const AdminLayout = () => { - - + ); })} @@ -228,7 +205,8 @@ const AdminLayout = () => {

{version}

-

Pika Monitor

+

Pika + Monitor

@@ -238,20 +216,22 @@ const AdminLayout = () => { {/* 主内容区 */} -
+
{/* 内容区域 */}
- +
{/* 移动端底部导航栏 */} -
+ ); +}; + +export default SystemConfigComponent; diff --git a/web/src/pages/Settings/index.tsx b/web/src/pages/Settings/index.tsx index fc8533d..974b19e 100644 --- a/web/src/pages/Settings/index.tsx +++ b/web/src/pages/Settings/index.tsx @@ -1,11 +1,22 @@ import {Tabs} from 'antd'; -import {Bell, MessageSquare} from 'lucide-react'; +import {Bell, MessageSquare, Settings2} from 'lucide-react'; import AlertSettings from './AlertSettings'; import NotificationChannels from './NotificationChannels'; +import SystemConfig from './SystemConfig'; import {PageHeader} from "../../components"; const Settings = () => { const items = [ + { + key: 'system', + label: ( + + + 系统配置 + + ), + children: , + }, { key: 'channels', label: ( @@ -34,7 +45,7 @@ const Settings = () => { title="系统设置" description="CONFIGURATION" /> - From c49122d4f19469a6ae4201b41fbb94b01e3c2ddc Mon Sep 17 00:00:00 2001 From: dushixiang Date: Tue, 25 Nov 2025 20:21:31 +0800 Subject: [PATCH 07/27] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/app.go | 35 ++++++- internal/handler/property_handler.go | 111 +++++++++++++---------- internal/models/property.go | 6 ++ internal/service/property_service.go | 11 +++ pkg/replace/fs.go | 31 +++++++ web/assets.go | 7 ++ web/index.html | 11 ++- web/src/api/system-config.ts | 15 +-- web/src/components/PublicHeader.tsx | 22 +---- web/src/global.d.ts | 10 ++ web/src/pages/AdminLayout/index.tsx | 24 +---- web/src/pages/Settings/AlertSettings.tsx | 18 ++-- web/src/pages/Settings/SystemConfig.tsx | 2 +- 13 files changed, 189 insertions(+), 114 deletions(-) create mode 100644 pkg/replace/fs.go create mode 100644 web/src/global.d.ts diff --git a/internal/app.go b/internal/app.go index da825df..b10c3e9 100644 --- a/internal/app.go +++ b/internal/app.go @@ -1,7 +1,9 @@ package internal import ( + "bytes" "context" + "html/template" "log" "net/http" "strings" @@ -11,8 +13,10 @@ import ( "github.com/dushixiang/pika/internal/handler" "github.com/dushixiang/pika/internal/models" "github.com/dushixiang/pika/internal/scheduler" + "github.com/dushixiang/pika/pkg/replace" "github.com/dushixiang/pika/web" "github.com/google/uuid" + "github.com/spf13/afero/mem" "github.com/go-errors/errors" "github.com/go-orz/orz" @@ -97,6 +101,10 @@ func setupApi(app *orz.App, components *AppComponents) { e.Use(middleware.Recover()) e.Use(ErrorHandler(logger)) + indexTemplate, err := template.New("index").Parse(web.IndexHtml()) + if err != nil { + logger.Fatal("failed to parse index.html", zap.Error(err)) + } // 静态文件服务 e.Use(middleware.StaticWithConfig(middleware.StaticConfig{ Skipper: func(c echo.Context) bool { @@ -114,7 +122,28 @@ func setupApi(app *orz.App, components *AppComponents) { HTML5: true, Browse: false, IgnoreBase: false, - Filesystem: http.FS(web.Assets()), + Filesystem: replace.FS(http.FS(web.Assets()), func(name string, file http.File) (http.File, error) { + if name == "index.html" { + fileData := mem.CreateFile(name) + fileHandle := mem.NewFileHandle(fileData) + + systemConfig, err := components.PropertyService.GetSystemConfig(context.Background()) + if err != nil { + return file, nil + } + + var buf bytes.Buffer + err = indexTemplate.Execute(&buf, systemConfig) + if err != nil { + return file, err + } + if _, err := fileHandle.Write(buf.Bytes()); err != nil { + return nil, err + } + return fileHandle, nil + } + return file, nil + }), })) customValidator := CustomValidator{Validator: validator.New()} @@ -154,8 +183,8 @@ func setupApi(app *orz.App, components *AppComponents) { publicApiWithOptionalAuth.GET("/monitors/:id/stats", components.MonitorHandler.GetStatsByID) publicApiWithOptionalAuth.GET("/monitors/:id/history", components.MonitorHandler.GetHistoryByID) - // 系统配置(公开访问)- 用于公共页面显示系统名称和 Logo - publicApiWithOptionalAuth.GET("/system-config", components.PropertyHandler.GetSystemConfig) + // Logo(公开访问)- 用于公共页面只获取 Logo + publicApiWithOptionalAuth.GET("/logo", components.PropertyHandler.GetLogo) } // WebSocket 路由(探针连接) diff --git a/internal/handler/property_handler.go b/internal/handler/property_handler.go index 4bd3cb7..fd85708 100644 --- a/internal/handler/property_handler.go +++ b/internal/handler/property_handler.go @@ -1,21 +1,16 @@ package handler import ( + "encoding/base64" "encoding/json" "net/http" + "github.com/dushixiang/pika/internal/models" "github.com/dushixiang/pika/internal/service" "github.com/labstack/echo/v4" "go.uber.org/zap" ) -const ( - // PropertyIDNotificationChannels 通知渠道配置的固定 ID - PropertyIDNotificationChannels = "notification_channels" - // PropertyIDSystemConfig 系统配置的固定 ID - PropertyIDSystemConfig = "system_config" -) - type PropertyHandler struct { logger *zap.Logger service *service.PropertyService @@ -103,38 +98,72 @@ func (h *PropertyHandler) DeleteProperty(c echo.Context) error { }) } -// GetSystemConfig 获取系统配置(公开访问,仅返回系统配置) -func (h *PropertyHandler) GetSystemConfig(c echo.Context) error { - property, err := h.service.Get(c.Request().Context(), PropertyIDSystemConfig) +// GetLogo 获取系统 Logo(公开访问,返回图片文件流) +func (h *PropertyHandler) GetLogo(c echo.Context) error { + sysConfig, err := h.service.GetSystemConfig(c.Request().Context()) if err != nil { - // 如果配置不存在,返回默认值 - return c.JSON(http.StatusOK, map[string]interface{}{ - "id": PropertyIDSystemConfig, - "name": "系统配置", - "value": map[string]string{ - "systemNameEn": "Pika Monitor", - "systemNameZh": "皮卡监控", - "logoBase64": "", - }, - }) + // 如果配置不存在,返回 404 + return echo.NewHTTPError(http.StatusNotFound, "Logo 不存在") } - // 解析 JSON 值 - var value interface{} - if property.Value != "" { - if err := json.Unmarshal([]byte(property.Value), &value); err != nil { - h.logger.Error("解析属性值失败", zap.String("id", PropertyIDSystemConfig), zap.Error(err)) - return c.JSON(http.StatusInternalServerError, map[string]string{ - "error": "解析属性值失败", - }) + // 提取 logoBase64 字段 + logoBase64 := sysConfig.LogoBase64 + if logoBase64 == "" { + return echo.NewHTTPError(http.StatusNotFound, "Logo 不存在") + } + + // 解析 base64 数据 + // 格式: data:image/png;base64,iVBORw0KGgoAAAANS... + var imageData []byte + var contentType string + + // 检查是否包含 data URI 前缀 + if len(logoBase64) > 0 && logoBase64[:5] == "data:" { + // 查找逗号位置 + commaIndex := -1 + for i := 0; i < len(logoBase64) && i < 100; i++ { + if logoBase64[i] == ',' { + commaIndex = i + break + } } + + if commaIndex == -1 { + return echo.NewHTTPError(http.StatusInternalServerError, "无效的图片数据格式") + } + + // 提取 MIME 类型 + header := logoBase64[5:commaIndex] + if len(header) > 7 && header[len(header)-7:] == ";base64" { + contentType = header[:len(header)-7] + } else { + contentType = "image/png" // 默认类型 + } + + // 解码 base64 + base64Data := logoBase64[commaIndex+1:] + var decodeErr error + imageData, decodeErr = base64.StdEncoding.DecodeString(base64Data) + if decodeErr != nil { + h.logger.Error("解码 base64 失败", zap.Error(decodeErr)) + return echo.NewHTTPError(http.StatusInternalServerError, "解码图片数据失败") + } + } else { + // 直接是 base64 字符串 + var decodeErr error + imageData, decodeErr = base64.StdEncoding.DecodeString(logoBase64) + if decodeErr != nil { + h.logger.Error("解码 base64 失败", zap.Error(decodeErr)) + return echo.NewHTTPError(http.StatusInternalServerError, "解码图片数据失败") + } + contentType = "image/png" // 默认类型 } - return c.JSON(http.StatusOK, map[string]interface{}{ - "id": property.ID, - "name": property.Name, - "value": value, - }) + // 设置响应头 + c.Response().Header().Set("Content-Type", contentType) + c.Response().Header().Set("Cache-Control", "public, max-age=3600") // 缓存 1 小时 + + return c.Blob(http.StatusOK, contentType, imageData) } // TestNotificationChannel 测试通知渠道(从数据库读取配置) @@ -148,14 +177,7 @@ func (h *PropertyHandler) TestNotificationChannel(c echo.Context) error { ctx := c.Request().Context() - // 从数据库获取通知渠道配置 - var channels []struct { - Type string `json:"type"` - Enabled bool `json:"enabled"` - Config map[string]interface{} `json:"config"` - } - - err := h.service.GetValue(ctx, PropertyIDNotificationChannels, &channels) + channels, err := h.service.GetNotificationChannelConfigs(c.Request().Context()) if err != nil { h.logger.Error("获取通知渠道配置失败", zap.Error(err)) return c.JSON(http.StatusInternalServerError, map[string]string{ @@ -164,12 +186,7 @@ func (h *PropertyHandler) TestNotificationChannel(c echo.Context) error { } // 查找指定类型的渠道 - var targetChannel *struct { - Type string `json:"type"` - Enabled bool `json:"enabled"` - Config map[string]interface{} `json:"config"` - } - + var targetChannel *models.NotificationChannelConfig for i := range channels { if channels[i].Type == channelType { targetChannel = &channels[i] diff --git a/internal/models/property.go b/internal/models/property.go index c88db89..db9ac27 100644 --- a/internal/models/property.go +++ b/internal/models/property.go @@ -25,3 +25,9 @@ type NotificationChannelConfig struct { // wecom: { "secretKey": "xxx" } // feishu: { "secretKey": "xxx", "signSecret": "xxx" } // webhook: { "url": "https://..." } + +type SystemConfig struct { + SystemNameZh string `json:"systemNameZh"` // 系统名称(中文) + SystemNameEn string `json:"systemNameEn"` // 系统名称(英文) + LogoBase64 string `json:"logoBase64"` // 系统logo(base64编码) +} diff --git a/internal/service/property_service.go b/internal/service/property_service.go index c06dba5..de0c4d8 100644 --- a/internal/service/property_service.go +++ b/internal/service/property_service.go @@ -15,6 +15,8 @@ import ( const ( // PropertyIDNotificationChannels 通知渠道配置的固定 ID PropertyIDNotificationChannels = "notification_channels" + // PropertyIDSystemConfig 系统配置的固定 ID + PropertyIDSystemConfig = "system_config" ) type PropertyService struct { @@ -79,3 +81,12 @@ func (s *PropertyService) GetNotificationChannelConfigs(ctx context.Context) ([] } return allChannels, nil } + +func (s *PropertyService) GetSystemConfig(ctx context.Context) (*models.SystemConfig, error) { + var systemConfig models.SystemConfig + err := s.GetValue(ctx, PropertyIDSystemConfig, &systemConfig) + if err != nil { + return nil, fmt.Errorf("获取系统配置失败: %w", err) + } + return &systemConfig, nil +} diff --git a/pkg/replace/fs.go b/pkg/replace/fs.go new file mode 100644 index 0000000..50a86a6 --- /dev/null +++ b/pkg/replace/fs.go @@ -0,0 +1,31 @@ +package replace + +import ( + "net/http" +) + +type Replace func(name string, file http.File) (http.File, error) + +func FS(fs http.FileSystem, replace Replace) http.FileSystem { + return &replacerFS{ + FileSystem: fs, + Replace: replace, + } +} + +type replacerFS struct { + http.FileSystem + Replace +} + +func (f *replacerFS) Open(name string) (http.File, error) { + file, err := f.FileSystem.Open(name) + if err != nil { + return nil, err + } + replaced, err := f.Replace(name, file) + if err != nil { + return nil, err + } + return replaced, nil +} diff --git a/web/assets.go b/web/assets.go index 8b5c29f..8b0c87e 100644 --- a/web/assets.go +++ b/web/assets.go @@ -12,3 +12,10 @@ func Assets() fs.FS { sub, _ := fs.Sub(distFS, "dist") return sub } + +//go:embed dist/index.html +var indexHtml string + +func IndexHtml() string { + return indexHtml +} diff --git a/web/index.html b/web/index.html index 5926f6a..91c30f2 100644 --- a/web/index.html +++ b/web/index.html @@ -2,12 +2,19 @@ - + - 皮卡监控 + {{.SystemNameZh}} | {{.SystemNameEn}} +
+ diff --git a/web/src/api/system-config.ts b/web/src/api/system-config.ts index f6d072e..bd7f943 100644 --- a/web/src/api/system-config.ts +++ b/web/src/api/system-config.ts @@ -1,4 +1,4 @@ -import { get, put } from './request'; +import {get, put} from './request'; const PROPERTY_ID_SYSTEM_CONFIG = 'system_config'; @@ -28,19 +28,6 @@ export const getSystemConfig = async (): Promise => { } }; -// 获取系统配置(公开访问,不需要认证) -export const getPublicSystemConfig = async (): Promise => { - try { - const response = await get<{ id: string; name: string; value: SystemConfig }>( - `/system-config` - ); - return response.data.value || DEFAULT_SYSTEM_CONFIG; - } catch (error) { - // 如果配置不存在,返回默认值 - return DEFAULT_SYSTEM_CONFIG; - } -}; - // 保存系统配置 export const saveSystemConfig = async (config: SystemConfig): Promise => { await put(`/admin/properties/${PROPERTY_ID_SYSTEM_CONFIG}`, { diff --git a/web/src/components/PublicHeader.tsx b/web/src/components/PublicHeader.tsx index 5cb554f..62ac17c 100644 --- a/web/src/components/PublicHeader.tsx +++ b/web/src/components/PublicHeader.tsx @@ -2,8 +2,6 @@ import {useEffect, useState} from 'react'; import {Activity, LayoutGrid, List, LogIn, Server, Settings} from 'lucide-react'; import {getCurrentUser} from '../api/auth'; import {Link} from "react-router-dom"; -import {getPublicSystemConfig, DEFAULT_SYSTEM_CONFIG} from '../api/system-config'; -import type {SystemConfig} from '../api/system-config'; interface PublicHeaderProps { viewMode?: 'grid' | 'list'; @@ -17,21 +15,9 @@ const PublicHeader = ({ showViewToggle = false }: PublicHeaderProps) => { const [isLoggedIn, setIsLoggedIn] = useState(false); - const [systemConfig, setSystemConfig] = useState(DEFAULT_SYSTEM_CONFIG); const currentPath = window.location.pathname; useEffect(() => { - // 获取系统配置 - getPublicSystemConfig() - .then((config) => { - setSystemConfig(config); - // 更新网页 title - document.title = config.systemNameZh || DEFAULT_SYSTEM_CONFIG.systemNameZh; - }) - .catch((error) => { - console.error('获取系统配置失败:', error); - }); - // 检查本地是否有 token const token = localStorage.getItem('token'); const userInfo = localStorage.getItem('userInfo'); @@ -67,8 +53,8 @@ const PublicHeader = ({ {/* Logo 和品牌 */}
{'logo'} { e.currentTarget.src = '/logo.png'; @@ -76,10 +62,10 @@ const PublicHeader = ({ />

- {systemConfig.systemNameEn} + {window.SystemConfig?.SystemNameEn}

- {systemConfig.systemNameZh} + {window.SystemConfig?.SystemNameZh}

diff --git a/web/src/global.d.ts b/web/src/global.d.ts new file mode 100644 index 0000000..73d5613 --- /dev/null +++ b/web/src/global.d.ts @@ -0,0 +1,10 @@ +export {}; + +declare global { + interface Window { + SystemConfig: { + SystemNameZh: string; + SystemNameEn: string; + }; + } +} diff --git a/web/src/pages/AdminLayout/index.tsx b/web/src/pages/AdminLayout/index.tsx index a499c3b..8183e5e 100644 --- a/web/src/pages/AdminLayout/index.tsx +++ b/web/src/pages/AdminLayout/index.tsx @@ -5,8 +5,6 @@ import {App, Avatar, Button, Dropdown, Space} from 'antd'; import {Activity, BookOpen, Eye, Key, LogOut, Server, Settings, User as UserIcon} from 'lucide-react'; import {logout} from '../../api/auth'; import {getServerVersion} from '../../api/agent'; -import {getSystemConfig, DEFAULT_SYSTEM_CONFIG} from '../../api/system-config'; -import type {SystemConfig} from '../../api/system-config'; import type {User} from '../../types'; import {cn} from '../../lib/utils'; @@ -26,7 +24,6 @@ const AdminLayout = () => { const {message: messageApi, modal} = App.useApp(); const [userInfo, setUserInfo] = useState(null); const [version, setVersion] = useState(''); - const [systemConfig, setSystemConfig] = useState(DEFAULT_SYSTEM_CONFIG); const menuItems: NavItem[] = useMemo( () => [ @@ -69,17 +66,6 @@ const AdminLayout = () => { setUserInfo(JSON.parse(userInfoStr)); - // 获取系统配置 - getSystemConfig() - .then((config) => { - setSystemConfig(config); - // 更新网页 title - document.title = `${config.systemNameZh || DEFAULT_SYSTEM_CONFIG.systemNameZh} - 控制台`; - }) - .catch((error) => { - console.error('获取系统配置失败:', error); - }); - // 获取服务端版本信息 getServerVersion() .then((res) => { @@ -129,16 +115,16 @@ const AdminLayout = () => {
Logo { e.currentTarget.src = '/logo.png'; }} />
-

{systemConfig.systemNameEn}

+

{window.SystemConfig?.SystemNameZh}

控制台

@@ -154,7 +140,7 @@ const AdminLayout = () => {
diff --git a/web/src/pages/Settings/AlertSettings.tsx b/web/src/pages/Settings/AlertSettings.tsx index b48465c..7f2bc54 100644 --- a/web/src/pages/Settings/AlertSettings.tsx +++ b/web/src/pages/Settings/AlertSettings.tsx @@ -212,16 +212,14 @@ const AlertSettings = () => { -
- -
+
diff --git a/web/src/pages/Settings/SystemConfig.tsx b/web/src/pages/Settings/SystemConfig.tsx index 56b2427..277e7b3 100644 --- a/web/src/pages/Settings/SystemConfig.tsx +++ b/web/src/pages/Settings/SystemConfig.tsx @@ -212,7 +212,7 @@ const SystemConfigComponent = () => { Logo 预览 { e.currentTarget.src = '/logo.png'; }} From 73dff6acd0f948acfb5a26a305a1507ff379c802 Mon Sep 17 00:00:00 2001 From: dushixiang Date: Tue, 25 Nov 2025 20:25:07 +0800 Subject: [PATCH 08/27] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=85=AC=E5=BC=80?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/pages/Public/MonitorList.tsx | 2 +- web/src/pages/Public/ServerList.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/web/src/pages/Public/MonitorList.tsx b/web/src/pages/Public/MonitorList.tsx index cc25312..4e3665b 100644 --- a/web/src/pages/Public/MonitorList.tsx +++ b/web/src/pages/Public/MonitorList.tsx @@ -213,7 +213,7 @@ const MonitorList = () => { const renderListView = () => ( <> {/* 桌面端:使用表格布局 */} -
+
diff --git a/web/src/pages/Public/ServerList.tsx b/web/src/pages/Public/ServerList.tsx index d250572..5acefbf 100644 --- a/web/src/pages/Public/ServerList.tsx +++ b/web/src/pages/Public/ServerList.tsx @@ -289,7 +289,7 @@ const ServerList = () => { const renderListView = () => ( <> {/* 桌面端:使用表格布局 */} -
+
From 35b63583a3be17a331fb30cf19edb7bfa707234f Mon Sep 17 00:00:00 2001 From: dushixiang Date: Wed, 26 Nov 2025 21:49:15 +0800 Subject: [PATCH 09/27] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/app.go | 21 +- internal/handler/agent_handler.go | 2 +- internal/models/property.go | 1 + internal/protocol/message.go | 326 +++++++++++++- internal/repo/agent_repo.go | 13 + internal/repo/property_repo.go | 41 -- internal/service/agent_service.go | 51 +-- internal/service/property_service.go | 72 ++- pkg/agent/audit/asset_file.go | 340 ++++++++++++++ pkg/agent/audit/asset_file_unix.go | 19 + pkg/agent/audit/asset_file_windows.go | 16 + pkg/agent/audit/asset_kernel.go | 153 +++++++ pkg/agent/audit/asset_network.go | 433 ++++++++++++++++++ pkg/agent/audit/asset_process.go | 155 +++++++ pkg/agent/audit/asset_user.go | 392 ++++++++++++++++ pkg/agent/audit/audit.go | 204 ++++----- pkg/agent/audit/check_misc.go | 419 ------------------ pkg/agent/audit/check_network.go | 270 ----------- pkg/agent/audit/check_process.go | 513 --------------------- pkg/agent/audit/check_rootkit.go | 207 --------- pkg/agent/audit/check_ssh.go | 387 ---------------- web/assets.go | 18 + web/index.html | 1 + web/src/api/agent.ts | 106 ++++- web/src/api/system-config.ts | 21 +- web/src/components/PublicFooter.tsx | 15 + web/src/global.d.ts | 1 + web/src/pages/Agents/AgentDetail.tsx | 105 +---- web/src/pages/Agents/AuditResultView.tsx | 542 ++++++++++++++++------- web/src/pages/Login/index.tsx | 206 ++++----- web/src/pages/Settings/SystemConfig.tsx | 74 ++-- 31 files changed, 2695 insertions(+), 2429 deletions(-) create mode 100644 pkg/agent/audit/asset_file.go create mode 100644 pkg/agent/audit/asset_file_unix.go create mode 100644 pkg/agent/audit/asset_file_windows.go create mode 100644 pkg/agent/audit/asset_kernel.go create mode 100644 pkg/agent/audit/asset_network.go create mode 100644 pkg/agent/audit/asset_process.go create mode 100644 pkg/agent/audit/asset_user.go delete mode 100644 pkg/agent/audit/check_misc.go delete mode 100644 pkg/agent/audit/check_network.go delete mode 100644 pkg/agent/audit/check_process.go delete mode 100644 pkg/agent/audit/check_rootkit.go delete mode 100644 pkg/agent/audit/check_ssh.go diff --git a/internal/app.go b/internal/app.go index b10c3e9..278792e 100644 --- a/internal/app.go +++ b/internal/app.go @@ -288,25 +288,8 @@ func autoMigrate(database *gorm.DB) error { // initDefaultProperties 初始化默认属性配置 func initDefaultProperties(ctx context.Context, components *AppComponents, logger *zap.Logger) error { - const propertyIDNotificationChannels = "notification_channels" - - // 检查是否已存在通知渠道配置 - _, err := components.PropertyService.Get(ctx, propertyIDNotificationChannels) - if err == nil { - // 配置已存在,跳过初始化 - logger.Info("通知渠道配置已存在,跳过初始化") - return nil - } - - // 创建默认空配置 - emptyChannels := make([]interface{}, 0) - err = components.PropertyService.Set(ctx, propertyIDNotificationChannels, "通知渠道配置", emptyChannels) - if err != nil { - return err - } - - logger.Info("默认通知渠道配置初始化成功") - return nil + // 使用 PropertyService 的初始化方法 + return components.PropertyService.InitializeDefaultConfigs(ctx) } func ErrorHandler(logger *zap.Logger) func(next echo.HandlerFunc) echo.HandlerFunc { diff --git a/internal/handler/agent_handler.go b/internal/handler/agent_handler.go index d0f6bd6..a4c8635 100644 --- a/internal/handler/agent_handler.go +++ b/internal/handler/agent_handler.go @@ -620,7 +620,7 @@ func (h *AgentHandler) SendCommand(c echo.Context) error { }) } -// GetAuditResult 获取审计结果 +// GetAuditResult 获取审计结果(原始数据) func (h *AgentHandler) GetAuditResult(c echo.Context) error { agentID := c.Param("id") ctx := c.Request().Context() diff --git a/internal/models/property.go b/internal/models/property.go index db9ac27..c1617a5 100644 --- a/internal/models/property.go +++ b/internal/models/property.go @@ -30,4 +30,5 @@ type SystemConfig struct { SystemNameZh string `json:"systemNameZh"` // 系统名称(中文) SystemNameEn string `json:"systemNameEn"` // 系统名称(英文) LogoBase64 string `json:"logoBase64"` // 系统logo(base64编码) + ICPCode string `json:"icpCode"` // ICP备案号 } diff --git a/internal/protocol/message.go b/internal/protocol/message.go index 9c3d407..89c88cc 100644 --- a/internal/protocol/message.go +++ b/internal/protocol/message.go @@ -195,24 +195,36 @@ type CommandResponse struct { Result string `json:"result,omitempty"` // 结果数据(JSON字符串) } -// VPSAuditResult VPS安全审计结果 +// VPSAuditResult VPS资产采集结果(Agent端只负责采集,不做安全判断) type VPSAuditResult struct { // 系统信息 SystemInfo SystemInfo `json:"systemInfo"` + // 【核心】资产清单(Agent收集的原始数据) + AssetInventory AssetInventory `json:"assetInventory"` + // 统计摘要 + Statistics AuditStatistics `json:"statistics"` + // 采集开始时间 + StartTime int64 `json:"startTime"` + // 采集结束时间 + EndTime int64 `json:"endTime"` + // 采集警告(权限不足、命令失败等问题) + CollectWarnings []string `json:"collectWarnings,omitempty"` +} + +// VPSAuditAnalysis VPS安全分析结果(Server端分析后的结果) +type VPSAuditAnalysis struct { + // 关联的审计ID + AuditID string `json:"auditId"` // 安全检查结果 SecurityChecks []SecurityCheck `json:"securityChecks"` - // 审计开始时间 - StartTime int64 `json:"startTime"` - // 审计结束时间 - EndTime int64 `json:"endTime"` // 风险评分 (0-100) RiskScore int `json:"riskScore"` // 威胁等级: low/medium/high/critical ThreatLevel string `json:"threatLevel"` // 修复建议 Recommendations []string `json:"recommendations,omitempty"` - // 审计警告(权限不足、检查失败等非安全问题) - AuditWarnings []string `json:"auditWarnings,omitempty"` + // 分析时间 + AnalyzedAt int64 `json:"analyzedAt"` } // SystemInfo 系统信息 @@ -234,10 +246,11 @@ type SecurityCheck struct { // SecurityCheckSub 安全检查子项 type SecurityCheckSub struct { - Name string `json:"name"` // 子检查名称 - Status string `json:"status"` // pass/fail/warn/skip - Message string `json:"message"` // 检查消息 - Evidence *Evidence `json:"evidence,omitempty"` // 证据信息 + Name string `json:"name"` // 子检查名称 + Status string `json:"status"` // pass/fail/warn/skip + Severity string `json:"severity,omitempty"` // 严重程度: high/medium/low + Message string `json:"message"` // 检查消息 + Evidence string `json:"evidence,omitempty"` // 证据信息(简化为字符串) } // Evidence 安全事件证据 @@ -298,3 +311,294 @@ type TamperAlertData struct { Details string `json:"details"` // 详细信息(如: "不可变属性被移除") Restored bool `json:"restored"` // 是否已自动恢复 } + +// ==================== 资产清单相关数据结构 ==================== + +// AssetInventory 资产清单 +type AssetInventory struct { + NetworkAssets *NetworkAssets `json:"networkAssets,omitempty"` // 网络资产 + ProcessAssets *ProcessAssets `json:"processAssets,omitempty"` // 进程资产 + UserAssets *UserAssets `json:"userAssets,omitempty"` // 用户资产 + FileAssets *FileAssets `json:"fileAssets,omitempty"` // 文件资产 + KernelAssets *KernelAssets `json:"kernelAssets,omitempty"` // 内核资产 +} + +// AuditStatistics 审计统计摘要 +type AuditStatistics struct { + NetworkStats *NetworkStatistics `json:"networkStats,omitempty"` // 网络统计 + ProcessStats *ProcessStatistics `json:"processStats,omitempty"` // 进程统计 + UserStats *UserStatistics `json:"userStats,omitempty"` // 用户统计 + FileStats *FileStatistics `json:"fileStats,omitempty"` // 文件统计 +} + +// ==================== 网络资产 ==================== + +// NetworkAssets 网络资产 +type NetworkAssets struct { + ListeningPorts []ListeningPort `json:"listeningPorts,omitempty"` // 监听端口 + Connections []NetworkConnection `json:"connections,omitempty"` // 网络连接 + Interfaces []NetworkInterface `json:"interfaces,omitempty"` // 网卡接口 + RoutingTable []RouteEntry `json:"routingTable,omitempty"` // 路由表 + FirewallRules *FirewallInfo `json:"firewallRules,omitempty"` // 防火墙规则 + DNSServers []string `json:"dnsServers,omitempty"` // DNS服务器 + ARPTable []ARPEntry `json:"arpTable,omitempty"` // ARP表 + Statistics *NetworkStatistics `json:"statistics,omitempty"` // 统计信息 +} + +// ListeningPort 监听端口 +type ListeningPort struct { + Protocol string `json:"protocol"` // tcp/udp + Address string `json:"address"` // 0.0.0.0/127.0.0.1/:: + Port uint32 `json:"port"` // 端口号 + ProcessPID int32 `json:"processPid"` // 进程PID + ProcessName string `json:"processName,omitempty"` // 进程名 + ProcessPath string `json:"processPath,omitempty"` // 进程路径 + IsPublic bool `json:"isPublic"` // 是否公网监听 +} + +// NetworkConnection 网络连接 +type NetworkConnection struct { + Protocol string `json:"protocol"` // tcp/udp + LocalAddr string `json:"localAddr"` // 本地地址 + LocalPort uint32 `json:"localPort"` // 本地端口 + RemoteAddr string `json:"remoteAddr"` // 远程地址 + RemotePort uint32 `json:"remotePort"` // 远程端口 + State string `json:"state"` // ESTABLISHED/LISTEN/... + ProcessPID int32 `json:"processPid"` // 进程PID + ProcessName string `json:"processName,omitempty"` // 进程名 +} + +// NetworkInterface 网卡接口 +type NetworkInterface struct { + Name string `json:"name"` // 接口名 + MacAddress string `json:"macAddress"` // MAC地址 + Addresses []string `json:"addresses,omitempty"` // IP地址列表 + MTU int `json:"mtu"` // MTU + IsUp bool `json:"isUp"` // 是否启用 + Flags []string `json:"flags,omitempty"` // 标志 +} + +// RouteEntry 路由表条目 +type RouteEntry struct { + Destination string `json:"destination"` // 目标网络 + Gateway string `json:"gateway"` // 网关 + Genmask string `json:"genmask"` // 子网掩码 + Interface string `json:"interface"` // 接口 + Metric int `json:"metric"` // 优先级 +} + +// FirewallInfo 防火墙信息 +type FirewallInfo struct { + Type string `json:"type"` // iptables/ufw/firewalld + Status string `json:"status"` // active/inactive + Rules []FirewallRule `json:"rules,omitempty"` // 规则列表 +} + +// FirewallRule 防火墙规则 +type FirewallRule struct { + Chain string `json:"chain"` // 链名 + Target string `json:"target"` // 目标动作 + Protocol string `json:"protocol,omitempty"` // 协议 + Source string `json:"source,omitempty"` // 源地址 + Dest string `json:"dest,omitempty"` // 目标地址 + Port string `json:"port,omitempty"` // 端口 +} + +// ARPEntry ARP表条目 +type ARPEntry struct { + IPAddress string `json:"ipAddress"` // IP地址 + MacAddress string `json:"macAddress"` // MAC地址 + Interface string `json:"interface"` // 接口 +} + +// NetworkStatistics 网络统计 +type NetworkStatistics struct { + TotalListeningPorts int `json:"totalListeningPorts"` // 总监听端口数 + PublicListeningPorts int `json:"publicListeningPorts"` // 公网监听端口数 + ActiveConnections int `json:"activeConnections"` // 活跃连接数 + ConnectionsByState map[string]int `json:"connectionsByState,omitempty"` // 连接状态分布 + InterfaceCount int `json:"interfaceCount"` // 网卡数量 +} + +// ==================== 进程资产 ==================== + +// ProcessAssets 进程资产 +type ProcessAssets struct { + RunningProcesses []ProcessInfo `json:"runningProcesses,omitempty"` // 所有运行进程(可选) + TopCPUProcesses []ProcessInfo `json:"topCpuProcesses,omitempty"` // CPU占用TOP进程 + TopMemoryProcesses []ProcessInfo `json:"topMemoryProcesses,omitempty"` // 内存占用TOP进程 + Statistics *ProcessStatistics `json:"statistics,omitempty"` // 统计信息 +} + +// ProcessInfo 进程信息 +type ProcessInfo struct { + PID int32 `json:"pid"` // 进程ID + Name string `json:"name"` // 进程名 + Cmdline string `json:"cmdline,omitempty"` // 命令行 + Exe string `json:"exe,omitempty"` // 可执行文件路径 + PPID int32 `json:"ppid"` // 父进程ID + Username string `json:"username,omitempty"` // 用户名 + CPUPercent float64 `json:"cpuPercent"` // CPU使用率 + MemPercent float32 `json:"memPercent"` // 内存使用率 + MemoryMB uint64 `json:"memoryMb"` // 内存占用(MB) + Status string `json:"status,omitempty"` // 状态 + CreateTime int64 `json:"createTime"` // 创建时间(毫秒) +} + +// ProcessStatistics 进程统计 +type ProcessStatistics struct { + TotalProcesses int `json:"totalProcesses"` // 进程总数 + RunningProcesses int `json:"runningProcesses"` // 运行中进程 + SleepingProcesses int `json:"sleepingProcesses"` // 睡眠进程 + ZombieProcesses int `json:"zombieProcesses"` // 僵尸进程 + ThreadCount int `json:"threadCount"` // 线程总数 +} + +// ==================== 用户资产 ==================== + +// UserAssets 用户资产 +type UserAssets struct { + SystemUsers []UserInfo `json:"systemUsers,omitempty"` // 系统用户 + LoginHistory []LoginRecord `json:"loginHistory,omitempty"` // 登录历史 + CurrentLogins []LoginSession `json:"currentLogins,omitempty"` // 当前登录 + SSHKeys []SSHKeyInfo `json:"sshKeys,omitempty"` // SSH密钥 + SudoUsers []SudoUserInfo `json:"sudoUsers,omitempty"` // Sudo用户 + Statistics *UserStatistics `json:"statistics,omitempty"` // 统计信息 +} + +// UserInfo 用户信息 +type UserInfo struct { + Username string `json:"username"` // 用户名 + UID string `json:"uid"` // UID + GID string `json:"gid"` // GID + HomeDir string `json:"homeDir,omitempty"` // 家目录 + Shell string `json:"shell,omitempty"` // Shell + IsLoginable bool `json:"isLoginable"` // 是否可登录 + IsRootEquiv bool `json:"isRootEquiv,omitempty"` // 是否UID=0 + HasPassword bool `json:"hasPassword"` // 是否有密码 +} + +// LoginRecord 登录记录 +type LoginRecord struct { + Username string `json:"username"` // 用户名 + IP string `json:"ip,omitempty"` // IP地址 + Terminal string `json:"terminal"` // 终端 + Timestamp int64 `json:"timestamp"` // 时间戳(毫秒) + Status string `json:"status,omitempty"` // success/failed +} + +// LoginSession 登录会话 +type LoginSession struct { + Username string `json:"username"` // 用户名 + Terminal string `json:"terminal"` // 终端 + IP string `json:"ip"` // IP地址 + LoginTime int64 `json:"loginTime"` // 登录时间(毫秒) + IdleTime int `json:"idleTime"` // 空闲时间(秒) +} + +// SSHKeyInfo SSH密钥信息 +type SSHKeyInfo struct { + Username string `json:"username"` // 用户名 + KeyType string `json:"keyType"` // 密钥类型 + Fingerprint string `json:"fingerprint"` // 指纹 + Comment string `json:"comment,omitempty"` // 注释 + FilePath string `json:"filePath"` // 文件路径 + AddedTime int64 `json:"addedTime,omitempty"` // 添加时间(毫秒) +} + +// SudoUserInfo Sudo用户信息 +type SudoUserInfo struct { + Username string `json:"username"` // 用户名 + Rules string `json:"rules,omitempty"` // 规则 + NoPasswd bool `json:"noPasswd"` // 是否免密 +} + +// UserStatistics 用户统计 +type UserStatistics struct { + TotalUsers int `json:"totalUsers"` // 用户总数 + LoginableUsers int `json:"loginableUsers"` // 可登录用户数 + RootEquivalentUsers int `json:"rootEquivalentUsers"` // Root权限用户数 + RecentLoginCount int `json:"recentLoginCount"` // 近期登录次数 + FailedLoginCount int `json:"failedLoginCount"` // 失败登录次数 +} + +// ==================== 文件资产 ==================== + +// FileAssets 文件资产 +type FileAssets struct { + CronJobs []CronJob `json:"cronJobs,omitempty"` // 定时任务 + SystemdServices []SystemdService `json:"systemdServices,omitempty"` // Systemd服务 + StartupScripts []StartupScript `json:"startupScripts,omitempty"` // 启动脚本 + RecentModified []FileInfo `json:"recentModified,omitempty"` // 最近修改文件 + LargeFiles []FileInfo `json:"largeFiles,omitempty"` // 大文件 + Statistics *FileStatistics `json:"statistics,omitempty"` // 统计信息 +} + +// CronJob 定时任务 +type CronJob struct { + User string `json:"user"` // 用户 + Schedule string `json:"schedule"` // 计划 + Command string `json:"command"` // 命令 + FilePath string `json:"filePath,omitempty"` // 文件路径 +} + +// SystemdService Systemd服务 +type SystemdService struct { + Name string `json:"name"` // 服务名 + State string `json:"state,omitempty"` // 状态 + Enabled bool `json:"enabled"` // 是否开机启动 + ExecStart string `json:"execStart,omitempty"` // 启动命令 + Description string `json:"description,omitempty"` // 描述 + UnitFile string `json:"unitFile,omitempty"` // Unit文件路径 +} + +// StartupScript 启动脚本 +type StartupScript struct { + Type string `json:"type"` // init.d/rc.local/systemd + Path string `json:"path"` // 路径 + Name string `json:"name"` // 名称 + Enabled bool `json:"enabled"` // 是否启用 +} + +// FileInfo 文件信息 +type FileInfo struct { + Path string `json:"path"` // 路径 + Size int64 `json:"size"` // 大小(字节) + ModTime int64 `json:"modTime"` // 修改时间(毫秒) + Permissions string `json:"permissions,omitempty"` // 权限 + Owner string `json:"owner,omitempty"` // 所有者 + Group string `json:"group,omitempty"` // 组 + IsExecutable bool `json:"isExecutable"` // 是否可执行 +} + +// FileStatistics 文件统计 +type FileStatistics struct { + CronJobsCount int `json:"cronJobsCount"` // 定时任务数量 + SystemdServicesCount int `json:"systemdServicesCount"` // Systemd服务数量 + ActiveServicesCount int `json:"activeServicesCount"` // 活跃服务数量 + RecentFilesCount int `json:"recentFilesCount"` // 最近修改文件数量 + LargeFilesCount int `json:"largeFilesCount"` // 大文件数量 +} + +// ==================== 内核资产 ==================== + +// KernelAssets 内核资产 +type KernelAssets struct { + LoadedModules []KernelModule `json:"loadedModules,omitempty"` // 已加载内核模块 + KernelParameters map[string]string `json:"kernelParameters,omitempty"` // 内核参数 + SecurityModules *SecurityModuleInfo `json:"securityModules,omitempty"` // 安全模块 +} + +// KernelModule 内核模块 +type KernelModule struct { + Name string `json:"name"` // 模块名 + Size int `json:"size"` // 大小 + UsedBy int `json:"usedBy"` // 被引用次数 +} + +// SecurityModuleInfo 安全模块信息 +type SecurityModuleInfo struct { + SELinuxStatus string `json:"selinuxStatus,omitempty"` // SELinux状态 + AppArmorStatus string `json:"apparmorStatus,omitempty"` // AppArmor状态 + SecureBootState string `json:"secureBootState,omitempty"` // 安全启动状态 +} diff --git a/internal/repo/agent_repo.go b/internal/repo/agent_repo.go index 4fe9c58..29028e7 100644 --- a/internal/repo/agent_repo.go +++ b/internal/repo/agent_repo.go @@ -95,6 +95,19 @@ func (r *AgentRepo) GetLatestAuditResult(ctx context.Context, agentID string) (* return &audit, nil } +// GetLatestAuditResultByType 根据类型获取最新的审计结果 +func (r *AgentRepo) GetLatestAuditResultByType(ctx context.Context, agentID string, resultType string) (*models.AuditResult, error) { + var audit models.AuditResult + err := r.db.WithContext(ctx). + Where("agent_id = ? AND type = ?", agentID, resultType). + Order("created_at DESC"). + First(&audit).Error + if err != nil { + return nil, err + } + return &audit, nil +} + // ListAuditResults 获取审计结果列表 func (r *AgentRepo) ListAuditResults(ctx context.Context, agentID string) ([]models.AuditResult, error) { var audits []models.AuditResult diff --git a/internal/repo/property_repo.go b/internal/repo/property_repo.go index b96e80f..851a6c2 100644 --- a/internal/repo/property_repo.go +++ b/internal/repo/property_repo.go @@ -1,8 +1,6 @@ package repo import ( - "context" - "github.com/dushixiang/pika/internal/models" "github.com/go-orz/orz" "gorm.io/gorm" @@ -19,42 +17,3 @@ func NewPropertyRepo(db *gorm.DB) *PropertyRepo { db: db, } } - -// Get 获取属性 -func (r *PropertyRepo) Get(ctx context.Context, id string) (*models.Property, error) { - var property models.Property - err := r.db.WithContext(ctx).Where("id = ?", id).First(&property).Error - if err != nil { - return nil, err - } - return &property, nil -} - -// Set 设置属性 -func (r *PropertyRepo) Set(ctx context.Context, property *models.Property) error { - // 先尝试查找 - var existing models.Property - err := r.db.WithContext(ctx).Where("id = ?", property.ID).First(&existing).Error - - if err == gorm.ErrRecordNotFound { - // 不存在,创建 - return r.db.WithContext(ctx).Create(property).Error - } else if err != nil { - return err - } - - // 存在,更新 - return r.db.WithContext(ctx).Model(&existing).Updates(property).Error -} - -// Delete 删除属性 -func (r *PropertyRepo) Delete(ctx context.Context, id string) error { - return r.db.WithContext(ctx).Delete(&models.Property{}, "id = ?", id).Error -} - -// List 列出所有属性 -func (r *PropertyRepo) List(ctx context.Context) ([]models.Property, error) { - var properties []models.Property - err := r.db.WithContext(ctx).Find(&properties).Error - return properties, err -} diff --git a/internal/service/agent_service.go b/internal/service/agent_service.go index 1af1f4b..14f0fed 100644 --- a/internal/service/agent_service.go +++ b/internal/service/agent_service.go @@ -633,12 +633,21 @@ func (s *AgentService) SaveAuditResult(ctx context.Context, agentID string, resu } // 保存到数据库 - return s.AgentRepo.SaveAuditResult(ctx, auditRecord) + if err := s.AgentRepo.SaveAuditResult(ctx, auditRecord); err != nil { + return err + } + + s.logger.Info("审计结果保存成功", + zap.String("agentId", agentID), + zap.Int64("auditId", auditRecord.ID), + ) + + return nil } -// GetAuditResult 获取最新的审计结果 +// GetAuditResult 获取最新的审计结果(原始数据) func (s *AgentService) GetAuditResult(ctx context.Context, agentID string) (*protocol.VPSAuditResult, error) { - record, err := s.AgentRepo.GetLatestAuditResult(ctx, agentID) + record, err := s.AgentRepo.GetLatestAuditResultByType(ctx, agentID, "vps_audit") if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, nil @@ -669,33 +678,19 @@ func (s *AgentService) ListAuditResults(ctx context.Context, agentID string) ([] continue } - // 统计检查结果 - passCount := 0 - failCount := 0 - warnCount := 0 - for _, check := range auditResult.SecurityChecks { - switch check.Status { - case "pass": - passCount++ - case "fail": - failCount++ - case "warn": - warnCount++ - } - } + // TODO: 统计安全检查结果应该来自 Server 端分析后的 VPSAuditAnalysis + // Agent 端已经不再产生 SecurityChecks,需要实现 Server 端分析逻辑 results = append(results, map[string]interface{}{ - "id": record.ID, - "agentId": record.AgentID, - "type": record.Type, - "startTime": record.StartTime, - "endTime": record.EndTime, - "createdAt": record.CreatedAt, - "passCount": passCount, - "failCount": failCount, - "warnCount": warnCount, - "totalCount": len(auditResult.SecurityChecks), - "systemInfo": auditResult.SystemInfo, + "id": record.ID, + "agentId": record.AgentID, + "type": record.Type, + "startTime": record.StartTime, + "endTime": record.EndTime, + "createdAt": record.CreatedAt, + "systemInfo": auditResult.SystemInfo, + "statistics": auditResult.Statistics, + "collectTime": auditResult.EndTime - auditResult.StartTime, }) } diff --git a/internal/service/property_service.go b/internal/service/property_service.go index de0c4d8..2ad2eb8 100644 --- a/internal/service/property_service.go +++ b/internal/service/property_service.go @@ -8,6 +8,7 @@ import ( "github.com/dushixiang/pika/internal/models" "github.com/dushixiang/pika/internal/repo" + "github.com/dushixiang/pika/web" "go.uber.org/zap" "gorm.io/gorm" ) @@ -32,13 +33,13 @@ func NewPropertyService(logger *zap.Logger, db *gorm.DB) *PropertyService { } // Get 获取属性(返回原始 JSON 字符串) -func (s *PropertyService) Get(ctx context.Context, id string) (*models.Property, error) { - return s.repo.Get(ctx, id) +func (s *PropertyService) Get(ctx context.Context, id string) (models.Property, error) { + return s.repo.FindById(ctx, id) } // GetValue 获取属性值并反序列化 func (s *PropertyService) GetValue(ctx context.Context, id string, target interface{}) error { - property, err := s.repo.Get(ctx, id) + property, err := s.repo.FindById(ctx, id) if err != nil { return err } @@ -65,12 +66,12 @@ func (s *PropertyService) Set(ctx context.Context, id string, name string, value UpdatedAt: time.Now().UnixMilli(), } - return s.repo.Set(ctx, property) + return s.repo.Save(ctx, property) } // Delete 删除属性 func (s *PropertyService) Delete(ctx context.Context, id string) error { - return s.repo.Delete(ctx, id) + return s.repo.DeleteById(ctx, id) } func (s *PropertyService) GetNotificationChannelConfigs(ctx context.Context) ([]models.NotificationChannelConfig, error) { @@ -90,3 +91,64 @@ func (s *PropertyService) GetSystemConfig(ctx context.Context) (*models.SystemCo } return &systemConfig, nil } + +// defaultPropertyConfig 默认配置项定义 +type defaultPropertyConfig struct { + ID string + Name string + Value interface{} +} + +// InitializeDefaultConfigs 初始化默认配置(如果数据库中不存在) +func (s *PropertyService) InitializeDefaultConfigs(ctx context.Context) error { + // 定义所有需要初始化的默认配置 + defaultConfigs := []defaultPropertyConfig{ + { + ID: PropertyIDSystemConfig, + Name: "系统配置", + Value: models.SystemConfig{ + SystemNameEn: "Pika Monitor", + SystemNameZh: "皮卡监控", + LogoBase64: web.DefaultLogoBase64(), + ICPCode: "", + }, + }, + { + ID: PropertyIDNotificationChannels, + Name: "通知渠道配置", + Value: []models.NotificationChannelConfig{}, + }, + } + + // 遍历并初始化每个配置 + for _, config := range defaultConfigs { + if err := s.initializeProperty(ctx, config); err != nil { + return fmt.Errorf("初始化 %s 失败: %w", config.Name, err) + } + } + + s.logger.Info("默认配置初始化完成") + return nil +} + +// initializeProperty 初始化单个配置项 +func (s *PropertyService) initializeProperty(ctx context.Context, config defaultPropertyConfig) error { + // 检查配置是否已存在 + exists, err := s.repo.ExistsById(ctx, config.ID) + if err != nil { + return err + } + + if exists { + // 配置已存在,无需初始化 + s.logger.Info("配置已存在,跳过初始化", zap.String("name", config.Name)) + return nil + } + + // 配置不存在,创建默认配置 + if err := s.Set(ctx, config.ID, config.Name, config.Value); err != nil { + return err + } + s.logger.Info("配置默认值已初始化", zap.String("name", config.Name)) + return nil +} diff --git a/pkg/agent/audit/asset_file.go b/pkg/agent/audit/asset_file.go new file mode 100644 index 0000000..f2d5999 --- /dev/null +++ b/pkg/agent/audit/asset_file.go @@ -0,0 +1,340 @@ +package audit + +import ( + "bufio" + "fmt" + "os" + "path/filepath" + "strings" + "time" + + "github.com/dushixiang/pika/internal/protocol" +) + +// FileAssetsCollector 文件资产收集器 +type FileAssetsCollector struct { + config *Config + executor *CommandExecutor +} + +// NewFileAssetsCollector 创建文件资产收集器 +func NewFileAssetsCollector(config *Config, executor *CommandExecutor) *FileAssetsCollector { + return &FileAssetsCollector{ + config: config, + executor: executor, + } +} + +// Collect 收集文件资产 +func (fac *FileAssetsCollector) Collect() *protocol.FileAssets { + assets := &protocol.FileAssets{} + + // 收集Cron任务 + assets.CronJobs = fac.collectCronJobs() + + // 收集Systemd服务 + assets.SystemdServices = fac.collectSystemdServices() + + // 收集启动脚本 + assets.StartupScripts = fac.collectStartupScripts() + + // 收集最近修改文件 + assets.RecentModified = fac.collectRecentModified() + + // 收集大文件 + assets.LargeFiles = fac.collectLargeFiles() + + // 统计信息 + assets.Statistics = fac.calculateStatistics(assets) + + return assets +} + +// collectCronJobs 收集Cron任务 +func (fac *FileAssetsCollector) collectCronJobs() []protocol.CronJob { + var jobs []protocol.CronJob + + // 收集 /etc/crontab + jobs = append(jobs, fac.parseCronFile("/etc/crontab", "root")...) + + // 收集 /etc/cron.d/* + cronDFiles, _ := filepath.Glob("/etc/cron.d/*") + for _, file := range cronDFiles { + jobs = append(jobs, fac.parseCronFile(file, "root")...) + } + + // 收集用户crontab + userCronFiles, _ := filepath.Glob("/var/spool/cron/*") + for _, file := range userCronFiles { + username := filepath.Base(file) + jobs = append(jobs, fac.parseCronFile(file, username)...) + } + + // 限制数量 + if len(jobs) > 100 { + jobs = jobs[:100] + } + + return jobs +} + +// parseCronFile 解析Cron文件 +func (fac *FileAssetsCollector) parseCronFile(filePath string, defaultUser string) []protocol.CronJob { + var jobs []protocol.CronJob + + file, err := os.Open(filePath) + if err != nil { + return jobs + } + defer file.Close() + + scanner := bufio.NewScanner(file) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if line == "" || strings.HasPrefix(line, "#") { + continue + } + + // 跳过环境变量定义 + if strings.Contains(line, "=") && !strings.Contains(line, " ") { + continue + } + + fields := strings.Fields(line) + if len(fields) < 6 { + continue + } + + // 判断是否包含用户字段 + user := defaultUser + schedule := "" + command := "" + + // /etc/crontab 格式: min hour day month dow user command + if filePath == "/etc/crontab" && len(fields) >= 7 { + schedule = strings.Join(fields[0:5], " ") + user = fields[5] + command = strings.Join(fields[6:], " ") + } else { + // 用户crontab格式: min hour day month dow command + schedule = strings.Join(fields[0:5], " ") + command = strings.Join(fields[5:], " ") + } + + job := protocol.CronJob{ + User: user, + Schedule: schedule, + Command: command, + FilePath: filePath, + } + + jobs = append(jobs, job) + } + + return jobs +} + +// collectSystemdServices 收集Systemd服务 +func (fac *FileAssetsCollector) collectSystemdServices() []protocol.SystemdService { + var services []protocol.SystemdService + + // 使用 systemctl list-units + output, err := fac.executor.Execute("systemctl", "list-units", "--type=service", "--all", "--no-pager") + if err != nil { + globalLogger.Debug("获取systemd服务失败: %v", err) + return services + } + + lines := strings.Split(output, "\n") + for _, line := range lines { + line = strings.TrimSpace(line) + if line == "" || strings.HasPrefix(line, "UNIT") || strings.HasPrefix(line, "●") { + continue + } + + fields := strings.Fields(line) + if len(fields) < 4 { + continue + } + + serviceName := fields[0] + if !strings.HasSuffix(serviceName, ".service") { + continue + } + + state := "" + if len(fields) > 2 { + state = fields[2] + } + + service := protocol.SystemdService{ + Name: serviceName, + State: state, + Enabled: strings.Contains(line, "enabled"), + } + + services = append(services, service) + + // 限制数量 + if len(services) >= 100 { + break + } + } + + return services +} + +// collectStartupScripts 收集启动脚本 +func (fac *FileAssetsCollector) collectStartupScripts() []protocol.StartupScript { + var scripts []protocol.StartupScript + + // 收集 /etc/init.d/* + initDFiles, _ := filepath.Glob("/etc/init.d/*") + for _, file := range initDFiles { + info, err := os.Stat(file) + if err != nil || info.IsDir() { + continue + } + + // 检查是否可执行 + if info.Mode()&0111 != 0 { + script := protocol.StartupScript{ + Type: "init.d", + Path: file, + Name: filepath.Base(file), + Enabled: true, // 简化,默认认为启用 + } + scripts = append(scripts, script) + } + } + + // 收集 /etc/rc.local + if info, err := os.Stat("/etc/rc.local"); err == nil && !info.IsDir() { + script := protocol.StartupScript{ + Type: "rc.local", + Path: "/etc/rc.local", + Name: "rc.local", + Enabled: info.Mode()&0111 != 0, + } + scripts = append(scripts, script) + } + + return scripts +} + +// collectRecentModified 收集最近修改文件 +func (fac *FileAssetsCollector) collectRecentModified() []protocol.FileInfo { + var files []protocol.FileInfo + + // 搜索最近7天修改的文件 + searchDirs := []string{"/etc", "/bin", "/sbin", "/usr/bin", "/usr/sbin"} + cutoffTime := time.Now().AddDate(0, 0, -7) + + for _, dir := range searchDirs { + filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { + if err != nil || info.IsDir() { + return nil + } + + // 跳过符号链接 + if info.Mode()&os.ModeSymlink != 0 { + return nil + } + + // 检查修改时间 + if info.ModTime().After(cutoffTime) { + fileInfo := fac.convertToFileInfo(path, info) + files = append(files, fileInfo) + } + + // 限制数量 + if len(files) >= 50 { + return filepath.SkipDir + } + + return nil + }) + + if len(files) >= 50 { + break + } + } + + return files +} + +// collectLargeFiles 收集大文件 +func (fac *FileAssetsCollector) collectLargeFiles() []protocol.FileInfo { + var files []protocol.FileInfo + + // 搜索大于200MB的文件 + searchDirs := []string{"/tmp", "/var/tmp", "/home", "/root"} + sizeThrreshold := int64(200 * 1024 * 1024) // 200MB + + for _, dir := range searchDirs { + filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { + if err != nil || info.IsDir() { + return nil + } + + // 跳过符号链接 + if info.Mode()&os.ModeSymlink != 0 { + return nil + } + + // 检查文件大小 + if info.Size() > sizeThrreshold { + fileInfo := fac.convertToFileInfo(path, info) + files = append(files, fileInfo) + } + + // 限制数量 + if len(files) >= 20 { + return filepath.SkipDir + } + + return nil + }) + + if len(files) >= 20 { + break + } + } + + return files +} + +// convertToFileInfo 转换为文件信息 +func (fac *FileAssetsCollector) convertToFileInfo(path string, info os.FileInfo) protocol.FileInfo { + fileInfo := protocol.FileInfo{ + Path: path, + Size: info.Size(), + ModTime: info.ModTime().UnixMilli(), + Permissions: fmt.Sprintf("%o", info.Mode().Perm()), + IsExecutable: info.Mode()&0111 != 0, + } + + // 获取所有者和组 (平台特定实现) + fac.fillFileOwnership(&fileInfo, info) + + return fileInfo +} + +// calculateStatistics 计算统计信息 +func (fac *FileAssetsCollector) calculateStatistics(assets *protocol.FileAssets) *protocol.FileStatistics { + stats := &protocol.FileStatistics{ + CronJobsCount: len(assets.CronJobs), + SystemdServicesCount: len(assets.SystemdServices), + RecentFilesCount: len(assets.RecentModified), + LargeFilesCount: len(assets.LargeFiles), + } + + // 统计活跃服务 + for _, service := range assets.SystemdServices { + if service.State == "running" || service.State == "active" { + stats.ActiveServicesCount++ + } + } + + return stats +} diff --git a/pkg/agent/audit/asset_file_unix.go b/pkg/agent/audit/asset_file_unix.go new file mode 100644 index 0000000..dbf1411 --- /dev/null +++ b/pkg/agent/audit/asset_file_unix.go @@ -0,0 +1,19 @@ +//go:build linux || darwin + +package audit + +import ( + "fmt" + "os" + "syscall" + + "github.com/dushixiang/pika/internal/protocol" +) + +// fillFileOwnership 填充文件所有者和组信息 (Unix系统) +func (fac *FileAssetsCollector) fillFileOwnership(fileInfo *protocol.FileInfo, info os.FileInfo) { + if stat, ok := info.Sys().(*syscall.Stat_t); ok { + fileInfo.Owner = fmt.Sprintf("%d", stat.Uid) + fileInfo.Group = fmt.Sprintf("%d", stat.Gid) + } +} diff --git a/pkg/agent/audit/asset_file_windows.go b/pkg/agent/audit/asset_file_windows.go new file mode 100644 index 0000000..4717fa8 --- /dev/null +++ b/pkg/agent/audit/asset_file_windows.go @@ -0,0 +1,16 @@ +//go:build windows + +package audit + +import ( + "os" + + "github.com/dushixiang/pika/internal/protocol" +) + +// fillFileOwnership 填充文件所有者和组信息 (Windows系统) +// Windows 系统不支持 Unix 风格的 UID/GID,这里留空 +func (fac *FileAssetsCollector) fillFileOwnership(fileInfo *protocol.FileInfo, info os.FileInfo) { + // Windows 系统不填充 Owner 和 Group 字段 + // 可以在未来扩展以支持 Windows SID +} diff --git a/pkg/agent/audit/asset_kernel.go b/pkg/agent/audit/asset_kernel.go new file mode 100644 index 0000000..2e3e855 --- /dev/null +++ b/pkg/agent/audit/asset_kernel.go @@ -0,0 +1,153 @@ +package audit + +import ( + "bufio" + "os" + "strconv" + "strings" + + "github.com/dushixiang/pika/internal/protocol" +) + +// KernelAssetsCollector 内核资产收集器 +type KernelAssetsCollector struct { + config *Config + executor *CommandExecutor +} + +// NewKernelAssetsCollector 创建内核资产收集器 +func NewKernelAssetsCollector(config *Config, executor *CommandExecutor) *KernelAssetsCollector { + return &KernelAssetsCollector{ + config: config, + executor: executor, + } +} + +// Collect 收集内核资产 +func (kac *KernelAssetsCollector) Collect() *protocol.KernelAssets { + assets := &protocol.KernelAssets{} + + // 收集已加载内核模块 + assets.LoadedModules = kac.collectLoadedModules() + + // 收集内核参数 (选择性收集,避免过多) + assets.KernelParameters = kac.collectKernelParameters() + + // 收集安全模块信息 + assets.SecurityModules = kac.collectSecurityModules() + + return assets +} + +// collectLoadedModules 收集已加载内核模块 +func (kac *KernelAssetsCollector) collectLoadedModules() []protocol.KernelModule { + var modules []protocol.KernelModule + + file, err := os.Open("/proc/modules") + if err != nil { + globalLogger.Warn("读取/proc/modules失败: %v", err) + return modules + } + defer file.Close() + + scanner := bufio.NewScanner(file) + for scanner.Scan() { + line := scanner.Text() + fields := strings.Fields(line) + if len(fields) < 3 { + continue + } + + name := fields[0] + size, _ := strconv.Atoi(fields[1]) + usedBy, _ := strconv.Atoi(fields[2]) + + module := protocol.KernelModule{ + Name: name, + Size: size, + UsedBy: usedBy, + } + + modules = append(modules, module) + + // 限制数量,避免过多 + if len(modules) >= 100 { + break + } + } + + return modules +} + +// collectKernelParameters 收集内核参数 +func (kac *KernelAssetsCollector) collectKernelParameters() map[string]string { + params := make(map[string]string) + + // 只收集关键的安全相关参数 + keyParams := []string{ + "/proc/sys/net/ipv4/ip_forward", + "/proc/sys/kernel/randomize_va_space", + "/proc/sys/kernel/dmesg_restrict", + "/proc/sys/kernel/kptr_restrict", + "/proc/sys/kernel/yama/ptrace_scope", + } + + for _, paramPath := range keyParams { + if content, err := os.ReadFile(paramPath); err == nil { + // 提取参数名 + paramName := strings.TrimPrefix(paramPath, "/proc/sys/") + paramName = strings.ReplaceAll(paramName, "/", ".") + params[paramName] = strings.TrimSpace(string(content)) + } + } + + return params +} + +// collectSecurityModules 收集安全模块信息 +func (kac *KernelAssetsCollector) collectSecurityModules() *protocol.SecurityModuleInfo { + info := &protocol.SecurityModuleInfo{} + + // 检查SELinux + if content, err := os.ReadFile("/sys/fs/selinux/enforce"); err == nil { + enforce := strings.TrimSpace(string(content)) + if enforce == "1" { + info.SELinuxStatus = "enforcing" + } else if enforce == "0" { + info.SELinuxStatus = "permissive" + } + } else { + // 检查是否禁用 + if _, err := os.Stat("/sys/fs/selinux"); os.IsNotExist(err) { + info.SELinuxStatus = "disabled" + } + } + + // 检查AppArmor + _, err := kac.executor.Execute("aa-status", "--enabled") + if err == nil { + info.AppArmorStatus = "enabled" + } else { + // 检查是否安装 + whichOutput, whichErr := kac.executor.Execute("which", "aa-status") + if whichErr != nil || whichOutput == "" { + info.AppArmorStatus = "not_installed" + } else { + info.AppArmorStatus = "disabled" + } + } + + // 检查Secure Boot (通过 mokutil 或 /sys/firmware/efi) + if content, err := os.ReadFile("/sys/firmware/efi/efivars/SecureBoot-*"); err == nil { + // 简化判断 + if len(content) > 0 { + info.SecureBootState = "enabled" + } else { + info.SecureBootState = "disabled" + } + } else { + info.SecureBootState = "unknown" + } + + return info +} diff --git a/pkg/agent/audit/asset_network.go b/pkg/agent/audit/asset_network.go new file mode 100644 index 0000000..90706dd --- /dev/null +++ b/pkg/agent/audit/asset_network.go @@ -0,0 +1,433 @@ +package audit + +import ( + "bufio" + "fmt" + "os" + "os/exec" + "strings" + + "github.com/dushixiang/pika/internal/protocol" + gopsutilNet "github.com/shirou/gopsutil/v4/net" + "github.com/shirou/gopsutil/v4/process" +) + +// NetworkAssetsCollector 网络资产收集器 +type NetworkAssetsCollector struct { + config *Config + cache *ProcessCache + executor *CommandExecutor +} + +// NewNetworkAssetsCollector 创建网络资产收集器 +func NewNetworkAssetsCollector(config *Config, cache *ProcessCache, executor *CommandExecutor) *NetworkAssetsCollector { + return &NetworkAssetsCollector{ + config: config, + cache: cache, + executor: executor, + } +} + +// Collect 收集网络资产 +func (nac *NetworkAssetsCollector) Collect() *protocol.NetworkAssets { + assets := &protocol.NetworkAssets{} + + // 收集监听端口 + assets.ListeningPorts = nac.collectListeningPorts() + + // 收集网络连接 + assets.Connections = nac.collectConnections() + + // 收集网卡接口 + assets.Interfaces = nac.collectInterfaces() + + // 收集路由表 + assets.RoutingTable = nac.collectRoutingTable() + + // 收集防火墙规则 + assets.FirewallRules = nac.collectFirewallRules() + + // 收集DNS服务器 + assets.DNSServers = nac.collectDNSServers() + + // 收集ARP表 + assets.ARPTable = nac.collectARPTable() + + // 统计信息 + assets.Statistics = nac.calculateStatistics(assets) + + return assets +} + +// collectListeningPorts 收集监听端口 +func (nac *NetworkAssetsCollector) collectListeningPorts() []protocol.ListeningPort { + var ports []protocol.ListeningPort + + connections, err := gopsutilNet.Connections("all") + if err != nil { + globalLogger.Warn("获取网络连接失败: %v", err) + return ports + } + + for _, conn := range connections { + if conn.Status != "LISTEN" { + continue + } + + // 确定协议类型 + protocolType := "tcp" + if conn.Type == 2 { // SOCK_DGRAM + protocolType = "udp" + } + + port := protocol.ListeningPort{ + Protocol: protocolType, + Address: conn.Laddr.IP, + Port: conn.Laddr.Port, + ProcessPID: conn.Pid, + } + + // 判断是否公网监听 + port.IsPublic = !isLocalIP(conn.Laddr.IP) + + // 获取进程信息 + if conn.Pid > 0 { + if proc, err := process.NewProcess(conn.Pid); err == nil { + port.ProcessName, _ = proc.Name() + port.ProcessPath, _ = proc.Exe() + } + } + + ports = append(ports, port) + } + + return ports +} + +// collectConnections 收集网络连接 +func (nac *NetworkAssetsCollector) collectConnections() []protocol.NetworkConnection { + var connections []protocol.NetworkConnection + + conns, err := gopsutilNet.Connections("all") + if err != nil { + globalLogger.Warn("获取网络连接失败: %v", err) + return connections + } + + // 限制连接数量,避免数据过大 + maxConnections := 200 + establishedCount := 0 + + for _, conn := range conns { + // 只收集 ESTABLISHED 连接 + if conn.Status != "ESTABLISHED" { + continue + } + + if establishedCount >= maxConnections { + break + } + + // 确定协议类型 + protocolType := "tcp" + if conn.Type == 2 { // SOCK_DGRAM + protocolType = "udp" + } + + connection := protocol.NetworkConnection{ + Protocol: protocolType, + LocalAddr: conn.Laddr.IP, + LocalPort: conn.Laddr.Port, + RemoteAddr: conn.Raddr.IP, + RemotePort: conn.Raddr.Port, + State: conn.Status, + ProcessPID: conn.Pid, + } + + // 获取进程信息 + if conn.Pid > 0 { + if proc, err := process.NewProcess(conn.Pid); err == nil { + connection.ProcessName, _ = proc.Name() + } + } + + connections = append(connections, connection) + establishedCount++ + } + + return connections +} + +// collectInterfaces 收集网卡接口 +func (nac *NetworkAssetsCollector) collectInterfaces() []protocol.NetworkInterface { + var interfaces []protocol.NetworkInterface + + ifaces, err := gopsutilNet.Interfaces() + if err != nil { + globalLogger.Warn("获取网卡接口失败: %v", err) + return interfaces + } + + for _, iface := range ifaces { + netInterface := protocol.NetworkInterface{ + Name: iface.Name, + MacAddress: iface.HardwareAddr, + MTU: iface.MTU, + } + + // 提取IP地址 + for _, addr := range iface.Addrs { + netInterface.Addresses = append(netInterface.Addresses, addr.Addr) + } + + // 解析标志 + for _, flag := range iface.Flags { + netInterface.Flags = append(netInterface.Flags, flag) + if flag == "up" { + netInterface.IsUp = true + } + } + + interfaces = append(interfaces, netInterface) + } + + return interfaces +} + +// collectRoutingTable 收集路由表 +func (nac *NetworkAssetsCollector) collectRoutingTable() []protocol.RouteEntry { + var routes []protocol.RouteEntry + + // 使用 route -n 命令 + output, err := nac.executor.Execute("route", "-n") + if err != nil { + globalLogger.Debug("获取路由表失败: %v", err) + return routes + } + + lines := strings.Split(output, "\n") + for i, line := range lines { + // 跳过表头 + if i < 2 { + continue + } + + fields := strings.Fields(line) + if len(fields) < 8 { + continue + } + + route := protocol.RouteEntry{ + Destination: fields[0], + Gateway: fields[1], + Genmask: fields[2], + Interface: fields[7], + } + + // 提取 Metric (可能在不同位置,取决于有无Flags) + if len(fields) > 4 { + fmt.Sscanf(fields[4], "%d", &route.Metric) + } + + routes = append(routes, route) + } + + return routes +} + +// collectFirewallRules 收集防火墙规则 +func (nac *NetworkAssetsCollector) collectFirewallRules() *protocol.FirewallInfo { + fwInfo := &protocol.FirewallInfo{} + + // 尝试检测 iptables + if _, err := exec.LookPath("iptables"); err == nil { + fwInfo.Type = "iptables" + fwInfo.Rules = nac.collectIptablesRules() + fwInfo.Status = "active" + return fwInfo + } + + // 尝试检测 ufw + if _, err := exec.LookPath("ufw"); err == nil { + fwInfo.Type = "ufw" + output, _ := nac.executor.Execute("ufw", "status") + if strings.Contains(output, "Status: active") { + fwInfo.Status = "active" + } else { + fwInfo.Status = "inactive" + } + return fwInfo + } + + // 尝试检测 firewalld + if _, err := exec.LookPath("firewall-cmd"); err == nil { + fwInfo.Type = "firewalld" + output, _ := nac.executor.Execute("firewall-cmd", "--state") + if strings.Contains(output, "running") { + fwInfo.Status = "active" + } else { + fwInfo.Status = "inactive" + } + return fwInfo + } + + fwInfo.Type = "none" + fwInfo.Status = "inactive" + return fwInfo +} + +// collectIptablesRules 收集 iptables 规则 +func (nac *NetworkAssetsCollector) collectIptablesRules() []protocol.FirewallRule { + var rules []protocol.FirewallRule + + // 限制规则数量,只收集前100条 + maxRules := 100 + + output, err := nac.executor.Execute("iptables", "-L", "-n") + if err != nil { + return rules + } + + lines := strings.Split(output, "\n") + currentChain := "" + + for _, line := range lines { + line = strings.TrimSpace(line) + + // 解析链名 + if strings.HasPrefix(line, "Chain") { + fields := strings.Fields(line) + if len(fields) >= 2 { + currentChain = fields[1] + } + continue + } + + // 跳过表头 + if strings.HasPrefix(line, "target") || line == "" { + continue + } + + if len(rules) >= maxRules { + break + } + + fields := strings.Fields(line) + if len(fields) < 4 { + continue + } + + rule := protocol.FirewallRule{ + Chain: currentChain, + Target: fields[0], + } + + if len(fields) > 1 { + rule.Protocol = fields[1] + } + if len(fields) > 3 { + rule.Source = fields[3] + } + if len(fields) > 4 { + rule.Dest = fields[4] + } + + rules = append(rules, rule) + } + + return rules +} + +// collectDNSServers 收集DNS服务器 +func (nac *NetworkAssetsCollector) collectDNSServers() []string { + var dnsServers []string + + file, err := os.Open("/etc/resolv.conf") + if err != nil { + return dnsServers + } + defer file.Close() + + scanner := bufio.NewScanner(file) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if strings.HasPrefix(line, "nameserver") { + fields := strings.Fields(line) + if len(fields) >= 2 { + dnsServers = append(dnsServers, fields[1]) + } + } + } + + return dnsServers +} + +// collectARPTable 收集ARP表 +func (nac *NetworkAssetsCollector) collectARPTable() []protocol.ARPEntry { + var arpTable []protocol.ARPEntry + + // 限制ARP表数量 + maxEntries := 50 + + output, err := nac.executor.Execute("arp", "-n") + if err != nil { + globalLogger.Debug("获取ARP表失败: %v", err) + return arpTable + } + + lines := strings.Split(output, "\n") + for i, line := range lines { + // 跳过表头 + if i == 0 { + continue + } + + if len(arpTable) >= maxEntries { + break + } + + fields := strings.Fields(line) + if len(fields) < 5 { + continue + } + + entry := protocol.ARPEntry{ + IPAddress: fields[0], + MacAddress: fields[2], + Interface: fields[4], + } + + arpTable = append(arpTable, entry) + } + + return arpTable +} + +// calculateStatistics 计算统计信息 +func (nac *NetworkAssetsCollector) calculateStatistics(assets *protocol.NetworkAssets) *protocol.NetworkStatistics { + stats := &protocol.NetworkStatistics{ + InterfaceCount: len(assets.Interfaces), + ConnectionsByState: make(map[string]int), + } + + // 统计监听端口 + stats.TotalListeningPorts = len(assets.ListeningPorts) + for _, port := range assets.ListeningPorts { + if port.IsPublic { + stats.PublicListeningPorts++ + } + } + + // 统计连接 + stats.ActiveConnections = len(assets.Connections) + for _, conn := range assets.Connections { + stats.ConnectionsByState[conn.State]++ + } + + return stats +} + +// isLocalIP 判断是否本地IP +func isLocalIP(ip string) bool { + return ip == "127.0.0.1" || ip == "::1" || ip == "localhost" +} diff --git a/pkg/agent/audit/asset_process.go b/pkg/agent/audit/asset_process.go new file mode 100644 index 0000000..8f8fa3d --- /dev/null +++ b/pkg/agent/audit/asset_process.go @@ -0,0 +1,155 @@ +package audit + +import ( + "sort" + + "github.com/dushixiang/pika/internal/protocol" + "github.com/shirou/gopsutil/v4/process" +) + +// ProcessAssetsCollector 进程资产收集器 +type ProcessAssetsCollector struct { + config *Config + cache *ProcessCache +} + +// NewProcessAssetsCollector 创建进程资产收集器 +func NewProcessAssetsCollector(config *Config, cache *ProcessCache) *ProcessAssetsCollector { + return &ProcessAssetsCollector{ + config: config, + cache: cache, + } +} + +// Collect 收集进程资产 +func (pac *ProcessAssetsCollector) Collect() *protocol.ProcessAssets { + assets := &protocol.ProcessAssets{} + + procs, err := pac.cache.Get() + if err != nil { + globalLogger.Warn("获取进程列表失败: %v", err) + return assets + } + + // 收集所有进程信息 + var allProcesses []protocol.ProcessInfo + for _, p := range procs { + procInfo := pac.convertToProcessInfo(p) + if procInfo != nil { + allProcesses = append(allProcesses, *procInfo) + } + } + + // TOP CPU进程 + assets.TopCPUProcesses = pac.getTopProcesses(allProcesses, "cpu", 15) + + // TOP 内存进程 + assets.TopMemoryProcesses = pac.getTopProcesses(allProcesses, "memory", 15) + + // 可选:完整进程列表 (配置控制) + // 暂时不包含完整列表,避免数据过大 + // assets.RunningProcesses = allProcesses + + // 统计信息 + assets.Statistics = pac.calculateStatistics(procs) + + return assets +} + +// convertToProcessInfo 转换为进程信息 +func (pac *ProcessAssetsCollector) convertToProcessInfo(p *process.Process) *protocol.ProcessInfo { + name, err := p.Name() + if err != nil { + return nil + } + + cmdline, _ := p.Cmdline() + exe, _ := p.Exe() + ppid, _ := p.Ppid() + username, _ := p.Username() + cpuPercent, _ := p.CPUPercent() + memPercent, _ := p.MemoryPercent() + status, _ := p.Status() + createTime, _ := p.CreateTime() + + // 获取内存占用(MB) + memInfo, err := p.MemoryInfo() + var memoryMB uint64 + if err == nil && memInfo != nil { + memoryMB = memInfo.RSS / 1024 / 1024 + } + + return &protocol.ProcessInfo{ + PID: p.Pid, + Name: name, + Cmdline: cmdline, + Exe: exe, + PPID: ppid, + Username: username, + CPUPercent: cpuPercent, + MemPercent: memPercent, + MemoryMB: memoryMB, + Status: status[0], // 取第一个状态 + CreateTime: createTime, + } +} + +// getTopProcesses 获取TOP进程 +func (pac *ProcessAssetsCollector) getTopProcesses(processes []protocol.ProcessInfo, sortBy string, limit int) []protocol.ProcessInfo { + // 复制切片避免修改原始数据 + sorted := make([]protocol.ProcessInfo, len(processes)) + copy(sorted, processes) + + // 排序 + if sortBy == "cpu" { + sort.Slice(sorted, func(i, j int) bool { + return sorted[i].CPUPercent > sorted[j].CPUPercent + }) + } else if sortBy == "memory" { + sort.Slice(sorted, func(i, j int) bool { + return sorted[i].MemoryMB > sorted[j].MemoryMB + }) + } + + // 限制数量 + if len(sorted) > limit { + sorted = sorted[:limit] + } + + return sorted +} + +// calculateStatistics 计算统计信息 +func (pac *ProcessAssetsCollector) calculateStatistics(procs []*process.Process) *protocol.ProcessStatistics { + stats := &protocol.ProcessStatistics{ + TotalProcesses: len(procs), + } + + for _, p := range procs { + status, err := p.Status() + if err != nil { + continue + } + + if len(status) == 0 { + continue + } + + switch status[0] { + case "R": + stats.RunningProcesses++ + case "S", "D", "I": + stats.SleepingProcesses++ + case "Z": + stats.ZombieProcesses++ + } + + // 统计线程数 + numThreads, err := p.NumThreads() + if err == nil { + stats.ThreadCount += int(numThreads) + } + } + + return stats +} diff --git a/pkg/agent/audit/asset_user.go b/pkg/agent/audit/asset_user.go new file mode 100644 index 0000000..3f503b8 --- /dev/null +++ b/pkg/agent/audit/asset_user.go @@ -0,0 +1,392 @@ +package audit + +import ( + "bufio" + "fmt" + "os" + "path/filepath" + "strings" + "time" + + "github.com/dushixiang/pika/internal/protocol" +) + +// UserAssetsCollector 用户资产收集器 +type UserAssetsCollector struct { + config *Config + executor *CommandExecutor +} + +// NewUserAssetsCollector 创建用户资产收集器 +func NewUserAssetsCollector(config *Config, executor *CommandExecutor) *UserAssetsCollector { + return &UserAssetsCollector{ + config: config, + executor: executor, + } +} + +// Collect 收集用户资产 +func (uac *UserAssetsCollector) Collect() *protocol.UserAssets { + assets := &protocol.UserAssets{} + + // 收集系统用户 + assets.SystemUsers = uac.collectSystemUsers() + + // 收集登录历史 + assets.LoginHistory = uac.collectLoginHistory() + + // 收集当前登录 + assets.CurrentLogins = uac.collectCurrentLogins() + + // 收集SSH密钥 + assets.SSHKeys = uac.collectSSHKeys() + + // 收集Sudo用户 + assets.SudoUsers = uac.collectSudoUsers() + + // 统计信息 + assets.Statistics = uac.calculateStatistics(assets) + + return assets +} + +// collectSystemUsers 收集系统用户 +func (uac *UserAssetsCollector) collectSystemUsers() []protocol.UserInfo { + var users []protocol.UserInfo + + // 读取 /etc/passwd + passwdFile, err := os.Open("/etc/passwd") + if err != nil { + globalLogger.Warn("读取/etc/passwd失败: %v", err) + return users + } + defer passwdFile.Close() + + // 读取 /etc/shadow 获取密码信息 + shadowPasswords := uac.readShadowPasswords() + + scanner := bufio.NewScanner(passwdFile) + for scanner.Scan() { + line := scanner.Text() + parts := strings.Split(line, ":") + if len(parts) < 7 { + continue + } + + username := parts[0] + uid := parts[2] + gid := parts[3] + homeDir := parts[5] + shell := parts[6] + + // 判断是否可登录 + isLoginable := !strings.Contains(shell, "nologin") && + !strings.Contains(shell, "false") && + shell != "" + + // 判断是否Root等效 + isRootEquiv := uid == "0" && username != "root" + + // 检查是否有密码 + hasPassword := false + if pwd, ok := shadowPasswords[username]; ok { + hasPassword = pwd != "" && pwd != "!" && pwd != "*" + } + + user := protocol.UserInfo{ + Username: username, + UID: uid, + GID: gid, + HomeDir: homeDir, + Shell: shell, + IsLoginable: isLoginable, + IsRootEquiv: isRootEquiv, + HasPassword: hasPassword, + } + + users = append(users, user) + } + + return users +} + +// readShadowPasswords 读取shadow密码 +func (uac *UserAssetsCollector) readShadowPasswords() map[string]string { + passwords := make(map[string]string) + + shadowFile, err := os.Open("/etc/shadow") + if err != nil { + return passwords + } + defer shadowFile.Close() + + scanner := bufio.NewScanner(shadowFile) + for scanner.Scan() { + line := scanner.Text() + parts := strings.Split(line, ":") + if len(parts) >= 2 { + passwords[parts[0]] = parts[1] + } + } + + return passwords +} + +// collectLoginHistory 收集登录历史 +func (uac *UserAssetsCollector) collectLoginHistory() []protocol.LoginRecord { + var records []protocol.LoginRecord + + // 使用 last 命令获取登录历史 + output, err := uac.executor.Execute("last", "-n", "50", "-F") + if err != nil { + globalLogger.Debug("获取登录历史失败: %v", err) + return records + } + + lines := strings.Split(output, "\n") + for _, line := range lines { + line = strings.TrimSpace(line) + if line == "" || strings.HasPrefix(line, "wtmp") || strings.HasPrefix(line, "reboot") { + continue + } + + fields := strings.Fields(line) + if len(fields) < 7 { + continue + } + + username := fields[0] + terminal := fields[1] + ip := fields[2] + + // 解析时间 (简化处理,使用当前时间作为近似) + timestamp := time.Now().UnixMilli() + + record := protocol.LoginRecord{ + Username: username, + Terminal: terminal, + IP: ip, + Timestamp: timestamp, + Status: "success", + } + + records = append(records, record) + + // 限制数量 + if len(records) >= 50 { + break + } + } + + return records +} + +// collectCurrentLogins 收集当前登录 +func (uac *UserAssetsCollector) collectCurrentLogins() []protocol.LoginSession { + var sessions []protocol.LoginSession + + // 使用 w 命令 + output, err := uac.executor.Execute("w", "-h") + if err != nil { + globalLogger.Debug("获取当前登录失败: %v", err) + return sessions + } + + lines := strings.Split(output, "\n") + for _, line := range lines { + line = strings.TrimSpace(line) + if line == "" { + continue + } + + fields := strings.Fields(line) + if len(fields) < 4 { + continue + } + + username := fields[0] + terminal := fields[1] + ip := fields[2] + + // 解析空闲时间 + idleStr := fields[3] + idleTime := 0 + if idleStr != "-" { + // 简化处理,不解析复杂格式 + fmt.Sscanf(idleStr, "%d", &idleTime) + } + + session := protocol.LoginSession{ + Username: username, + Terminal: terminal, + IP: ip, + LoginTime: time.Now().UnixMilli(), + IdleTime: idleTime, + } + + sessions = append(sessions, session) + } + + return sessions +} + +// collectSSHKeys 收集SSH密钥 +func (uac *UserAssetsCollector) collectSSHKeys() []protocol.SSHKeyInfo { + var keys []protocol.SSHKeyInfo + + // 获取所有用户目录 + userDirs := uac.getAllUserDirectories() + + for _, userDir := range userDirs { + keyPath := filepath.Join(userDir, ".ssh", "authorized_keys") + + info, err := os.Stat(keyPath) + if err != nil { + continue + } + + // 读取密钥文件 + file, err := os.Open(keyPath) + if err != nil { + continue + } + + scanner := bufio.NewScanner(file) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if line == "" || strings.HasPrefix(line, "#") { + continue + } + + parts := strings.Fields(line) + if len(parts) < 2 { + continue + } + + keyType := parts[0] + comment := "" + if len(parts) > 2 { + comment = parts[2] + } + + // 计算指纹 (简化,只取前16个字符) + fingerprint := "" + if len(parts[1]) > 16 { + fingerprint = parts[1][:16] + "..." + } else { + fingerprint = parts[1] + } + + keyInfo := protocol.SSHKeyInfo{ + Username: filepath.Base(filepath.Dir(filepath.Dir(keyPath))), + KeyType: keyType, + Fingerprint: fingerprint, + Comment: comment, + FilePath: keyPath, + AddedTime: info.ModTime().UnixMilli(), + } + + keys = append(keys, keyInfo) + } + file.Close() + } + + return keys +} + +// collectSudoUsers 收集Sudo用户 +func (uac *UserAssetsCollector) collectSudoUsers() []protocol.SudoUserInfo { + var sudoUsers []protocol.SudoUserInfo + + // 读取 /etc/sudoers + sudoersFile, err := os.Open("/etc/sudoers") + if err != nil { + globalLogger.Debug("读取sudoers失败: %v", err) + return sudoUsers + } + defer sudoersFile.Close() + + scanner := bufio.NewScanner(sudoersFile) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if line == "" || strings.HasPrefix(line, "#") { + continue + } + + // 简单匹配包含 ALL 的行 + if !strings.Contains(line, "ALL") { + continue + } + + fields := strings.Fields(line) + if len(fields) < 1 { + continue + } + + username := fields[0] + if strings.HasPrefix(username, "%") { + // 组,跳过 + continue + } + + sudoUser := protocol.SudoUserInfo{ + Username: username, + Rules: line, + NoPasswd: strings.Contains(line, "NOPASSWD"), + } + + sudoUsers = append(sudoUsers, sudoUser) + } + + return sudoUsers +} + +// getAllUserDirectories 获取所有用户目录 +func (uac *UserAssetsCollector) getAllUserDirectories() []string { + var dirs []string + + // 从 /etc/passwd 读取 + file, err := os.Open("/etc/passwd") + if err != nil { + return dirs + } + defer file.Close() + + seen := make(map[string]bool) + + scanner := bufio.NewScanner(file) + for scanner.Scan() { + parts := strings.Split(scanner.Text(), ":") + if len(parts) >= 6 { + homeDir := parts[5] + if homeDir != "" && !seen[homeDir] { + dirs = append(dirs, homeDir) + seen[homeDir] = true + } + } + } + + return dirs +} + +// calculateStatistics 计算统计信息 +func (uac *UserAssetsCollector) calculateStatistics(assets *protocol.UserAssets) *protocol.UserStatistics { + stats := &protocol.UserStatistics{ + TotalUsers: len(assets.SystemUsers), + RecentLoginCount: len(assets.LoginHistory), + } + + for _, user := range assets.SystemUsers { + if user.IsLoginable { + stats.LoginableUsers++ + } + if user.IsRootEquiv { + stats.RootEquivalentUsers++ + } + } + + // 统计失败登录 (可以从 /var/log/auth.log 读取,这里简化) + stats.FailedLoginCount = 0 + + return stats +} diff --git a/pkg/agent/audit/audit.go b/pkg/agent/audit/audit.go index 3b75c27..ba30152 100644 --- a/pkg/agent/audit/audit.go +++ b/pkg/agent/audit/audit.go @@ -17,20 +17,18 @@ const ( StatusSkip = "skip" ) -// Auditor VPS 安全审计器 +// Auditor VPS 资产收集器(Agent端只负责信息收集) type Auditor struct { config *Config cache *ProcessCache executor *CommandExecutor - evidence *EvidenceCollector - // 各个检查器 - rootkitChecker *RootkitChecker - processChecker *ProcessChecker - sshChecker *SSHChecker - networkChecker *NetworkChecker - fileChecker *FileChecker - accountChecker *AccountChecker + // 资产收集器 + networkAssetsCollector *NetworkAssetsCollector + processAssetsCollector *ProcessAssetsCollector + userAssetsCollector *UserAssetsCollector + fileAssetsCollector *FileAssetsCollector + kernelAssetsCollector *KernelAssetsCollector } // NewAuditor 创建审计器 @@ -42,25 +40,22 @@ func NewAuditor(config *Config) *Auditor { // 初始化共享组件 cache := NewProcessCache(config.PerformanceConfig.ProcessCacheDuration) executor := NewCommandExecutor(config.PerformanceConfig.CommandTimeout) - evidence := NewEvidenceCollector() - // 初始化各个检查器 + // 初始化资产收集器 return &Auditor{ config: config, cache: cache, executor: executor, - evidence: evidence, - rootkitChecker: NewRootkitChecker(config, cache, evidence), - processChecker: NewProcessChecker(config, cache, evidence), - sshChecker: NewSSHChecker(config, cache, evidence, executor), - networkChecker: NewNetworkChecker(config, cache, evidence), - fileChecker: NewFileChecker(config, evidence, executor), - accountChecker: NewAccountChecker(config), + networkAssetsCollector: NewNetworkAssetsCollector(config, cache, executor), + processAssetsCollector: NewProcessAssetsCollector(config, cache), + userAssetsCollector: NewUserAssetsCollector(config, executor), + fileAssetsCollector: NewFileAssetsCollector(config, executor), + kernelAssetsCollector: NewKernelAssetsCollector(config, executor), } } -// RunAudit 执行 VPS 安全审计 +// RunAudit 执行 VPS 资产收集(Agent端只收集信息,不做安全判断) func (a *Auditor) RunAudit() (*protocol.VPSAuditResult, error) { startTime := time.Now().UnixMilli() @@ -71,10 +66,10 @@ func (a *Auditor) RunAudit() (*protocol.VPSAuditResult, error) { // 检查运行权限 if os.Geteuid() != 0 { - return nil, fmt.Errorf("需要root权限运行完整审计") + return nil, fmt.Errorf("需要root权限运行完整收集") } - globalLogger.Info("开始安全审计...") + globalLogger.Info("开始资产收集...") // 获取系统信息 sysInfoCollector := NewSystemInfoCollector(a.executor) @@ -83,126 +78,105 @@ func (a *Auditor) RunAudit() (*protocol.VPSAuditResult, error) { return nil, fmt.Errorf("获取系统信息失败: %w", err) } - // 收集警告 + // 收集警告(仅收集过程中的错误或异常) warningCollector := NewWarningCollector() - // 执行所有安全检查 - var securityChecks []protocol.SecurityCheck + // 收集资产清单 + globalLogger.Info("开始收集资产清单...") + assetInventory := a.collectAssets() - checks := []struct { - name string - fn func() protocol.SecurityCheck - }{ - {"Rootkit检测", a.rootkitChecker.Check}, - {"可疑进程检测", a.processChecker.CheckSuspiciousProcesses}, - {"进程环境变量检查", a.processChecker.CheckSuspiciousEnvVars}, - {"SSH安全检查", a.sshChecker.Check}, - {"端口监听检查", a.networkChecker.CheckListeningPorts}, - {"网络连接检查", a.networkChecker.CheckNetworkConnections}, - {"可疑文件检查", a.fileChecker.CheckSuspiciousFiles}, - {"文件完整性检查", a.fileChecker.CheckFileIntegrity}, - {"不可变文件检查", a.fileChecker.CheckImmutableFiles}, - {"系统账户检查", a.accountChecker.CheckSystemAccounts}, - } - - for _, check := range checks { - globalLogger.Debug("执行检查: %s", check.name) - result := check.fn() - securityChecks = append(securityChecks, result) - - // 收集警告 - for _, detail := range result.Details { - if detail.Status == StatusSkip && detail.Message != "" { - warningCollector.Add(fmt.Sprintf("[%s] %s", result.Category, detail.Message)) - } - } - } + // 计算统计信息 + statistics := a.calculateStatistics(assetInventory) endTime := time.Now().UnixMilli() - // 计算风险评分(使用改进的算法) - riskScore, threatLevel, recommendations := a.calculateRiskScore(securityChecks) + globalLogger.Info("资产收集完成,耗时 %dms", endTime-startTime) - globalLogger.Info("审计完成,耗时 %dms, 风险评分: %d, 威胁等级: %s", - endTime-startTime, riskScore, threatLevel) - - return &protocol.VPSAuditResult{ + result := &protocol.VPSAuditResult{ SystemInfo: *systemInfo, - SecurityChecks: securityChecks, StartTime: startTime, EndTime: endTime, - RiskScore: riskScore, - ThreatLevel: threatLevel, - Recommendations: recommendations, - AuditWarnings: warningCollector.GetAll(), - }, nil + CollectWarnings: warningCollector.GetAll(), + } + + // 设置资产清单和统计信息 + if assetInventory != nil { + result.AssetInventory = *assetInventory + } + if statistics != nil { + result.Statistics = *statistics + } + + return result, nil } -// calculateRiskScore 计算综合风险评分(改进版) -func (a *Auditor) calculateRiskScore(checks []protocol.SecurityCheck) (int, string, []string) { - score := 0 - var recommendations []string +// collectAssets 收集资产清单 +func (a *Auditor) collectAssets() *protocol.AssetInventory { + inventory := &protocol.AssetInventory{} - // 使用配置的权重 - for _, check := range checks { - weight, exists := a.config.ScoringConfig.Weights[check.Category] - if !exists { - // 默认权重 - weight = CheckWeight{ - Category: check.Category, - FailScore: 20, - WarnScore: 5, - } - globalLogger.Warn("检查类别 '%s' 没有配置权重,使用默认值", check.Category) - } - - for _, detail := range check.Details { - switch detail.Status { - case StatusFail: - score += weight.FailScore - recommendations = append(recommendations, - fmt.Sprintf("【紧急】%s: %s", check.Category, detail.Message)) - case StatusWarn: - score += weight.WarnScore - recommendations = append(recommendations, - fmt.Sprintf("【警告】%s: %s", check.Category, detail.Message)) - } - } + // 并发收集各类资产 + type assetTask struct { + name string + fn func() } - // 限制最大分数为 100 - if score > 100 { - score = 100 + tasks := []assetTask{ + {"网络资产", func() { + inventory.NetworkAssets = a.networkAssetsCollector.Collect() + }}, + {"进程资产", func() { + inventory.ProcessAssets = a.processAssetsCollector.Collect() + }}, + {"用户资产", func() { + inventory.UserAssets = a.userAssetsCollector.Collect() + }}, + {"文件资产", func() { + inventory.FileAssets = a.fileAssetsCollector.Collect() + }}, + {"内核资产", func() { + inventory.KernelAssets = a.kernelAssetsCollector.Collect() + }}, } - // 确定威胁等级(使用配置的阈值) - var level string - switch { - case score >= a.config.ScoringConfig.CriticalThreshold: - level = "critical" - case score >= a.config.ScoringConfig.HighThreshold: - level = "high" - case score >= a.config.ScoringConfig.MediumThreshold: - level = "medium" - default: - level = "low" + // 串行执行(避免资源竞争,实际可以优化为并发) + for _, task := range tasks { + globalLogger.Debug("收集%s...", task.name) + task.fn() } - // 限制建议数量 - if len(recommendations) > a.config.ScoringConfig.MaxRecommendations { - recommendations = recommendations[:a.config.ScoringConfig.MaxRecommendations] - } - - return score, level, recommendations + return inventory } -// RunAuditWithConfig 使用自定义配置执行审计 +// calculateStatistics 计算统计信息 +func (a *Auditor) calculateStatistics(inventory *protocol.AssetInventory) *protocol.AuditStatistics { + stats := &protocol.AuditStatistics{} + + if inventory.NetworkAssets != nil { + stats.NetworkStats = inventory.NetworkAssets.Statistics + } + + if inventory.ProcessAssets != nil { + stats.ProcessStats = inventory.ProcessAssets.Statistics + } + + if inventory.UserAssets != nil { + stats.UserStats = inventory.UserAssets.Statistics + } + + if inventory.FileAssets != nil { + stats.FileStats = inventory.FileAssets.Statistics + } + + return stats +} + +// RunAuditWithConfig 使用自定义配置执行资产收集 func RunAuditWithConfig(config *Config) (*protocol.VPSAuditResult, error) { auditor := NewAuditor(config) return auditor.RunAudit() } -// RunAudit 使用默认配置执行审计(保持向后兼容) +// RunAudit 使用默认配置执行资产收集(保持向后兼容) func RunAudit() (*protocol.VPSAuditResult, error) { return RunAuditWithConfig(nil) } diff --git a/pkg/agent/audit/check_misc.go b/pkg/agent/audit/check_misc.go deleted file mode 100644 index df94bb6..0000000 --- a/pkg/agent/audit/check_misc.go +++ /dev/null @@ -1,419 +0,0 @@ -package audit - -import ( - "bufio" - "fmt" - "os" - "os/exec" - "path/filepath" - "strconv" - "strings" - "time" - - "github.com/dushixiang/pika/internal/protocol" -) - -// 这个文件包含文件检查、账户检查、Cron 检查和登录历史检查 -// 为简化重构,将这些相对独立的检查整合在一起 - -// FileChecker 文件检查器 -type FileChecker struct { - config *Config - evidence *EvidenceCollector - executor *CommandExecutor -} - -// NewFileChecker 创建文件检查器 -func NewFileChecker(config *Config, evidence *EvidenceCollector, executor *CommandExecutor) *FileChecker { - return &FileChecker{ - config: config, - evidence: evidence, - executor: executor, - } -} - -// CheckSuspiciousFiles 检查可疑文件 -func (fc *FileChecker) CheckSuspiciousFiles() protocol.SecurityCheck { - check := protocol.SecurityCheck{ - Category: "suspicious_files", - Status: StatusPass, - Message: "可疑文件检查", - Details: []protocol.SecurityCheckSub{}, - } - - suspiciousCount := 0 - - // 检查临时目录下的可执行文件 - for _, dir := range fc.config.FileConfig.TempDirs { - files := fc.findSuspiciousExecutables(dir) - if len(files) > 0 { - check.Status = StatusWarn - for _, file := range files { - suspiciousCount++ - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: "tmp_executable", - Status: StatusWarn, - Message: file, - }) - } - } - } - - if suspiciousCount == 0 { - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: "files_clean", - Status: StatusPass, - Message: "未发现可疑文件", - }) - check.Message = "文件系统正常" - } else { - check.Message = fmt.Sprintf("发现 %d 个可疑文件", suspiciousCount) - } - - return check -} - -// CheckFileIntegrity 检查系统文件完整性(修复bug版本) -func (fc *FileChecker) CheckFileIntegrity() protocol.SecurityCheck { - check := protocol.SecurityCheck{ - Category: "file_integrity", - Status: StatusPass, - Message: "系统文件完整性检查", - Details: []protocol.SecurityCheckSub{}, - } - - suspiciousCount := 0 - - // 1. 检查 /etc/ld.so.preload - if content, err := os.ReadFile("/etc/ld.so.preload"); err == nil { - contentStr := strings.TrimSpace(string(content)) - if contentStr != "" { - suspiciousCount++ - check.Status = StatusFail - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: "ld_preload_exists", - Status: StatusFail, - Message: fmt.Sprintf("发现动态链接库劫持配置 (/etc/ld.so.preload): %s", contentStr), - Evidence: &protocol.Evidence{ - FilePath: "/etc/ld.so.preload", - RiskLevel: "critical", - }, - }) - } - } - - // 2. 检查系统文件最近修改时间 - recentModifiedCount := 0 - for _, binPath := range fc.config.FileConfig.CriticalBinaries { - if _, err := os.Stat(binPath); err != nil { - continue - } - - isModified, verifyOutput := fc.verifyFileByModTime(binPath) - if isModified { - recentModifiedCount++ - check.Status = StatusWarn - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: "recently_modified_binary", - Status: StatusWarn, - Message: verifyOutput, - }) - } - } - - if suspiciousCount > 0 || recentModifiedCount > 0 { - check.Message = fmt.Sprintf("发现 %d 个文件完整性异常", suspiciousCount+recentModifiedCount) - } else { - check.Message = "核心文件完整性正常" - } - - return check -} - -// CheckImmutableFiles 检查不可变文件 -func (fc *FileChecker) CheckImmutableFiles() protocol.SecurityCheck { - check := protocol.SecurityCheck{ - Category: "immutable_files", - Status: StatusPass, - Message: "不可变文件检查", - Details: []protocol.SecurityCheckSub{}, - } - - // 检查 lsattr 是否可用 - if _, err := exec.LookPath("lsattr"); err != nil { - check.Status = StatusSkip - check.Message = "lsattr 命令不可用,无法检查不可变属性" - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: "lsattr_unavailable", - Status: StatusSkip, - Message: "系统未安装 lsattr 工具(需要 e2fsprogs 包)", - }) - return check - } - - suspiciousCount := 0 - - for _, file := range fc.config.FileConfig.ImmutableCheckFiles { - if _, err := os.Stat(file); err != nil { - continue - } - - cmd := exec.Command("lsattr", "-d", file) - output, err := cmd.Output() - if err != nil { - continue - } - - outStr := string(output) - if strings.Contains(outStr, "-i-") || strings.Contains(outStr, "----i") { - suspiciousCount++ - check.Status = StatusFail - - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: "immutable_file_found", - Status: StatusFail, - Message: fmt.Sprintf("关键文件被锁定(不可变): %s (可能是Rootkit保护)", file), - Evidence: &protocol.Evidence{ - FilePath: file, - RiskLevel: "high", - }, - }) - } - } - - if suspiciousCount > 0 { - check.Message = fmt.Sprintf("发现 %d 个异常锁定的系统文件", suspiciousCount) - } else { - check.Message = "未发现被恶意锁定的文件" - } - - return check -} - -// findSuspiciousExecutables 查找可疑的可执行文件 -func (fc *FileChecker) findSuspiciousExecutables(dir string) []string { - var suspicious []string - - entries, err := os.ReadDir(dir) - if err != nil { - return suspicious - } - - now := time.Now() - for _, entry := range entries { - if entry.IsDir() { - continue - } - - fullPath := filepath.Join(dir, entry.Name()) - info, err := entry.Info() - if err != nil { - continue - } - - // 检查是否可执行 - if info.Mode()&0111 != 0 { - age := now.Sub(info.ModTime()) - sizeKB := info.Size() / 1024 - sizeMB := info.Size() / 1024 / 1024 - - if age < time.Duration(fc.config.FileConfig.RecentExecutableHours)*time.Hour { - suspicious = append(suspicious, fmt.Sprintf("%s 下的最近可执行文件: %s (大小: %dKB, 创建时间: %s)", - dir, fullPath, sizeKB, info.ModTime().Format("2006-01-02 15:04:05"))) - } else if sizeMB > fc.config.FileConfig.LargeExecutableMB { - suspicious = append(suspicious, fmt.Sprintf("%s 下的大型可执行文件: %s (大小: %dMB)", - dir, fullPath, sizeMB)) - } - } - } - - return suspicious -} - -// verifyFileByModTime 通过修改时间检查文件 -func (fc *FileChecker) verifyFileByModTime(filePath string) (bool, string) { - info, err := os.Stat(filePath) - if err != nil { - return false, "" - } - - modTime := info.ModTime() - age := time.Since(modTime) - - // 如果在最近 24 小时内被修改,标记为可疑 - if age < 24*time.Hour { - return true, fmt.Sprintf("系统命令最近24小时内有更新: %s (请确认是否为正常运维)", filePath) - } - - return false, "" -} - -// AccountChecker 账户检查器 -type AccountChecker struct { - config *Config -} - -// NewAccountChecker 创建账户检查器 -func NewAccountChecker(config *Config) *AccountChecker { - return &AccountChecker{config: config} -} - -// CheckSystemAccounts 检查系统账户异常 -func (ac *AccountChecker) CheckSystemAccounts() protocol.SecurityCheck { - check := protocol.SecurityCheck{ - Category: "system_accounts", - Status: StatusPass, - Message: "系统账户检查", - Details: []protocol.SecurityCheckSub{}, - } - - // 1. 检查可疑账户 - suspiciousAccounts := ac.findSuspiciousAccounts() - for _, acc := range suspiciousAccounts { - check.Status = StatusWarn - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: "suspicious_account", - Status: StatusWarn, - Message: acc, - }) - } - - // 2. 检查无密码账户 - noPasswordAccounts := ac.findNoPasswordAccounts() - for _, acc := range noPasswordAccounts { - check.Status = StatusFail - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: "no_password_account", - Status: StatusFail, - Message: fmt.Sprintf("无密码账户: %s", acc), - }) - } - - // 3. 检查 UID 为 0 的非 root 账户 - rootUIDAccounts := ac.findRootUIDAccounts() - for _, acc := range rootUIDAccounts { - check.Status = StatusFail - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: "uid0_account", - Status: StatusFail, - Message: fmt.Sprintf("UID为0的非root账户: %s", acc), - }) - } - - if check.Status == StatusPass { - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: "accounts_clean", - Status: StatusPass, - Message: "系统账户正常", - }) - check.Message = "账户配置正常" - } else if check.Status == StatusWarn { - check.Message = "发现可疑账户" - } else { - check.Message = "发现严重账户安全问题" - } - - return check -} - -// findSuspiciousAccounts 查找可疑账户 -func (ac *AccountChecker) findSuspiciousAccounts() []string { - var suspicious []string - - file, err := os.Open("/etc/passwd") - if err != nil { - return suspicious - } - defer file.Close() - - scanner := bufio.NewScanner(file) - for scanner.Scan() { - line := scanner.Text() - parts := strings.Split(line, ":") - if len(parts) < 7 { - continue - } - - username := parts[0] - uidStr := parts[2] - shell := parts[6] - - uid, _ := strconv.Atoi(uidStr) - - // 系统账户(UID<1000)但有可登录 shell - if uid < 1000 && username != "root" { - legitimateShells := []string{ - "/sbin/nologin", "/bin/false", "/usr/sbin/nologin", - "/bin/sync", "/sbin/shutdown", "/sbin/halt", - } - - isLegitimate := false - for _, legitShell := range legitimateShells { - if shell == legitShell { - isLegitimate = true - break - } - } - - if !isLegitimate { - suspicious = append(suspicious, fmt.Sprintf("系统账户有可登录shell: %s (UID: %s, Shell: %s)", username, uidStr, shell)) - } - } - } - - return suspicious -} - -// findNoPasswordAccounts 查找无密码账户 -func (ac *AccountChecker) findNoPasswordAccounts() []string { - var noPassword []string - - file, err := os.Open("/etc/shadow") - if err != nil { - return noPassword - } - defer file.Close() - - scanner := bufio.NewScanner(file) - for scanner.Scan() { - line := scanner.Text() - parts := strings.Split(line, ":") - if len(parts) >= 2 { - username := parts[0] - password := parts[1] - - if password == "" { - noPassword = append(noPassword, username) - } - } - } - - return noPassword -} - -// findRootUIDAccounts 查找 UID 为 0 的非 root 账户 -func (ac *AccountChecker) findRootUIDAccounts() []string { - var rootUID []string - - file, err := os.Open("/etc/passwd") - if err != nil { - return rootUID - } - defer file.Close() - - scanner := bufio.NewScanner(file) - for scanner.Scan() { - line := scanner.Text() - parts := strings.Split(line, ":") - if len(parts) >= 3 { - username := parts[0] - uid := parts[2] - - if uid == "0" && username != "root" { - rootUID = append(rootUID, username) - } - } - } - - return rootUID -} diff --git a/pkg/agent/audit/check_network.go b/pkg/agent/audit/check_network.go deleted file mode 100644 index 3c24fbb..0000000 --- a/pkg/agent/audit/check_network.go +++ /dev/null @@ -1,270 +0,0 @@ -package audit - -import ( - "fmt" - "strings" - - "github.com/dushixiang/pika/internal/protocol" - gopsutilNet "github.com/shirou/gopsutil/v4/net" - "github.com/shirou/gopsutil/v4/process" -) - -// NetworkChecker 网络检查器 -type NetworkChecker struct { - config *Config - cache *ProcessCache - evidence *EvidenceCollector - strUtil *StringUtils -} - -// NewNetworkChecker 创建网络检查器 -func NewNetworkChecker(config *Config, cache *ProcessCache, evidence *EvidenceCollector) *NetworkChecker { - return &NetworkChecker{ - config: config, - cache: cache, - evidence: evidence, - strUtil: &StringUtils{}, - } -} - -// CheckListeningPorts 检查异常监听端口 -func (nc *NetworkChecker) CheckListeningPorts() protocol.SecurityCheck { - check := protocol.SecurityCheck{ - Category: "listening_ports", - Status: StatusPass, - Message: "端口监听检查", - Details: []protocol.SecurityCheckSub{}, - } - - connections, err := gopsutilNet.Connections("all") - if err != nil { - check.Status = StatusSkip - check.Message = "无法获取网络连接信息" - globalLogger.Error("无法获取网络连接信息: %v", err) - return check - } - - suspiciousCount := 0 - totalListening := 0 - publicListening := 0 - - for _, conn := range connections { - if conn.Status != "LISTEN" { - continue - } - - totalListening++ - port := conn.Laddr.Port - listenAddr := conn.Laddr.IP - pid := conn.Pid - - // 本地回环监听的服务一般是安全的,跳过 - if listenAddr == "127.0.0.1" || listenAddr == "::1" { - continue - } - - publicListening++ - - // 获取进程信息 - if pid <= 0 { - continue - } - - proc, err := process.NewProcess(int32(pid)) - if err != nil { - continue - } - - name, _ := proc.Name() - exe, _ := proc.Exe() - cmdline, _ := proc.Cmdline() - - // 检查 1: 高危端口 - if desc, exists := nc.config.NetworkConfig.SuspiciousPorts[port]; exists { - suspiciousCount++ - check.Status = StatusWarn - - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: fmt.Sprintf("suspicious_port_%d", port), - Status: StatusWarn, - Message: fmt.Sprintf("高危端口监听: %s:%d (%s) - 进程: %s (PID: %d)", listenAddr, port, desc, name, pid), - Evidence: nc.evidence.CollectProcessEvidence(proc, "high"), - }) - continue - } - - // 检查 2: 挖矿程序监听端口 - if nc.isMinerProcess(name, cmdline) { - suspiciousCount++ - check.Status = StatusFail - - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: fmt.Sprintf("miner_listener_%d", port), - Status: StatusFail, - Message: fmt.Sprintf("挖矿程序监听端口: %s 监听 %s:%d (PID: %d)", name, listenAddr, port, pid), - Evidence: nc.evidence.CollectProcessEvidence(proc, "high"), - }) - continue - } - - // 检查 3: 可疑路径的程序监听端口 - if nc.isSuspiciousPath(exe) { - suspiciousCount++ - check.Status = StatusFail - - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: fmt.Sprintf("suspicious_exe_listener_%d", port), - Status: StatusFail, - Message: fmt.Sprintf("可疑路径程序监听端口: %s 监听 %s:%d (PID: %d, 路径: %s)", name, listenAddr, port, pid, exe), - Evidence: nc.evidence.CollectProcessEvidence(proc, "high"), - }) - continue - } - } - - if suspiciousCount == 0 { - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: "safe_ports", - Status: StatusPass, - Message: fmt.Sprintf("监听%d个端口(公网%d个),未发现可疑监听", totalListening, publicListening), - }) - check.Message = "端口监听正常" - } else { - check.Message = fmt.Sprintf("发现 %d 个可疑端口监听", suspiciousCount) - } - - return check -} - -// CheckNetworkConnections 检查异常网络连接 -func (nc *NetworkChecker) CheckNetworkConnections() protocol.SecurityCheck { - check := protocol.SecurityCheck{ - Category: "network_connections", - Status: StatusPass, - Message: "网络连接检查", - Details: []protocol.SecurityCheckSub{}, - } - - connections, err := gopsutilNet.Connections("all") - if err != nil { - check.Status = StatusSkip - check.Message = "无法获取网络连接" - globalLogger.Error("无法获取网络连接: %v", err) - return check - } - - suspiciousCount := 0 - establishedCount := 0 - - for _, conn := range connections { - if conn.Status != "ESTABLISHED" { - continue - } - - establishedCount++ - - // 获取进程信息 - var processName string - var processPath string - if conn.Pid > 0 { - proc, err := process.NewProcess(int32(conn.Pid)) - if err == nil { - processName, _ = proc.Name() - processPath, _ = proc.Exe() - } - } - - // 检查 1: 连接到挖矿池 - if nc.isMiningPool(conn.Raddr.IP, conn.Raddr.Port) { - suspiciousCount++ - check.Status = StatusFail - - msg := fmt.Sprintf("连接到挖矿池: %s:%d", conn.Raddr.IP, conn.Raddr.Port) - if processName != "" { - msg += fmt.Sprintf(" (进程: %s, PID: %d)", processName, conn.Pid) - } - - var evidence *protocol.Evidence - if conn.Pid > 0 { - proc, _ := process.NewProcess(int32(conn.Pid)) - if proc != nil { - evidence = nc.evidence.CollectProcessEvidence(proc, "high") - } - } - - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: "mining_connection", - Status: StatusFail, - Message: msg, - Evidence: evidence, - }) - } - - // 检查 2: 可疑路径的进程外连 - if processPath != "" && nc.isSuspiciousPath(processPath) { - suspiciousCount++ - check.Status = StatusFail - - var evidence *protocol.Evidence - if conn.Pid > 0 { - proc, _ := process.NewProcess(int32(conn.Pid)) - if proc != nil { - evidence = nc.evidence.CollectProcessEvidence(proc, "high") - } - } - - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: "suspicious_path_connection", - Status: StatusFail, - Message: fmt.Sprintf("可疑路径进程外连: %s (PID:%d) -> %s:%d", processPath, conn.Pid, conn.Raddr.IP, conn.Raddr.Port), - Evidence: evidence, - }) - } - } - - if suspiciousCount == 0 { - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: "connections_clean", - Status: StatusPass, - Message: fmt.Sprintf("共 %d 个活动连接,未发现异常", establishedCount), - }) - check.Message = "网络连接正常" - } else { - check.Message = fmt.Sprintf("发现 %d 个可疑连接", suspiciousCount) - } - - return check -} - -// isSuspiciousPath 检查可执行文件路径是否可疑 -func (nc *NetworkChecker) isSuspiciousPath(path string) bool { - if path == "" { - return false - } - - for _, sp := range nc.config.FileConfig.SuspiciousPaths { - if strings.Contains(path, sp) { - return true - } - } - - return false -} - -// isMinerProcess 检查是否是挖矿进程 -func (nc *NetworkChecker) isMinerProcess(name, cmdline string) bool { - return nc.strUtil.ContainsAny(name+" "+cmdline, nc.config.ProcessConfig.MinerKeywords) -} - -// isMiningPool 检查是否连接到挖矿池 -func (nc *NetworkChecker) isMiningPool(ip string, port uint32) bool { - // 检查端口 - for _, p := range nc.config.NetworkConfig.MinerPorts { - if port == p { - return true - } - } - - // TODO: 可以添加域名检查(需要反向 DNS) - return false -} diff --git a/pkg/agent/audit/check_process.go b/pkg/agent/audit/check_process.go deleted file mode 100644 index f74701f..0000000 --- a/pkg/agent/audit/check_process.go +++ /dev/null @@ -1,513 +0,0 @@ -package audit - -import ( - "fmt" - "strings" - "time" - - "github.com/dushixiang/pika/internal/protocol" - "github.com/shirou/gopsutil/v4/process" -) - -// ProcessChecker 进程检查器 -type ProcessChecker struct { - config *Config - cache *ProcessCache - evidence *EvidenceCollector -} - -// NewProcessChecker 创建进程检查器 -func NewProcessChecker(config *Config, cache *ProcessCache, evidence *EvidenceCollector) *ProcessChecker { - return &ProcessChecker{ - config: config, - cache: cache, - evidence: evidence, - } -} - -// CheckSuspiciousProcesses 检查可疑进程 -func (pc *ProcessChecker) CheckSuspiciousProcesses() protocol.SecurityCheck { - check := protocol.SecurityCheck{ - Category: "suspicious_processes", - Status: StatusPass, - Message: "可疑进程检测", - Details: []protocol.SecurityCheckSub{}, - } - - procs, err := pc.cache.Get() - if err != nil { - check.Status = StatusSkip - check.Message = "无法获取进程列表" - globalLogger.Error("无法获取进程列表: %v", err) - return check - } - - suspiciousCount := 0 - - for _, p := range procs { - name, _ := p.Name() - cmdline, _ := p.Cmdline() - exe, _ := p.Exe() - - // 1. 检查挖矿 - if pc.isMinerProcess(name, cmdline) { - suspiciousCount++ - check.Status = StatusFail - - cpuPercent, _ := p.CPUPercent() - - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: "miner_process", - Status: StatusFail, - Message: fmt.Sprintf("检测到挖矿程序: %s (PID: %d, CPU: %.1f%%)", name, p.Pid, cpuPercent), - Evidence: pc.evidence.CollectProcessEvidence(p, "high"), - }) - continue - } - - // 2. 检查高 CPU + 网络连接的可疑进程 - if pc.isHighCPUMinerSuspect(p, name, exe) { - suspiciousCount++ - check.Status = StatusWarn - - cpuPercent, _ := p.CPUPercent() - - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: "high_cpu_network_process", - Status: StatusWarn, - Message: fmt.Sprintf("高CPU进程持续网络连接: %s (PID: %d, CPU: %.1f%%) - 疑似挖矿", name, p.Pid, cpuPercent), - Evidence: pc.evidence.CollectProcessEvidence(p, "medium"), - }) - continue - } - - // 3. 检查反弹 Shell - if pc.isReverseShell(cmdline) { - suspiciousCount++ - check.Status = StatusFail - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: "reverse_shell", - Status: StatusFail, - Message: fmt.Sprintf("检测到反弹shell: %s (PID: %d)", cmdline, p.Pid), - Evidence: pc.evidence.CollectProcessEvidence(p, "high"), - }) - continue - } - - // 4. 检查无文件进程/被删除的二进制 - if strings.Contains(exe, "(deleted)") { - // 检查白名单 - if pc.isInDeletedWhitelist(name) { - continue - } - - // 检查启动时间 - createTime, _ := p.CreateTime() - uptime := time.Now().UnixMilli() - createTime - if uptime < int64(pc.config.ProcessConfig.RecentStartupHours)*60*60*1000 { - suspiciousCount++ - check.Status = StatusWarn - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: "deleted_binary", - Status: StatusWarn, - Message: fmt.Sprintf("可疑的已删除进程: %s (PID: %d, 路径: %s) - 最近%dh内启动", name, p.Pid, exe, pc.config.ProcessConfig.RecentStartupHours), - Evidence: pc.evidence.CollectProcessEvidence(p, "medium"), - }) - } - } - - // 5. 内存执行检测 (memfd) - if strings.Contains(exe, "memfd:") { - // 排除 runc / kubelet 等容器组件 - if !strings.Contains(cmdline, "runc") && !strings.Contains(name, "containerd") { - suspiciousCount++ - check.Status = StatusFail - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: "fileless_memfd", - Status: StatusFail, - Message: fmt.Sprintf("检测到无文件内存进程: %s (PID: %d)", name, p.Pid), - Evidence: pc.evidence.CollectProcessEvidence(p, "high"), - }) - } - } - } - - if suspiciousCount == 0 { - check.Message = "进程行为正常" - } else { - check.Message = fmt.Sprintf("发现 %d 个可疑进程", suspiciousCount) - } - - return check -} - -// CheckSuspiciousEnvVars 检查进程的可疑环境变量 -func (pc *ProcessChecker) CheckSuspiciousEnvVars() protocol.SecurityCheck { - check := protocol.SecurityCheck{ - Category: "suspicious_env_vars", - Status: StatusPass, - Message: "进程环境变量检查", - Details: []protocol.SecurityCheckSub{}, - } - - procs, err := pc.cache.Get() - if err != nil { - check.Status = StatusSkip - check.Message = "无法获取进程列表" - return check - } - - suspiciousCount := 0 - for _, p := range procs { - env, err := p.Environ() - if err != nil { - continue - } - - name, _ := p.Name() - exe, _ := p.Exe() - - for _, e := range env { - if strings.HasPrefix(e, "LD_PRELOAD=") || strings.HasPrefix(e, "LD_LIBRARY_PATH=") { - parts := strings.SplitN(e, "=", 2) - if len(parts) != 2 { - continue - } - value := parts[1] - - // 改用风险特征检测,只在真正可疑时报警 - riskLevel, reason := pc.assessLibraryRiskWithReason(value, name, exe) - - // 只报告中高风险的情况 - if riskLevel == "low" || riskLevel == "none" { - continue - } - - status := StatusWarn - if riskLevel == "high" { - status = StatusFail - check.Status = StatusFail - } else if check.Status != StatusFail { - check.Status = StatusWarn - } - - suspiciousCount++ - - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: "suspicious_ld_env", - Status: status, - Message: fmt.Sprintf("进程 '%s'(PID: %d) 发现可疑环境变量: %s\n原因: %s", name, p.Pid, e, reason), - Evidence: pc.evidence.CollectProcessEvidence(p, riskLevel), - }) - break - } - } - } - - if suspiciousCount == 0 { - check.Message = "未发现可疑的进程环境变量" - } else { - check.Message = fmt.Sprintf("发现 %d 个进程存在可疑环境变量", suspiciousCount) - } - - return check -} - -// isMinerProcess 检查是否是挖矿进程 -func (pc *ProcessChecker) isMinerProcess(name, cmdline string) bool { - checkStr := strings.ToLower(name + " " + cmdline) - - // 检查关键词 - for _, keyword := range pc.config.ProcessConfig.MinerKeywords { - if strings.Contains(checkStr, keyword) { - return true - } - } - - // 检查挖矿命令特征 - if strings.Contains(cmdline, "--donate-level") || - strings.Contains(cmdline, "-o stratum+tcp") || - (strings.Contains(cmdline, "--pool") && strings.Contains(cmdline, "--user")) { - return true - } - - return false -} - -// isHighCPUMinerSuspect 检查是否是高 CPU 挖矿嫌疑进程 -func (pc *ProcessChecker) isHighCPUMinerSuspect(p *process.Process, name, exe string) bool { - cpuPercent, err := p.CPUPercent() - if err != nil || cpuPercent < pc.config.ProcessConfig.HighCPUThreshold { - return false - } - - // 检查白名单 - nameLower := strings.ToLower(name) - exeLower := strings.ToLower(exe) - - for _, whitelisted := range pc.config.ProcessConfig.HighCPUWhitelist { - if strings.Contains(nameLower, whitelisted) || strings.Contains(exeLower, whitelisted) { - return false - } - } - - // 检查是否有网络连接 - connections, err := p.Connections() - if err != nil || len(connections) == 0 { - return false - } - - // 检查是否有 ESTABLISHED 状态的外部连接 - for _, conn := range connections { - if conn.Status == "ESTABLISHED" && !IsLocalIP(conn.Raddr.IP) { - return true - } - } - - return false -} - -// isReverseShell 检查是否是反弹 shell -func (pc *ProcessChecker) isReverseShell(cmdline string) bool { - patterns := []string{ - "bash -i >& /dev/tcp", - "nc -e /bin/bash", - "nc -e /bin/sh", - "python -c 'import socket", - "perl -e 'use Socket", - "/bin/sh -i", - "/bin/bash -i", - } - - for _, pattern := range patterns { - if strings.Contains(cmdline, pattern) { - return true - } - } - - return false -} - -// isInDeletedWhitelist 检查是否在 deleted 进程白名单中 -func (pc *ProcessChecker) isInDeletedWhitelist(name string) bool { - for _, safeName := range pc.config.ProcessConfig.DeletedWhitelist { - if strings.Contains(strings.ToLower(name), safeName) { - return true - } - } - return false -} - -// isLegitimateLibraryPath 检查是否是合法的库路径 -func (pc *ProcessChecker) isLegitimateLibraryPath(path, processName, processExe string) bool { - pathLower := strings.ToLower(path) - processNameLower := strings.ToLower(processName) - processExeLower := strings.ToLower(processExe) - - // 现代应用打包系统 (Snap, Flatpak, AppImage) - // 这些系统会使用 LD_PRELOAD/LD_LIBRARY_PATH 加载隔离环境中的库 - appPackagingSystems := []string{ - "snap", "flatpak", "appimage", - } - for _, sys := range appPackagingSystems { - // 检查路径是否来自这些打包系统 - if strings.Contains(pathLower, "/"+sys+"/") || - strings.Contains(pathLower, "."+sys+"/") { - return true - } - // 检查进程是否由这些系统启动 - if strings.Contains(processExeLower, "/"+sys+"/") || - strings.Contains(processNameLower, sys) { - return true - } - } - - // 开发工具(IDE) - devTools := []string{ - "jetbrains", "vscode", "idea", "pycharm", "goland", "webstorm", - "clion", "rider", "datagrip", "androidstudio", - } - for _, tool := range devTools { - if strings.Contains(processExeLower, tool) { - return true - } - } - - // 数据库 - databases := []string{"postgres", "mysql", "mariadb", "mongodb", "redis", "elasticsearch", "clickhouse"} - for _, db := range databases { - if strings.Contains(processNameLower, db) { - return true - } - } - - // 容器相关 - containers := []string{"docker", "containerd", "kubelet", "podman", "cri-o", "k3s", "kubernetes"} - for _, container := range containers { - if strings.Contains(processNameLower, container) { - return true - } - } - - // Web 服务器 - webServers := []string{"nginx", "apache", "httpd", "caddy", "traefik"} - for _, ws := range webServers { - if strings.Contains(processNameLower, ws) { - return true - } - } - - // 科学计算和虚拟化 - scientificAndVirt := []string{ - "matlab", "mathematica", "octave", "julia", // 科学计算 - "virtualbox", "qemu", "vmware", "kvm", "libvirt", // 虚拟化 - "datadog", "newrelic", "prometheus", "grafana", // 监控工具 - } - for _, tool := range scientificAndVirt { - if strings.Contains(processNameLower, tool) || - strings.Contains(processExeLower, tool) { - return true - } - } - - // 系统库路径 - systemLibPaths := []string{ - "/usr/lib", "/lib", "/usr/local/lib", - "/opt/", "/usr/share", - } - for _, sysPath := range systemLibPaths { - if strings.HasPrefix(path, sysPath) { - return true - } - } - - return false -} - -// assessLibraryRiskWithReason 基于风险特征评估库路径的风险等级,返回风险等级和原因 -func (pc *ProcessChecker) assessLibraryRiskWithReason(path, processName, processExe string) (string, string) { - pathLower := strings.ToLower(path) - processNameLower := strings.ToLower(processName) - processExeLower := strings.ToLower(processExe) - - // 空路径 - if strings.TrimSpace(path) == "" { - return "none", "" - } - - // 1. 首先排除明显安全的情况 - - // 系统标准库路径 - 非常安全 - systemLibPaths := []string{ - "/usr/lib/", "/lib/", "/usr/local/lib/", - "/lib64/", "/usr/lib64/", "/usr/lib32/", - } - for _, sysPath := range systemLibPaths { - if strings.HasPrefix(path, sysPath) { - return "none", "" - } - } - - // 已知的应用打包系统 - 安全 - appPackagingSystems := []string{ - "/snap/", "/var/lib/snapd/snap/", - "/app/", "/var/lib/flatpak/", - "/.local/share/flatpak/", - } - for _, sys := range appPackagingSystems { - if strings.Contains(path, sys) { - return "none", "" - } - } - - // 常见的软件安装目录 - 相对安全 - commonAppPaths := []string{ - "/opt/", "/usr/share/", "/usr/local/share/", - "/Applications/", // macOS - } - for _, appPath := range commonAppPaths { - if strings.HasPrefix(path, appPath) { - return "none", "" - } - } - - // 2. 检查高风险特征 - - // 临时目录中的库 - 高风险 - highRiskPaths := []string{"/tmp/", "/dev/shm/", "/var/tmp/"} - for _, hrp := range highRiskPaths { - if strings.Contains(pathLower, hrp) { - return "high", fmt.Sprintf("库文件位于临时目录 %s,可能是恶意注入", hrp) - } - } - - // 隐藏目录/文件 + 非标准路径 - 中风险 - if strings.Contains(path, "/.") { - // 但如果是用户主目录下的隐藏配置目录,降低风险 - userConfigPaths := []string{ - "/.config/", "/.local/", "/.cache/", - "/.wine/", "/.steam/", "/.mozilla/", - } - isUserConfig := false - for _, userPath := range userConfigPaths { - if strings.Contains(pathLower, userPath) { - isUserConfig = true - break - } - } - if !isUserConfig { - return "medium", "库文件位于隐藏目录,且不是常见的用户配置目录" - } - } - - // 3. 检查进程本身是否可疑 - - // 如果进程路径也在临时目录,风险升级 - if processExe != "" { - for _, hrp := range highRiskPaths { - if strings.Contains(strings.ToLower(processExe), hrp) { - return "high", fmt.Sprintf("进程和库都位于临时目录,高度可疑") - } - } - } - - // 4. 检查进程名是否可疑 - suspiciousNames := []string{ - "xmrig", "miner", "kthreaddk", "kthreaddi", ".sh", - "python -c", "perl -e", "bash -i", "/dev/tcp", - } - for _, susName := range suspiciousNames { - if strings.Contains(processNameLower, susName) || strings.Contains(processExeLower, susName) { - return "high", fmt.Sprintf("进程名称或路径包含可疑特征: %s", susName) - } - } - - // 5. 其他情况 - 低风险或无风险 - - // 用户主目录下的应用 - 低风险(很多用户自己编译或安装的软件) - userHomePaths := []string{"/home/", "/root/", "/Users/"} - for _, homePath := range userHomePaths { - if strings.HasPrefix(path, homePath) { - // 但如果在主目录的明显的程序目录,就是安全的 - safeUserPaths := []string{ - "/bin/", "/apps/", "/software/", "/opt/", - "/go/", "/java/", "/python/", "/.jenv/", "/.pyenv/", "/.rbenv/", - } - for _, safePath := range safeUserPaths { - if strings.Contains(pathLower, safePath) { - return "none", "" - } - } - // 其他情况,低风险,不报警 - return "low", "" - } - } - - // 相对路径或当前目录 - 中等风险 - if strings.HasPrefix(path, "./") || strings.HasPrefix(path, "../") || !strings.HasPrefix(path, "/") { - return "medium", "使用相对路径加载库,可能是本地开发或潜在风险" - } - - // 默认:不在标准路径但也没有明显风险特征 - 低风险,不报警 - return "low", "" -} diff --git a/pkg/agent/audit/check_rootkit.go b/pkg/agent/audit/check_rootkit.go deleted file mode 100644 index 064aed4..0000000 --- a/pkg/agent/audit/check_rootkit.go +++ /dev/null @@ -1,207 +0,0 @@ -package audit - -import ( - "fmt" - "os" - "strconv" - "strings" - "time" - - "github.com/dushixiang/pika/internal/protocol" -) - -// RootkitChecker rootkit 检测器 -type RootkitChecker struct { - config *Config - cache *ProcessCache - evidence *EvidenceCollector -} - -// NewRootkitChecker 创建 rootkit 检测器 -func NewRootkitChecker(config *Config, cache *ProcessCache, evidence *EvidenceCollector) *RootkitChecker { - return &RootkitChecker{ - config: config, - cache: cache, - evidence: evidence, - } -} - -// Check 检测 rootkit 和恶意内核模块 -func (rc *RootkitChecker) Check() protocol.SecurityCheck { - check := protocol.SecurityCheck{ - Category: "rootkit_detection", - Status: StatusPass, - Message: "Rootkit检测", - Details: []protocol.SecurityCheckSub{}, - } - - // 检查加载的内核模块 - suspiciousModules := rc.checkKernelModules() - if len(suspiciousModules) > 0 { - check.Status = StatusWarn - for _, mod := range suspiciousModules { - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: "suspicious_module", - Status: StatusWarn, - Message: fmt.Sprintf("可疑内核模块: %s", mod), - }) - } - } else { - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: "kernel_modules", - Status: StatusPass, - Message: "未发现可疑内核模块", - }) - } - - // 检查隐藏进程 - hiddenProcs := rc.checkHiddenProcesses() - if len(hiddenProcs) > 0 { - check.Status = StatusFail - for _, pid := range hiddenProcs { - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: "hidden_process", - Status: StatusFail, - Message: fmt.Sprintf("检测到隐藏进程: PID %d", pid), - }) - } - } else { - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: "hidden_processes", - Status: StatusPass, - Message: "未发现隐藏进程", - }) - } - - // 更新总体消息 - switch check.Status { - case StatusPass: - check.Message = "未检测到rootkit" - case StatusWarn: - check.Message = "发现可疑rootkit特征" - case StatusFail: - check.Message = "发现rootkit感染迹象" - } - - return check -} - -// checkKernelModules 检查可疑内核模块 -func (rc *RootkitChecker) checkKernelModules() []string { - var suspicious []string - - content, err := os.ReadFile("/proc/modules") - if err != nil { - globalLogger.Warn("无法读取 /proc/modules: %v", err) - return suspicious - } - - // 已知的恶意模块名称特征 - maliciousPatterns := []string{ - "rootkit", "backdoor", "hidden", "stealth", - "diamorphine", "suterusu", "reptile", - } - - lines := strings.Split(string(content), "\n") - for _, line := range lines { - fields := strings.Fields(line) - if len(fields) > 0 { - modName := fields[0] - for _, pattern := range maliciousPatterns { - if strings.Contains(strings.ToLower(modName), pattern) { - suspicious = append(suspicious, modName) - globalLogger.Warn("发现可疑内核模块: %s", modName) - break - } - } - } - } - - return suspicious -} - -// checkHiddenProcesses 检查隐藏进程(优化版:二次确认机制) -func (rc *RootkitChecker) checkHiddenProcesses() []int32 { - // 第一轮快照 - hiddenCandidates := rc.getHiddenCandidates() - - if len(hiddenCandidates) == 0 { - return []int32{} - } - - globalLogger.Debug("发现 %d 个隐藏进程候选,开始二次确认", len(hiddenCandidates)) - - // 等待 100ms,消除进程刚好退出的时间差 - time.Sleep(100 * time.Millisecond) - - // 第二轮确认 - finalHidden := []int32{} - - // 重新获取当前的 gopsutil 列表 - procs, err := rc.cache.Get() - if err != nil { - globalLogger.Warn("二次确认时无法获取进程列表: %v", err) - return []int32{} - } - - currentApiPids := make(map[int32]bool) - for _, p := range procs { - currentApiPids[p.Pid] = true - } - - for _, pid := range hiddenCandidates { - // 检查 /proc/pid 是否依然存在 - if _, err := os.Stat(fmt.Sprintf("/proc/%d", pid)); err == nil { - // /proc 下存在,但 API 列表里依然没有 - if !currentApiPids[pid] { - finalHidden = append(finalHidden, pid) - globalLogger.Warn("确认隐藏进程: PID %d", pid) - } - } - } - - return finalHidden -} - -// getHiddenCandidates 获取初步的隐藏进程候选 -func (rc *RootkitChecker) getHiddenCandidates() []int32 { - var hidden []int32 - - // 1. 扫描 /proc - procPids := make(map[int32]bool) - entries, err := os.ReadDir("/proc") - if err != nil { - globalLogger.Warn("无法读取 /proc: %v", err) - return hidden - } - - for _, entry := range entries { - if entry.IsDir() { - pid, err := strconv.Atoi(entry.Name()) - if err == nil { - procPids[int32(pid)] = true - } - } - } - - // 2. 扫描 API (gopsutil) - apiPids := make(map[int32]bool) - procs, err := rc.cache.Get() - if err != nil { - globalLogger.Warn("无法获取进程列表: %v", err) - return hidden - } - - for _, p := range procs { - apiPids[p.Pid] = true - } - - // 3. 对比 - for pid := range procPids { - if !apiPids[pid] { - hidden = append(hidden, pid) - } - } - - return hidden -} diff --git a/pkg/agent/audit/check_ssh.go b/pkg/agent/audit/check_ssh.go deleted file mode 100644 index 071e997..0000000 --- a/pkg/agent/audit/check_ssh.go +++ /dev/null @@ -1,387 +0,0 @@ -package audit - -import ( - "bufio" - "fmt" - "io" - "os" - "path/filepath" - "strings" - "time" - - "github.com/dushixiang/pika/internal/protocol" -) - -// SSHChecker SSH 安全检查器 -type SSHChecker struct { - config *Config - cache *ProcessCache - evidence *EvidenceCollector - executor *CommandExecutor - strUtil *StringUtils -} - -// NewSSHChecker 创建 SSH 检查器 -func NewSSHChecker(config *Config, cache *ProcessCache, evidence *EvidenceCollector, executor *CommandExecutor) *SSHChecker { - return &SSHChecker{ - config: config, - cache: cache, - evidence: evidence, - executor: executor, - strUtil: &StringUtils{}, - } -} - -// Check 检查 SSH 后门和安全配置 -func (sc *SSHChecker) Check() protocol.SecurityCheck { - check := protocol.SecurityCheck{ - Category: "ssh_security", - Status: StatusPass, - Message: "SSH安全检查", - Details: []protocol.SecurityCheckSub{}, - } - - // 检查 SSH 服务是否运行 - if !sc.isSSHRunning() { - check.Message = "SSH服务未运行" - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: "ssh_status", - Status: StatusPass, - Message: "SSH未运行", - }) - return check - } - - // 1. 检查 authorized_keys 文件内容 - suspiciousKeys := sc.checkAuthorizedKeys() - if len(suspiciousKeys) > 0 { - check.Status = StatusWarn - for _, key := range suspiciousKeys { - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: "suspicious_authorized_key", - Status: StatusWarn, - Message: key, - }) - } - } - - // 2. 检查 SSH 配置 - sshConfig := sc.readSSHConfig() - - // 检查是否允许 root 登录(仅记录,不告警) - //permitRoot := sshConfig["permitrootlogin"] - //if permitRoot != "" { - // check.Details = append(check.Details, protocol.SecurityCheckSub{ - // Name: "permit_root_login", - // Status: StatusPass, - // Message: fmt.Sprintf("Root登录策略: %s", permitRoot), - // }) - //} - - // 检查空密码登录 - permitEmpty := sshConfig["permitemptypasswords"] - if permitEmpty == "yes" { - check.Status = StatusFail - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: "permit_empty_passwords", - Status: StatusFail, - Message: "允许空密码登录", - }) - } - - // 检查密码认证 - passwordAuth := sshConfig["passwordauthentication"] - if passwordAuth == "yes" { - check.Status = StatusWarn - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: "password_auth_enabled", - Status: StatusWarn, - Message: "启用了密码认证(建议仅使用密钥认证)", - }) - } - - // 3. 检查 SSH 二进制文件完整性 - for _, binPath := range sc.config.SSHConfig.BinaryPaths { - info, err := os.Stat(binPath) - if err != nil { - continue - } - - modTime := info.ModTime() - age := time.Since(modTime) - if age < time.Duration(sc.config.SSHConfig.RecentModifyDays)*24*time.Hour { - fileHash := sc.evidence.hashCache.GetSHA256(binPath) - check.Status = StatusWarn - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: "ssh_binary_modified", - Status: StatusWarn, - Message: fmt.Sprintf("SSH二进制文件最近被修改: %s (%d天前)", binPath, int(age.Hours()/24)), - Evidence: &protocol.Evidence{ - FilePath: binPath, - FileHash: fileHash, - Timestamp: modTime.UnixMilli(), - RiskLevel: "high", - }, - }) - } - } - - // 5. 检查 SSH 配置文件的软链接 - for _, configPath := range sc.config.SSHConfig.ConfigPaths { - linkTarget, err := os.Readlink(configPath) - if err == nil { - // 是软链接,检查目标是否可疑 - if strings.Contains(linkTarget, "/tmp") || strings.Contains(linkTarget, "/dev/shm") { - check.Status = StatusFail - check.Details = append(check.Details, protocol.SecurityCheckSub{ - Name: "ssh_config_symlink", - Status: StatusFail, - Message: fmt.Sprintf("SSH配置文件是指向可疑位置的软链接: %s -> %s", configPath, linkTarget), - }) - } - } - } - - // 更新总体消息 - switch check.Status { - case StatusPass: - check.Message = "SSH配置安全" - case StatusWarn: - check.Message = "SSH配置存在风险" - case StatusFail: - check.Message = "SSH配置存在严重风险" - } - - return check -} - -// isSSHRunning 检查 SSH 服务是否运行 -func (sc *SSHChecker) isSSHRunning() bool { - procs, err := sc.cache.Get() - if err != nil { - return false - } - - for _, p := range procs { - name, err := p.Name() - if err == nil && strings.Contains(name, "sshd") { - return true - } - } - - return false -} - -// checkAuthorizedKeys 检查 authorized_keys 文件内容 -func (sc *SSHChecker) checkAuthorizedKeys() []string { - var suspicious []string - - // 获取所有用户目录 - userDirs := sc.getAllUserDirectories() - - for _, userDir := range userDirs { - keyPath := filepath.Join(userDir.Path, ".ssh", "authorized_keys") - - info, err := os.Stat(keyPath) - if err != nil { - continue - } - - // 检查文件大小 - if info.Size() > sc.config.SSHConfig.MaxAuthorizedKeysSize { - suspicious = append(suspicious, fmt.Sprintf("用户 '%s' 的 authorized_keys 文件过大 (%.2f MB),可能是异常", - userDir.Username, float64(info.Size())/1024/1024)) - } - - // 检查最近修改 - if time.Since(info.ModTime()) < time.Duration(sc.config.SSHConfig.AuthKeysRecentModifyDays)*24*time.Hour { - suspicious = append(suspicious, fmt.Sprintf("用户 '%s' 的 authorized_keys 最近被修改: %s (%d天前)", - userDir.Username, info.ModTime().Format("2006-01-02 15:04:05"), int(time.Since(info.ModTime()).Hours()/24))) - } - - // 检查文件内容 - f, err := os.Open(keyPath) - if err != nil { - continue - } - - reader := io.LimitReader(f, sc.config.PerformanceConfig.AuthKeysReadLimitKB*1024) - content, err := io.ReadAll(reader) - f.Close() - if err != nil { - continue - } - - lines := strings.Split(string(content), "\n") - keyCount := 0 - - for lineNum, line := range lines { - line = strings.TrimSpace(line) - if line == "" || strings.HasPrefix(line, "#") { - continue - } - - // 检查可疑的公钥选项 - if strings.Contains(line, "command=") { - suspicious = append(suspicious, fmt.Sprintf("用户 '%s' 的公钥包含command选项(行%d): %s...", - userDir.Username, lineNum+1, sc.strUtil.Truncate(line, 60))) - } - - if strings.Contains(line, "from=") { - if strings.Contains(line, `from="*"`) || strings.Contains(line, "from=*") { - suspicious = append(suspicious, fmt.Sprintf("用户 '%s' 的公钥允许任意来源(from=*): 行%d", userDir.Username, lineNum+1)) - } - } - - // 统计公钥数量 - if strings.HasPrefix(line, "ssh-rsa") || strings.HasPrefix(line, "ssh-ed25519") || strings.HasPrefix(line, "ecdsa-") { - keyCount++ - } - } - - if keyCount > sc.config.SSHConfig.MaxKeysCount { - suspicious = append(suspicious, fmt.Sprintf("用户 '%s' 拥有大量公钥(%d个), 建议审查", userDir.Username, keyCount)) - } - - // 检查文件权限 - if info.Mode().Perm()&0022 != 0 { - suspicious = append(suspicious, fmt.Sprintf("用户 '%s' 的 authorized_keys 权限过高: %o (Group/Other不可写)", userDir.Username, info.Mode().Perm())) - } - } - - return suspicious -} - -// readSSHConfig 读取 SSH 配置 -func (sc *SSHChecker) readSSHConfig() map[string]string { - config := make(map[string]string) - - // 优先使用 sshd -T - output, err := sc.executor.Execute("sshd", "-T") - if err == nil { - lines := strings.Split(output, "\n") - for _, line := range lines { - parts := strings.Fields(line) - if len(parts) >= 2 { - config[strings.ToLower(parts[0])] = parts[1] - } - } - return config - } - - // 备用:读配置文件 - for _, path := range sc.config.SSHConfig.ConfigPaths { - content, err := os.ReadFile(path) - if err != nil { - continue - } - - lines := strings.Split(string(content), "\n") - for _, line := range lines { - line = strings.TrimSpace(line) - if line == "" || strings.HasPrefix(line, "#") { - continue - } - - parts := strings.Fields(line) - if len(parts) >= 2 { - config[strings.ToLower(parts[0])] = parts[1] - } - } - break - } - - return config -} - -// UserDirectory 用户目录信息 -type UserDirectory struct { - Username string - Path string - Source string -} - -// getAllUserDirectories 获取所有用户目录 -func (sc *SSHChecker) getAllUserDirectories() []UserDirectory { - var userDirs []UserDirectory - seenPaths := make(map[string]bool) - - // 1. 从 /etc/passwd 获取用户 - users := sc.getAllUsers() - for _, user := range users { - if user.Home != "" && !seenPaths[user.Home] { - userDirs = append(userDirs, UserDirectory{ - Username: user.Username, - Path: user.Home, - Source: "passwd", - }) - seenPaths[user.Home] = true - } - } - - // 2. 扫描 /home 目录,发现 LDAP/AD 等外部认证用户 - entries, err := os.ReadDir("/home") - if err != nil { - return userDirs - } - - for _, entry := range entries { - if !entry.IsDir() { - continue - } - - homePath := filepath.Join("/home", entry.Name()) - - if seenPaths[homePath] { - continue - } - - // 检查是否有 .ssh 目录 - sshPath := filepath.Join(homePath, ".ssh") - if stat, err := os.Stat(sshPath); err == nil && stat.IsDir() { - userDirs = append(userDirs, UserDirectory{ - Username: entry.Name() + " (LDAP/AD)", - Path: homePath, - Source: "home_scan", - }) - seenPaths[homePath] = true - } - } - - return userDirs -} - -// UserInfo 用户信息 -type UserInfo struct { - Username string - UID string - Home string - Shell string -} - -// getAllUsers 获取所有用户 -func (sc *SSHChecker) getAllUsers() []UserInfo { - var users []UserInfo - - file, err := os.Open("/etc/passwd") - if err != nil { - return users - } - defer file.Close() - - scanner := bufio.NewScanner(file) - for scanner.Scan() { - line := scanner.Text() - parts := strings.Split(line, ":") - if len(parts) >= 7 { - users = append(users, UserInfo{ - Username: parts[0], - UID: parts[2], - Home: parts[5], - Shell: parts[6], - }) - } - } - - return users -} diff --git a/web/assets.go b/web/assets.go index 8b0c87e..028a0ff 100644 --- a/web/assets.go +++ b/web/assets.go @@ -2,6 +2,7 @@ package web import ( "embed" + "encoding/base64" "io/fs" ) @@ -19,3 +20,20 @@ var indexHtml string func IndexHtml() string { return indexHtml } + +//go:embed public/logo.png +var defaultLogo []byte + +func DefaultLogo() []byte { + return defaultLogo +} + +// DefaultLogoBase64 返回默认 Logo 的 base64 编码(data URI 格式) +func DefaultLogoBase64() string { + if len(defaultLogo) == 0 { + return "" + } + // 编码为 base64 并添加 data URI 前缀 + encoded := base64.StdEncoding.EncodeToString(defaultLogo) + return "data:image/png;base64," + encoded +} diff --git a/web/index.html b/web/index.html index 91c30f2..7515cd1 100644 --- a/web/index.html +++ b/web/index.html @@ -9,6 +9,7 @@ window.SystemConfig = { SystemNameZh: "{{.SystemNameZh}}", SystemNameEn: "{{.SystemNameEn}}", + ICPCode: "{{.ICPCode}}", }; diff --git a/web/src/api/agent.ts b/web/src/api/agent.ts index ce8f137..e63748c 100644 --- a/web/src/api/agent.ts +++ b/web/src/api/agent.ts @@ -111,20 +111,12 @@ export interface SystemInfo { publicIP?: string; } -export interface Evidence { - fileHash?: string; - processTree?: string[]; - filePath?: string; - timestamp?: number; - networkConn?: string; - riskLevel?: 'low' | 'medium' | 'high'; -} - export interface SecurityCheckSub { - name: string; + name?: string; status: 'pass' | 'fail' | 'warn' | 'skip'; + severity?: 'high' | 'medium' | 'low'; message: string; - evidence?: Evidence; + evidence?: string; // 简化为字符串 } export interface SecurityCheck { @@ -134,14 +126,104 @@ export interface SecurityCheck { details?: SecurityCheckSub[]; } +// 资产清单相关类型 +export interface ListeningPort { + protocol: string; + address: string; + port: number; + processName?: string; + processPid?: number; + processPath?: string; + isPublic: boolean; +} + +export interface NetworkAssets { + listeningPorts?: ListeningPort[]; + connections?: any[]; + interfaces?: any[]; +} + +export interface ProcessInfo { + pid: number; + name: string; + cmdline?: string; + exe?: string; + username?: string; + cpuPercent: number; + memPercent: number; + memoryMb: number; +} + +export interface ProcessAssets { + topCpuProcesses?: ProcessInfo[]; + topMemoryProcesses?: ProcessInfo[]; +} + +export interface UserInfo { + username: string; + uid: string; + gid: string; + homeDir?: string; + shell?: string; + isLoginable: boolean; + isRootEquiv: boolean; + hasPassword: boolean; +} + +export interface UserAssets { + systemUsers?: UserInfo[]; + loginHistory?: any[]; + sshKeys?: any[]; + sudoUsers?: any[]; +} + +export interface FileAssets { + cronJobs?: any[]; + systemdServices?: any[]; + startupScripts?: any[]; + recentModified?: any[]; + largeFiles?: any[]; +} + +export interface KernelAssets { + loadedModules?: any[]; + kernelParameters?: Record; + securityModules?: any; +} + +export interface AssetInventory { + networkAssets?: NetworkAssets; + processAssets?: ProcessAssets; + userAssets?: UserAssets; + fileAssets?: FileAssets; + kernelAssets?: KernelAssets; +} + +export interface AuditStatistics { + networkStats?: any; + processStats?: any; + userStats?: any; + fileStats?: any; +} + +// VPS审计结果(Agent端收集的原始数据) export interface VPSAuditResult { systemInfo: SystemInfo; - securityChecks: SecurityCheck[]; + assetInventory: AssetInventory; + statistics: AuditStatistics; startTime: number; endTime: number; + collectWarnings?: string[]; +} + +// VPS安全分析结果(Server端分析后的结果) +export interface VPSAuditAnalysis { + auditId: string; + securityChecks: SecurityCheck[]; riskScore: number; threatLevel: 'low' | 'medium' | 'high' | 'critical'; recommendations?: string[]; + analyzedAt: number; } export interface AuditResultSummary { diff --git a/web/src/api/system-config.ts b/web/src/api/system-config.ts index bd7f943..48260fa 100644 --- a/web/src/api/system-config.ts +++ b/web/src/api/system-config.ts @@ -6,26 +6,15 @@ export interface SystemConfig { systemNameEn: string; // 英文名称 systemNameZh: string; // 中文名称 logoBase64: string; // Logo 的 base64 编码 + icpCode: string; // ICP 备案号 } -// 默认系统配置 -export const DEFAULT_SYSTEM_CONFIG: SystemConfig = { - systemNameEn: 'Pika Monitor', - systemNameZh: '皮卡监控', - logoBase64: '', // 默认为空,将使用 /logo.png -}; - // 获取系统配置(管理后台使用) export const getSystemConfig = async (): Promise => { - try { - const response = await get<{ id: string; name: string; value: SystemConfig }>( - `/admin/properties/${PROPERTY_ID_SYSTEM_CONFIG}` - ); - return response.data.value || DEFAULT_SYSTEM_CONFIG; - } catch (error) { - // 如果配置不存在,返回默认值 - return DEFAULT_SYSTEM_CONFIG; - } + const response = await get<{ id: string; name: string; value: SystemConfig }>( + `/admin/properties/${PROPERTY_ID_SYSTEM_CONFIG}` + ); + return response.data.value; }; // 保存系统配置 diff --git a/web/src/components/PublicFooter.tsx b/web/src/components/PublicFooter.tsx index b52e14d..f57932b 100644 --- a/web/src/components/PublicFooter.tsx +++ b/web/src/components/PublicFooter.tsx @@ -2,6 +2,7 @@ import {Heart} from 'lucide-react'; const PublicFooter = () => { const currentYear = new Date().getFullYear(); + const icpCode = window.SystemConfig?.ICPCode || ''; return (
@@ -24,6 +25,20 @@ const PublicFooter = () => { · 保持洞察,稳定运行 + {/* ICP 备案号 */} + {icpCode && ( + <> + · + + {icpCode} + + + )}
用 diff --git a/web/src/global.d.ts b/web/src/global.d.ts index 73d5613..ab37ab3 100644 --- a/web/src/global.d.ts +++ b/web/src/global.d.ts @@ -5,6 +5,7 @@ declare global { SystemConfig: { SystemNameZh: string; SystemNameEn: string; + ICPCode: string; }; } } diff --git a/web/src/pages/Agents/AgentDetail.tsx b/web/src/pages/Agents/AgentDetail.tsx index 943b4f7..1faa6e6 100644 --- a/web/src/pages/Agents/AgentDetail.tsx +++ b/web/src/pages/Agents/AgentDetail.tsx @@ -16,7 +16,12 @@ import { FileWarning } from 'lucide-react'; import TamperProtection from './TamperProtection.tsx'; -import {getAgentForAdmin, getAuditResult, sendAuditCommand, type VPSAuditResult} from '../../api/agent'; +import { + getAgentForAdmin, + getAuditResult, + sendAuditCommand, + type VPSAuditResult +} from '../../api/agent'; import type {Agent} from '../../types'; import dayjs from 'dayjs'; import {getErrorMessage} from '../../lib/utils'; @@ -66,10 +71,10 @@ const AgentDetail = () => { await sendAuditCommand(id); messageApi.success('安全审计已启动,请稍后查看结果'); - // 5秒后刷新结果 + // 10秒后刷新结果 (给Server端分析时间) setTimeout(() => { fetchData(); - }, 5000); + }, 10000); } catch (error: unknown) { messageApi.error(getErrorMessage(error, '启动审计失败')); } finally { @@ -113,11 +118,6 @@ const AgentDetail = () => { }, ]; - // 计算审计统计 - const passCount = auditResult?.securityChecks.filter(c => c.status === 'pass').length || 0; - const failCount = auditResult?.securityChecks.filter(c => c.status === 'fail').length || 0; - const warnCount = auditResult?.securityChecks.filter(c => c.status === 'warn').length || 0; - const totalCount = auditResult?.securityChecks.length || 0; // Tab 项配置 const tabItems: TabsProps['items'] = [ @@ -185,13 +185,10 @@ const AgentDetail = () => {
安全审计
- {auditResult && failCount > 0 && ( - {failCount} - )}
), children: ( - + {/* 非 Linux 系统提示 */} {agent && !agent.os.toLowerCase().includes('linux') && ( { /> ) : null ) : ( - <> - {/* 审计概览 */} - - -
- } - /> - - - } - /> - - - } - /> - - - } - /> - - - = 80 ? '#ff4d4f' : - auditResult.riskScore >= 50 ? '#faad14' : - auditResult.riskScore >= 20 ? '#1890ff' : '#52c41a' - }} - prefix={} - /> - - -
威胁等级
- - {auditResult.threatLevel === 'critical' ? '严重风险' : - auditResult.threatLevel === 'high' ? '高风险' : - auditResult.threatLevel === 'medium' ? '中风险' : '低风险'} - - - -
- 最近审计时间: {dayjs(auditResult.startTime).format('YYYY-MM-DD HH:mm:ss')} -
- - - {/* 详细审计结果 */} - - + )} ), @@ -368,18 +295,6 @@ const AgentDetail = () => { - {auditResult && ( -
-
安全评分
-
= 80 ? 'text-red-500' : - auditResult.riskScore >= 50 ? 'text-orange-500' : - auditResult.riskScore >= 20 ? 'text-blue-500' : 'text-green-500' - }`}> - {100 - auditResult.riskScore} -
-
- )} diff --git a/web/src/pages/Agents/AuditResultView.tsx b/web/src/pages/Agents/AuditResultView.tsx index d474831..7f6e57b 100644 --- a/web/src/pages/Agents/AuditResultView.tsx +++ b/web/src/pages/Agents/AuditResultView.tsx @@ -1,15 +1,21 @@ -import {Card, Collapse, List, Space, Tag, Descriptions} from 'antd'; +import {Card, Collapse, List, Space, Tag, Descriptions, Tabs, Table, Empty, Alert} from 'antd'; import { CheckCircle, XCircle, AlertTriangle, MinusCircle, + Server, + Network, + Cpu, + Users, FileText, - Hash, - GitBranch, - Clock + Shield, + Activity, + Calendar, + Settings, + PlayCircle } from 'lucide-react'; -import type {VPSAuditResult} from '../../api/agent'; +import type {VPSAuditResult, VPSAuditAnalysis} from '../../api/agent'; import dayjs from 'dayjs'; import duration from 'dayjs/plugin/duration'; @@ -48,28 +54,26 @@ const AuditResultView = ({result}: AuditResultViewProps) => { return {config.text}; }; - const getCategoryName = (category: string) => { - const names: Record = { - 'non_root_user': '非Root用户', - 'ufw_security': 'UFW防火墙', - 'ssh_security': 'SSH安全', - 'access_control': '访问控制', - 'port_security': '端口安全', - 'unattended_upgrades': '自动更新', - 'fail2ban': 'Fail2ban', - 'rootkit_detection': 'Rootkit检测', - 'suspicious_processes': '可疑进程检测', - 'listening_ports': '端口监听检查', - 'cron_jobs': '定时任务检查', - 'suspicious_files': '可疑文件检查', - 'system_accounts': '系统账户检查', - 'network_connections': '网络连接检查', - 'file_integrity': '文件完整性检查', - 'login_history': '登录历史检查', - 'immutable_files': '不可变文件检查', - 'suspicious_env_vars': '环境变量检查', + const getSeverityTag = (severity?: string) => { + if (!severity) return null; + const configs = { + high: {color: 'error', text: '高危'}, + medium: {color: 'warning', text: '中危'}, + low: {color: 'default', text: '低危'}, }; - return names[category] || category; + const config = configs[severity as keyof typeof configs]; + return config ? {config.text} : null; + }; + + const getThreatLevelTag = (level: string) => { + const configs = { + critical: {color: 'error', text: '危急'}, + high: {color: 'error', text: '高危'}, + medium: {color: 'warning', text: '中危'}, + low: {color: 'success', text: '低危'}, + }; + const config = configs[level as keyof typeof configs] || {color: 'default', text: level}; + return {config.text}; }; const formatUptime = (seconds: number) => { @@ -80,11 +84,135 @@ const AuditResultView = ({result}: AuditResultViewProps) => { return `${days}天 ${hours}小时 ${minutes}分钟`; }; + const portColumns = [ + {title: '协议', dataIndex: 'protocol', key: 'protocol', width: 80}, + { + title: '地址:端口', + key: 'address', + render: (record: any) => `${record.address}:${record.port}`, + }, + { + title: '公网暴露', + dataIndex: 'isPublic', + key: 'isPublic', + width: 100, + render: (isPublic: boolean) => isPublic ? + 是 : 否 + }, + {title: '进程', dataIndex: 'processName', key: 'processName'}, + {title: 'PID', dataIndex: 'processPid', key: 'processPid', width: 80}, + ]; + + const connectionColumns = [ + {title: '协议', dataIndex: 'protocol', key: 'protocol', width: 80}, + { + title: '本地地址', + key: 'local', + render: (record: any) => `${record.laddr?.ip || ''}:${record.laddr?.port || ''}`, + }, + { + title: '远程地址', + key: 'remote', + render: (record: any) => `${record.raddr?.ip || ''}:${record.raddr?.port || ''}`, + }, + {title: '状态', dataIndex: 'status', key: 'status', width: 120}, + {title: 'PID', dataIndex: 'pid', key: 'pid', width: 80}, + {title: '进程', dataIndex: 'processName', key: 'processName'}, + ]; + + const processColumns = [ + {title: 'PID', dataIndex: 'pid', key: 'pid', width: 80}, + {title: '进程名', dataIndex: 'name', key: 'name'}, + {title: '用户', dataIndex: 'username', key: 'username', width: 100}, + { + title: 'CPU %', + dataIndex: 'cpuPercent', + key: 'cpuPercent', + width: 100, + render: (val: number) => `${val.toFixed(2)}%` + }, + { + title: '内存 %', + dataIndex: 'memPercent', + key: 'memPercent', + width: 100, + render: (val: number) => `${val.toFixed(2)}%` + }, + { + title: '内存 (MB)', + dataIndex: 'memoryMb', + key: 'memoryMb', + width: 120, + render: (val: number) => `${val} MB` + }, + ]; + + const userColumns = [ + {title: '用户名', dataIndex: 'username', key: 'username'}, + {title: 'UID', dataIndex: 'uid', key: 'uid', width: 80}, + {title: 'GID', dataIndex: 'gid', key: 'gid', width: 80}, + {title: 'Shell', dataIndex: 'shell', key: 'shell'}, + { + title: '可登录', + dataIndex: 'isLoginable', + key: 'isLoginable', + width: 100, + render: (val: boolean) => val ? 是 : 否 + }, + { + title: 'Root权限', + dataIndex: 'isRootEquiv', + key: 'isRootEquiv', + width: 100, + render: (val: boolean) => val ? 是 : 否 + }, + ]; + + const cronColumns = [ + {title: '用户', dataIndex: 'user', key: 'user', width: 100}, + {title: '计划', dataIndex: 'schedule', key: 'schedule', width: 150}, + {title: '命令', dataIndex: 'command', key: 'command', ellipsis: true}, + {title: '文件路径', dataIndex: 'filePath', key: 'filePath', width: 200, ellipsis: true}, + ]; + + const serviceColumns = [ + {title: '服务名', dataIndex: 'name', key: 'name'}, + {title: '状态', dataIndex: 'state', key: 'state', width: 100}, + { + title: '开机启动', + dataIndex: 'enabled', + key: 'enabled', + width: 100, + render: (val: boolean) => val ? 是 : 否 + }, + {title: '启动命令', dataIndex: 'execStart', key: 'execStart', ellipsis: true}, + {title: '描述', dataIndex: 'description', key: 'description', ellipsis: true}, + ]; + + const startupScriptColumns = [ + {title: '类型', dataIndex: 'type', key: 'type', width: 150}, + {title: '名称', dataIndex: 'name', key: 'name'}, + {title: '路径', dataIndex: 'path', key: 'path', ellipsis: true}, + { + title: '启用', + dataIndex: 'enabled', + key: 'enabled', + width: 80, + render: (val: boolean) => val ? 是 : 否 + }, + ]; + + const moduleColumns = [ + {title: '模块名', dataIndex: 'name', key: 'name'}, + {title: '大小', dataIndex: 'size', key: 'size', width: 120, render: (val: number) => `${val} bytes`}, + {title: '被引用次数', dataIndex: 'usedBy', key: 'usedBy', width: 120}, + ]; + return ( -
+ {/* 系统信息 */} 系统信息} + title={系统信息} variant={'outlined'} > @@ -105,7 +233,7 @@ const AuditResultView = ({result}: AuditResultViewProps) => { {result.systemInfo.publicIP} )} - + {dayjs(result.startTime).format('YYYY-MM-DD HH:mm:ss')} - {dayjs(result.endTime).format('HH:mm:ss')} (耗时: {((result.endTime - result.startTime) / 1000).toFixed(2)}秒) @@ -114,140 +242,242 @@ const AuditResultView = ({result}: AuditResultViewProps) => { - {/* 安全检查结果 */} + + {/* 资产清单 */} 安全检查结果} + title={资产清单} variant={'outlined'} > - - {result.securityChecks.map((check, index) => ( - - {getStatusIcon(check.status)} - - {getCategoryName(check.category)} - - {getStatusTag(check.status)} - - {check.message} - - - } - > - {check.details && check.details.length > 0 && ( - ( - - - {getStatusIcon(detail.status)} - - {detail.name} - - {getStatusTag(detail.status)} - - {detail.message} - - - {detail.evidence && ( -
-
- - 证据信息 - {detail.evidence.riskLevel && ( - - {detail.evidence.riskLevel === 'high' ? '高危' : - detail.evidence.riskLevel === 'medium' ? '中危' : '低危'} - - )} -
- {detail.evidence.filePath && ( -
- 文件路径: - {detail.evidence.filePath} -
- )} - {detail.evidence.fileHash && ( -
- - SHA256: - {detail.evidence.fileHash} -
- )} - {detail.evidence.timestamp && ( -
- - 时间: - {dayjs(detail.evidence.timestamp).format('YYYY-MM-DD HH:mm:ss')} -
- )} - {detail.evidence.networkConn && ( -
- 网络连接: - {detail.evidence.networkConn} -
- )} - {detail.evidence.processTree && detail.evidence.processTree.length > 0 && ( -
-
- - 进程树: -
-
- {detail.evidence.processTree.map((line, idx) => ( -
- {line} -
- ))} -
-
- )} -
- )} -
+ 网络资产, + children: ( + + + {result.assetInventory.networkAssets?.listeningPorts?.length ? ( +
`${record.address}:${record.port}-${index}`} + pagination={false} + /> + ) : ( + + )} + + + {result.assetInventory.networkAssets?.connections?.length ? ( +
`${record.laddr?.ip}:${record.laddr?.port}-${record.raddr?.ip}:${record.raddr?.port}-${index}`} + pagination={false} + /> + ) : ( + + )} + + {result.statistics?.networkStats && ( + + + + {result.statistics.networkStats.totalListeningPorts || 0} + + + {result.statistics.networkStats.publicListeningPorts || 0} + + + {result.statistics.networkStats.activeConnections || 0} + + + )} - /> - )} - - ))} - + + ), + }, + { + key: 'process', + label: 进程资产, + children: ( + + + {result.assetInventory.processAssets?.topCpuProcesses?.length ? ( +
+ ) : ( + + )} + + + {result.assetInventory.processAssets?.topMemoryProcesses?.length ? ( +
+ ) : ( + + )} + + + ), + }, + { + key: 'user', + label: 用户资产, + children: ( + + {result.assetInventory.userAssets?.systemUsers?.length ? ( +
+ ) : ( + + )} + + ), + }, + { + key: 'file', + label: 文件资产, + children: ( + + 定时任务}> + {result.assetInventory.fileAssets?.cronJobs?.length ? ( +
`${record.user}-${index}`} + pagination={false} + /> + ) : ( + + )} + + Systemd服务}> + {result.assetInventory.fileAssets?.systemdServices?.length ? ( +
+ ) : ( + + )} + + 启动脚本}> + {result.assetInventory.fileAssets?.startupScripts?.length ? ( +
`${record.path}-${index}`} + pagination={false} + /> + ) : ( + + )} + + + ), + }, + { + key: 'kernel', + label: 内核信息, + children: ( + + + {result.assetInventory.kernelAssets?.loadedModules?.length ? ( +
+ ) : ( + + )} + + {result.assetInventory.kernelAssets?.securityModules && ( + + + + + {result.assetInventory.kernelAssets.securityModules.selinuxStatus || 'unknown'} + + + + + {result.assetInventory.kernelAssets.securityModules.apparmorStatus || 'unknown'} + + + + + {result.assetInventory.kernelAssets.securityModules.secureBootState || 'unknown'} + + + + + )} + {result.assetInventory.kernelAssets?.kernelParameters && ( + + + {Object.entries(result.assetInventory.kernelAssets.kernelParameters).map(([key, value]) => ( + + {value} + + ))} + + + )} + + ), + }, + ]} + /> - {/* 修复建议 */} - {result.recommendations && result.recommendations.length > 0 && ( - 修复建议} - variant={'outlined'} - > - ( - - - {index + 1}. - - {item} - - - - )} - /> - + {/* 采集警告 */} + {result.collectWarnings && result.collectWarnings.length > 0 && ( + + {result.collectWarnings.map((warning, index) => ( +
  • {warning}
  • + ))} + + } + /> )} - + ); }; diff --git a/web/src/pages/Login/index.tsx b/web/src/pages/Login/index.tsx index 5468b28..3eefd6d 100644 --- a/web/src/pages/Login/index.tsx +++ b/web/src/pages/Login/index.tsx @@ -1,9 +1,9 @@ import {useEffect, useState} from 'react'; import {useNavigate} from 'react-router-dom'; -import {App, Button, Divider, Form, Input} from 'antd'; -import {LockOutlined, UserOutlined, GithubOutlined} from '@ant-design/icons'; -import {Sparkles} from 'lucide-react'; -import {getAuthConfig, getOIDCAuthURL, getGitHubAuthURL, login} from '../../api/auth'; +import {App, Button, Form, Input} from 'antd'; +import {GithubOutlined, GlobalOutlined, LockOutlined, UserOutlined} from '@ant-design/icons'; +// 移除不需要的图标组件,保持轻量 +import {getAuthConfig, getGitHubAuthURL, getOIDCAuthURL, login} from '../../api/auth'; import type {LoginRequest} from '../../types'; const Login = () => { @@ -15,7 +15,6 @@ const Login = () => { const navigate = useNavigate(); const {message: messageApi} = App.useApp(); - // 获取认证配置 useEffect(() => { fetchAuthConfig(); }, []); @@ -35,15 +34,12 @@ const Login = () => { try { const response = await login(values); const {token, user} = response.data; - - // 保存 token 和用户信息 localStorage.setItem('token', token); localStorage.setItem('userInfo', JSON.stringify(user)); - - messageApi.success('登录成功'); + messageApi.success('欢迎回来'); navigate('/admin/agents'); } catch (error: any) { - messageApi.error(error.response?.data?.message || '登录失败,请检查用户名和密码'); + messageApi.error(error.response?.data?.message || '账号或密码错误'); } finally { setLoading(false); } @@ -53,11 +49,9 @@ const Login = () => { setOidcLoading(true); try { const response = await getOIDCAuthURL(); - const {authUrl} = response.data; - // 跳转到 OIDC 认证页面 - window.location.href = authUrl; + window.location.href = response.data.authUrl; } catch (error: any) { - messageApi.error(error.response?.data?.message || '获取 OIDC 认证地址失败'); + messageApi.error('OIDC 跳转失败'); setOidcLoading(false); } }; @@ -66,111 +60,117 @@ const Login = () => { setGithubLoading(true); try { const response = await getGitHubAuthURL(); - const {authUrl} = response.data; - // 跳转到 GitHub 认证页面 - window.location.href = authUrl; + window.location.href = response.data.authUrl; } catch (error: any) { - messageApi.error(error.response?.data?.message || '获取 GitHub 认证地址失败'); + messageApi.error('GitHub 跳转失败'); setGithubLoading(false); } }; return ( -
    -
    -
    -
    -
    -
    - - Pika Monitor + // 1. 背景改为柔和的灰白色,视觉更轻盈 +
    + + {/* 2. 卡片去除复杂的渐变边框,使用简单的圆角和优雅的阴影 */} +
    + + {/* 3. 头部精简:去掉了 Badge,强调品牌名称 */} +
    +

    + {window.SystemConfig.SystemNameZh} +

    +

    + 保持洞察,稳定运行 +

    +
    + +
    + + } + placeholder="用户名" + className="rounded-xl px-4 py-2.5 bg-slate-50 border-slate-200 hover:bg-white focus:bg-white transition-all" + /> + + + + } + placeholder="密码" + className="rounded-xl px-4 py-2.5 bg-slate-50 border-slate-200 hover:bg-white focus:bg-white transition-all" + /> + + + + + + + + {/* 5. 第三方登录区域 */} + {(oidcEnabled || githubEnabled) && ( +
    +
    +
    + +
    +
    + 或者
    -

    登录 Pika 控制台

    -

    面向探针的统一监控后台

    -
    - - } - placeholder="请输入用户名" - /> - - - - } - placeholder="请输入密码" - /> - - - + {/* 使用 Grid 布局让按钮并排,减少垂直高度占用 */} +
    + {githubEnabled && ( - - - - {(oidcEnabled || githubEnabled) && ( -
    - 其他登录方式 -
    - {githubEnabled && ( - - )} - {oidcEnabled && ( - - )} -
    -
    - )} - -

    - 登录即表示同意平台安全策略 -

    + )} + {oidcEnabled && ( + + )} +
    -
    + )}
    ); }; -export default Login; +export default Login; \ No newline at end of file diff --git a/web/src/pages/Settings/SystemConfig.tsx b/web/src/pages/Settings/SystemConfig.tsx index 277e7b3..a5e9df6 100644 --- a/web/src/pages/Settings/SystemConfig.tsx +++ b/web/src/pages/Settings/SystemConfig.tsx @@ -3,9 +3,9 @@ import {App, Button, Card, Form, Input, Space, Spin, Upload} from 'antd'; import {Upload as UploadIcon} from 'lucide-react'; import {useMutation, useQuery, useQueryClient} from '@tanstack/react-query'; import type {SystemConfig} from '../../api/system-config'; -import {getSystemConfig, saveSystemConfig, DEFAULT_SYSTEM_CONFIG} from '../../api/system-config'; +import {getSystemConfig, saveSystemConfig} from '../../api/system-config'; import {getErrorMessage} from '../../lib/utils'; -import type {RcFile, UploadFile} from 'antd/es/upload/interface'; +import type {RcFile} from 'antd/es/upload/interface'; const SystemConfigComponent = () => { const [form] = Form.useForm(); @@ -40,15 +40,11 @@ const SystemConfigComponent = () => { form.setFieldsValue({ systemNameEn: config.systemNameEn, systemNameZh: config.systemNameZh, + icpCode: config.icpCode, }); if (config.logoBase64) { setLogoPreview(config.logoBase64); } - } else { - form.setFieldsValue({ - systemNameEn: DEFAULT_SYSTEM_CONFIG.systemNameEn, - systemNameZh: DEFAULT_SYSTEM_CONFIG.systemNameZh, - }); } }, [config, form]); @@ -100,6 +96,7 @@ const SystemConfigComponent = () => { systemNameEn: values.systemNameEn, systemNameZh: values.systemNameZh, logoBase64: logoPreview, + icpCode: values.icpCode || '', } as SystemConfig); } catch (error) { // 表单验证失败 @@ -107,11 +104,15 @@ const SystemConfigComponent = () => { }; const handleReset = () => { - form.setFieldsValue({ - systemNameEn: DEFAULT_SYSTEM_CONFIG.systemNameEn, - systemNameZh: DEFAULT_SYSTEM_CONFIG.systemNameZh, - }); - setLogoPreview(''); + // 重置为当前配置的值 + if (config) { + form.setFieldsValue({ + systemNameEn: config.systemNameEn, + systemNameZh: config.systemNameZh, + icpCode: config.icpCode, + }); + setLogoPreview(config.logoBase64 || ''); + } }; // 获取 Logo 显示 URL @@ -144,28 +145,39 @@ const SystemConfigComponent = () => { type="inner" className="mb-4" > - - - +
    + + + + + + + +
    - + { > {({getFieldValue}) => { - const systemNameEn = getFieldValue('systemNameEn') || DEFAULT_SYSTEM_CONFIG.systemNameEn; - const systemNameZh = getFieldValue('systemNameZh') || DEFAULT_SYSTEM_CONFIG.systemNameZh; + const systemNameEn = getFieldValue('systemNameEn') || ''; + const systemNameZh = getFieldValue('systemNameZh') || ''; return (
    Date: Wed, 26 Nov 2025 22:09:30 +0800 Subject: [PATCH 10/27] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=85=AC=E5=91=8A?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/components/PublicHeader.tsx | 5 ++- web/src/pages/Public/MonitorDetail.tsx | 8 +--- web/src/pages/Public/MonitorList.tsx | 55 +++++++++----------------- web/src/pages/Public/ServerDetail.tsx | 8 +--- web/src/pages/Public/ServerList.tsx | 47 ++++++++++------------ web/src/pages/PublicLayout.tsx | 38 ++++++++++++++++++ web/src/router/index.tsx | 34 +++++++++------- 7 files changed, 104 insertions(+), 91 deletions(-) create mode 100644 web/src/pages/PublicLayout.tsx diff --git a/web/src/components/PublicHeader.tsx b/web/src/components/PublicHeader.tsx index 62ac17c..99d5cc7 100644 --- a/web/src/components/PublicHeader.tsx +++ b/web/src/components/PublicHeader.tsx @@ -1,7 +1,7 @@ import {useEffect, useState} from 'react'; import {Activity, LayoutGrid, List, LogIn, Server, Settings} from 'lucide-react'; import {getCurrentUser} from '../api/auth'; -import {Link} from "react-router-dom"; +import {Link, useLocation} from "react-router-dom"; interface PublicHeaderProps { viewMode?: 'grid' | 'list'; @@ -15,7 +15,7 @@ const PublicHeader = ({ showViewToggle = false }: PublicHeaderProps) => { const [isLoggedIn, setIsLoggedIn] = useState(false); - const currentPath = window.location.pathname; + let location = useLocation(); useEffect(() => { // 检查本地是否有 token @@ -41,6 +41,7 @@ const PublicHeader = ({ }, []); // 判断导航是否激活 + const currentPath = location.pathname; const isDeviceActive = currentPath === '/'; const isMonitorActive = currentPath === '/monitors'; diff --git a/web/src/pages/Public/MonitorDetail.tsx b/web/src/pages/Public/MonitorDetail.tsx index 377e920..f187010 100644 --- a/web/src/pages/Public/MonitorDetail.tsx +++ b/web/src/pages/Public/MonitorDetail.tsx @@ -363,8 +363,8 @@ const MonitorDetail = () => { ]; return ( -
    -
    +
    +
    {/* Hero Section */}
    @@ -654,10 +654,6 @@ const MonitorDetail = () => {
    - -
    - © {new Date().getFullYear()} Pika Monitor · 保持洞察,稳定运行。 -
    ); diff --git a/web/src/pages/Public/MonitorList.tsx b/web/src/pages/Public/MonitorList.tsx index 4e3665b..f87ff5e 100644 --- a/web/src/pages/Public/MonitorList.tsx +++ b/web/src/pages/Public/MonitorList.tsx @@ -1,11 +1,10 @@ -import {useState} from 'react'; +import {useEffect} from 'react'; import {useNavigate} from 'react-router-dom'; import {useQuery} from '@tanstack/react-query'; import {AlertCircle, CheckCircle2, Clock, Loader2, Shield} from 'lucide-react'; import {getPublicMonitors} from '../../api/monitor'; import type {PublicMonitor} from '../../types'; -import PublicHeader from '../../components/PublicHeader'; -import PublicFooter from '../../components/PublicFooter'; +import {usePublicLayout} from '../PublicLayout'; type ViewMode = 'grid' | 'list'; @@ -84,7 +83,13 @@ const EmptyState = () => ( const MonitorList = () => { const navigate = useNavigate(); - const [viewMode, setViewMode] = useState('grid'); + const {viewMode, setShowViewToggle} = usePublicLayout(); + + // 挂载时启用视图切换,卸载时禁用 + useEffect(() => { + setShowViewToggle(true); + return () => setShowViewToggle(false); + }, [setShowViewToggle]); const {data: monitors = [], isLoading, dataUpdatedAt} = useQuery({ queryKey: ['publicMonitors'], @@ -330,43 +335,21 @@ const MonitorList = () => { if (isLoading) { return ( -
    - -
    -
    - -
    -
    - +
    +
    ); } return ( -
    - - -
    -
    - {monitorSummaries.length === 0 ? ( - - ) : viewMode === 'grid' ? ( - renderGridView() - ) : ( - renderListView() - )} -
    -
    - - +
    + {monitorSummaries.length === 0 ? ( + + ) : viewMode === 'grid' ? ( + renderGridView() + ) : ( + renderListView() + )}
    ); }; diff --git a/web/src/pages/Public/ServerDetail.tsx b/web/src/pages/Public/ServerDetail.tsx index 3ede118..7fb4a7c 100644 --- a/web/src/pages/Public/ServerDetail.tsx +++ b/web/src/pages/Public/ServerDetail.tsx @@ -795,8 +795,8 @@ const ServerDetail = () => { } return ( -
    -
    +
    +
    { )} - -
    - © {new Date().getFullYear()} Pika Monitor · 保持洞察,稳定运行。 -
    ); diff --git a/web/src/pages/Public/ServerList.tsx b/web/src/pages/Public/ServerList.tsx index 5acefbf..afc0358 100644 --- a/web/src/pages/Public/ServerList.tsx +++ b/web/src/pages/Public/ServerList.tsx @@ -1,11 +1,10 @@ -import {type ReactNode, useState} from 'react'; +import {type ReactNode, useEffect} from 'react'; import {Link, useNavigate} from 'react-router-dom'; import {useQuery} from '@tanstack/react-query'; import {Cpu, EthernetPortIcon, HardDrive, Loader2, MemoryStick, Network} from 'lucide-react'; import {listAgents} from '../../api/agent'; import type {Agent, LatestMetrics} from '../../types'; -import PublicHeader from '../../components/PublicHeader'; -import PublicFooter from '../../components/PublicFooter'; +import {usePublicLayout} from '../PublicLayout'; interface AgentWithMetrics extends Agent { metrics?: LatestMetrics; @@ -116,7 +115,13 @@ const getProgressColor = (percent: number) => { const ServerList = () => { const navigate = useNavigate(); - const [viewMode, setViewMode] = useState('grid'); + const {viewMode, setShowViewToggle} = usePublicLayout(); + + // 挂载时启用视图切换,卸载时禁用 + useEffect(() => { + setShowViewToggle(true); + return () => setShowViewToggle(false); + }, [setShowViewToggle]); const {data: agents = [], isLoading, dataUpdatedAt} = useQuery({ queryKey: ['agents', 'online'], @@ -437,29 +442,17 @@ const ServerList = () => { } return ( -
    - - -
    -
    - {filteredAgents.length === 0 ? ( - - ) : viewMode === 'grid' ? ( - renderGridView() - ) : ( - renderListView() - )} -
    -
    - - +
    + {filteredAgents.length === 0 ? ( + + ) : viewMode === 'grid' ? ( + renderGridView() + ) : ( + renderListView() + )}
    ); }; diff --git a/web/src/pages/PublicLayout.tsx b/web/src/pages/PublicLayout.tsx new file mode 100644 index 0000000..3e893b1 --- /dev/null +++ b/web/src/pages/PublicLayout.tsx @@ -0,0 +1,38 @@ +import {Outlet, useOutletContext} from 'react-router-dom'; +import {useState} from 'react'; +import PublicHeader from '../components/PublicHeader'; +import PublicFooter from '../components/PublicFooter'; + +type ViewMode = 'grid' | 'list'; + +interface PublicLayoutContextType { + viewMode: ViewMode; + setViewMode: (mode: ViewMode) => void; + showViewToggle: boolean; + setShowViewToggle: (show: boolean) => void; +} + +const PublicLayout = () => { + const [viewMode, setViewMode] = useState('grid'); + const [showViewToggle, setShowViewToggle] = useState(false); + + return ( +
    + +
    + +
    + +
    + ); +}; + +export function usePublicLayout() { + return useOutletContext(); +} + +export default PublicLayout; diff --git a/web/src/router/index.tsx b/web/src/router/index.tsx index 909b256..41435a7 100644 --- a/web/src/router/index.tsx +++ b/web/src/router/index.tsx @@ -5,6 +5,7 @@ import PrivateRoute from '../components/PrivateRoute'; const LoginPage = lazy(() => import('../pages/Login')); const GitHubCallbackPage = lazy(() => import('../pages/Login/GitHubCallback')); const OIDCCallbackPage = lazy(() => import('../pages/Login/OIDCCallback')); +const PublicLayout = lazy(() => import('../pages/PublicLayout')); const AdminLayout = lazy(() => import('../pages/AdminLayout')); const AgentListPage = lazy(() => import('../pages/Agents/AgentList')); const AgentDetailPage = lazy(() => import('../pages/Agents/AgentDetail')); @@ -45,20 +46,25 @@ const router = createBrowserRouter([ }, // 公开页面 - 不需要登录 { - path: '/', - element: lazyLoad(ServerListPage), - }, - { - path: '/servers/:id', - element: lazyLoad(ServerDetailPage), - }, - { - path: '/monitors', - element: lazyLoad(PublicMonitorListPage), - }, - { - path: '/monitors/:id', - element: lazyLoad(PublicMonitorDetailPage), + element: lazyLoad(PublicLayout), + children: [ + { + path: '/', + element: lazyLoad(ServerListPage), + }, + { + path: '/servers/:id', + element: lazyLoad(ServerDetailPage), + }, + { + path: '/monitors', + element: lazyLoad(PublicMonitorListPage), + }, + { + path: '/monitors/:id', + element: lazyLoad(PublicMonitorDetailPage), + }, + ], }, // 管理员页面 - 需要登录 { From ab2bf4f293791d929a2eb232a8e2c9ef1c6bbc54 Mon Sep 17 00:00:00 2001 From: dushixiang Date: Wed, 26 Nov 2025 22:52:28 +0800 Subject: [PATCH 11/27] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=AE=89=E5=85=A8?= =?UTF-8?q?=E5=AE=A1=E8=AE=A1=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 2 +- go.sum | 32 +- internal/protocol/message.go | 33 +- pkg/agent/audit/asset_file.go | 42 +++ pkg/agent/audit/asset_login.go | 386 +++++++++++++++++++++++ pkg/agent/audit/asset_process.go | 22 ++ pkg/agent/audit/audit.go | 22 +- pkg/agent/audit/audit_test.go | 279 ---------------- web/src/api/agent.ts | 165 +++++++++- web/src/pages/Agents/AuditResultView.tsx | 370 ++++++++++++++++++++-- 10 files changed, 1010 insertions(+), 343 deletions(-) create mode 100644 pkg/agent/audit/asset_login.go delete mode 100644 pkg/agent/audit/audit_test.go diff --git a/go.mod b/go.mod index eea15e2..e5639fc 100644 --- a/go.mod +++ b/go.mod @@ -20,6 +20,7 @@ require ( github.com/labstack/echo/v4 v4.13.4 github.com/prometheus-community/pro-bing v0.7.0 github.com/shirou/gopsutil/v4 v4.25.10 + github.com/spf13/afero v1.15.0 github.com/spf13/cobra v1.10.1 go.uber.org/zap v1.27.1 golang.org/x/crypto v0.45.0 @@ -58,7 +59,6 @@ require ( github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rogpeppe/go-internal v1.13.1 // indirect github.com/sagikazarmark/locafero v0.12.0 // indirect - github.com/spf13/afero v1.15.0 // indirect github.com/spf13/cast v1.10.0 // indirect github.com/spf13/pflag v1.0.10 // indirect github.com/spf13/viper v1.21.0 // indirect diff --git a/go.sum b/go.sum index 7ea88ed..35b7af5 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,5 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -github.com/coreos/go-oidc/v3 v3.16.0 h1:qRQUCFstKpXwmEjDQTIbyY/5jF00+asXzSkmkoa/mow= -github.com/coreos/go-oidc/v3 v3.16.0/go.mod h1:wqPbKFrVnE90vty060SB40FCJ8fTHTxSwyXJqZH+sI8= github.com/coreos/go-oidc/v3 v3.17.0 h1:hWBGaQfbi0iVviX4ibC7bk8OKT5qNr4klBaCHVNvehc= github.com/coreos/go-oidc/v3 v3.17.0/go.mod h1:wqPbKFrVnE90vty060SB40FCJ8fTHTxSwyXJqZH+sI8= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= @@ -61,6 +59,8 @@ github.com/google/wire v0.7.0 h1:JxUKI6+CVBgCO2WToKy/nQk0sS+amI9z9EjVmdaocj4= github.com/google/wire v0.7.0/go.mod h1:n6YbUQD9cPKTnHXEBN2DXlOp/mVADhVErcMFb0v3J18= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= @@ -150,25 +150,16 @@ go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= -go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= -golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= -golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= -golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 h1:mgKeJMpvi0yx/sU5GsxQ7p6s2wtOnGAHZWCHUM4KGzY= -golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546/go.mod h1:j/pmGrbnkbPtQfxEe5D0VQhZC6qKbfKifgD0oM7sR70= golang.org/x/exp v0.0.0-20251113190631-e25ba8c21ef6 h1:zfMcR1Cs4KNuomFFgGefv5N0czO2XZpUbxGUy8i8ug0= golang.org/x/exp v0.0.0-20251113190631-e25ba8c21ef6/go.mod h1:46edojNIoXTNOhySWIWdix628clX9ODXwPsQuG6hsK0= -golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= -golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk= -golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= -golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc= golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= golang.org/x/oauth2 v0.33.0 h1:4Q+qn+E5z8gPRJfmRy7C2gGG3T4jIprK6aSYgTXGRpo= @@ -180,15 +171,12 @@ golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= -golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= -golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= -golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ= +golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= @@ -210,20 +198,18 @@ gorm.io/driver/sqlserver v1.6.0 h1:VZOBQVsVhkHU/NzNhRJKoANt5pZGQAS1Bwc6m6dgfnc= gorm.io/driver/sqlserver v1.6.0/go.mod h1:WQzt4IJo/WHKnckU9jXBLMJIVNMVeTu25dnOzehntWw= gorm.io/gorm v1.31.1 h1:7CA8FTFz/gRfgqgpeKIBcervUn3xSyPUmr6B2WXJ7kg= gorm.io/gorm v1.31.1/go.mod h1:XyQVbO2k6YkOis7C2437jSit3SsDK72s7n7rsSHd+Gs= -modernc.org/cc/v4 v4.26.5 h1:xM3bX7Mve6G8K8b+T11ReenJOT+BmVqQj0FY5T4+5Y4= -modernc.org/cc/v4 v4.26.5/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= modernc.org/cc/v4 v4.27.1 h1:9W30zRlYrefrDV2JE2O8VDtJ1yPGownxciz5rrbQZis= -modernc.org/ccgo/v4 v4.28.1 h1:wPKYn5EC/mYTqBO373jKjvX2n+3+aK7+sICCv4Fjy1A= -modernc.org/ccgo/v4 v4.28.1/go.mod h1:uD+4RnfrVgE6ec9NGguUNdhqzNIeeomeXf6CL0GTE5Q= +modernc.org/cc/v4 v4.27.1/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= modernc.org/ccgo/v4 v4.30.1 h1:4r4U1J6Fhj98NKfSjnPUN7Ze2c6MnAdL0hWw6+LrJpc= +modernc.org/ccgo/v4 v4.30.1/go.mod h1:bIOeI1JL54Utlxn+LwrFyjCx2n2RDiYEaJVSrgdrRfM= modernc.org/fileutil v1.3.40 h1:ZGMswMNc9JOCrcrakF1HrvmergNLAmxOPjizirpfqBA= modernc.org/fileutil v1.3.40/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc= modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI= modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito= +modernc.org/gc/v3 v3.1.1 h1:k8T3gkXWY9sEiytKhcgyiZ2L0DTyCQ/nvX+LoCljoRE= +modernc.org/gc/v3 v3.1.1/go.mod h1:HFK/6AGESC7Ex+EZJhJ2Gni6cTaYpSMmU/cT9RmlfYY= modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks= modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI= -modernc.org/libc v1.66.10 h1:yZkb3YeLx4oynyR+iUsXsybsX4Ubx7MQlSYEw4yj59A= -modernc.org/libc v1.66.10/go.mod h1:8vGSEwvoUoltr4dlywvHqjtAqHBaw0j1jI7iFBTAr2I= modernc.org/libc v1.67.1 h1:bFaqOaa5/zbWYJo8aW0tXPX21hXsngG2M7mckCnFSVk= modernc.org/libc v1.67.1/go.mod h1:QvvnnJ5P7aitu0ReNpVIEyesuhmDLQ8kaEoyMjIFZJA= modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= @@ -234,8 +220,6 @@ modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8= modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= -modernc.org/sqlite v1.40.0 h1:bNWEDlYhNPAUdUdBzjAvn8icAs/2gaKlj4vM+tQ6KdQ= -modernc.org/sqlite v1.40.0/go.mod h1:9fjQZ0mB1LLP0GYrp39oOJXx/I2sxEnZtzCmEQIKvGE= modernc.org/sqlite v1.40.1 h1:VfuXcxcUWWKRBuP8+BR9L7VnmusMgBNNnBYGEe9w/iY= modernc.org/sqlite v1.40.1/go.mod h1:9fjQZ0mB1LLP0GYrp39oOJXx/I2sxEnZtzCmEQIKvGE= modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= diff --git a/internal/protocol/message.go b/internal/protocol/message.go index 89c88cc..d7bd696 100644 --- a/internal/protocol/message.go +++ b/internal/protocol/message.go @@ -321,6 +321,7 @@ type AssetInventory struct { UserAssets *UserAssets `json:"userAssets,omitempty"` // 用户资产 FileAssets *FileAssets `json:"fileAssets,omitempty"` // 文件资产 KernelAssets *KernelAssets `json:"kernelAssets,omitempty"` // 内核资产 + LoginAssets *LoginAssets `json:"loginAssets,omitempty"` // 登录资产 } // AuditStatistics 审计统计摘要 @@ -329,6 +330,7 @@ type AuditStatistics struct { ProcessStats *ProcessStatistics `json:"processStats,omitempty"` // 进程统计 UserStats *UserStatistics `json:"userStats,omitempty"` // 用户统计 FileStats *FileStatistics `json:"fileStats,omitempty"` // 文件统计 + LoginStats *LoginStatistics `json:"loginStats,omitempty"` // 登录统计 } // ==================== 网络资产 ==================== @@ -424,10 +426,11 @@ type NetworkStatistics struct { // ProcessAssets 进程资产 type ProcessAssets struct { - RunningProcesses []ProcessInfo `json:"runningProcesses,omitempty"` // 所有运行进程(可选) - TopCPUProcesses []ProcessInfo `json:"topCpuProcesses,omitempty"` // CPU占用TOP进程 - TopMemoryProcesses []ProcessInfo `json:"topMemoryProcesses,omitempty"` // 内存占用TOP进程 - Statistics *ProcessStatistics `json:"statistics,omitempty"` // 统计信息 + RunningProcesses []ProcessInfo `json:"runningProcesses,omitempty"` // 所有运行进程(可选) + TopCPUProcesses []ProcessInfo `json:"topCpuProcesses,omitempty"` // CPU占用TOP进程 + TopMemoryProcesses []ProcessInfo `json:"topMemoryProcesses,omitempty"` // 内存占用TOP进程 + SuspiciousProcesses []ProcessInfo `json:"suspiciousProcesses,omitempty"` // 可疑进程(如已删除exe) + Statistics *ProcessStatistics `json:"statistics,omitempty"` // 统计信息 } // ProcessInfo 进程信息 @@ -443,6 +446,7 @@ type ProcessInfo struct { MemoryMB uint64 `json:"memoryMb"` // 内存占用(MB) Status string `json:"status,omitempty"` // 状态 CreateTime int64 `json:"createTime"` // 创建时间(毫秒) + ExeDeleted bool `json:"exeDeleted"` // 可执行文件是否已删除 } // ProcessStatistics 进程统计 @@ -531,6 +535,7 @@ type FileAssets struct { StartupScripts []StartupScript `json:"startupScripts,omitempty"` // 启动脚本 RecentModified []FileInfo `json:"recentModified,omitempty"` // 最近修改文件 LargeFiles []FileInfo `json:"largeFiles,omitempty"` // 大文件 + TmpExecutables []FileInfo `json:"tmpExecutables,omitempty"` // 临时目录可执行文件 Statistics *FileStatistics `json:"statistics,omitempty"` // 统计信息 } @@ -602,3 +607,23 @@ type SecurityModuleInfo struct { AppArmorStatus string `json:"apparmorStatus,omitempty"` // AppArmor状态 SecureBootState string `json:"secureBootState,omitempty"` // 安全启动状态 } + +// ==================== 登录资产 ==================== + +// LoginAssets 登录资产 +type LoginAssets struct { + SuccessfulLogins []LoginRecord `json:"successfulLogins,omitempty"` // 成功登录记录 + FailedLogins []LoginRecord `json:"failedLogins,omitempty"` // 失败登录记录 + CurrentSessions []LoginSession `json:"currentSessions,omitempty"` // 当前登录会话 + Statistics *LoginStatistics `json:"statistics,omitempty"` // 统计信息 +} + +// LoginStatistics 登录统计 +type LoginStatistics struct { + TotalLogins int `json:"totalLogins"` // 总登录次数 + FailedLogins int `json:"failedLogins"` // 失败登录次数 + CurrentSessions int `json:"currentSessions"` // 当前会话数 + UniqueIPs map[string]int `json:"uniqueIPs,omitempty"` // 唯一IP统计 + UniqueUsers map[string]int `json:"uniqueUsers,omitempty"` // 唯一用户统计 + HighFrequencyIPs map[string]int `json:"highFrequencyIPs,omitempty"` // 高频IP (登录次数>10) +} diff --git a/pkg/agent/audit/asset_file.go b/pkg/agent/audit/asset_file.go index f2d5999..8775a61 100644 --- a/pkg/agent/audit/asset_file.go +++ b/pkg/agent/audit/asset_file.go @@ -44,6 +44,9 @@ func (fac *FileAssetsCollector) Collect() *protocol.FileAssets { // 收集大文件 assets.LargeFiles = fac.collectLargeFiles() + // 收集临时目录可执行文件 + assets.TmpExecutables = fac.collectTmpExecutables() + // 统计信息 assets.Statistics = fac.calculateStatistics(assets) @@ -304,6 +307,45 @@ func (fac *FileAssetsCollector) collectLargeFiles() []protocol.FileInfo { return files } +// collectTmpExecutables 收集临时目录下的可执行文件 +func (fac *FileAssetsCollector) collectTmpExecutables() []protocol.FileInfo { + var files []protocol.FileInfo + + searchDirs := []string{"/tmp", "/dev/shm", "/var/tmp"} + + for _, dir := range searchDirs { + filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { + if err != nil || info.IsDir() { + return nil + } + + // 跳过符号链接 + if info.Mode()&os.ModeSymlink != 0 { + return nil + } + + // 检查是否可执行 (rwx) + if info.Mode()&0111 != 0 { + fileInfo := fac.convertToFileInfo(path, info) + files = append(files, fileInfo) + } + + // 限制每个目录的数量,防止遍历太多 + if len(files) >= 50 { + return filepath.SkipDir + } + + return nil + }) + + if len(files) >= 50 { + break + } + } + + return files +} + // convertToFileInfo 转换为文件信息 func (fac *FileAssetsCollector) convertToFileInfo(path string, info os.FileInfo) protocol.FileInfo { fileInfo := protocol.FileInfo{ diff --git a/pkg/agent/audit/asset_login.go b/pkg/agent/audit/asset_login.go new file mode 100644 index 0000000..e145b22 --- /dev/null +++ b/pkg/agent/audit/asset_login.go @@ -0,0 +1,386 @@ +package audit + +import ( + "bufio" + "fmt" + "os" + "strings" + "time" + + "github.com/dushixiang/pika/internal/protocol" +) + +// LoginAssetsCollector 登录日志收集器 +type LoginAssetsCollector struct { + config *Config + executor *CommandExecutor +} + +// NewLoginAssetsCollector 创建登录日志收集器 +func NewLoginAssetsCollector(config *Config, executor *CommandExecutor) *LoginAssetsCollector { + return &LoginAssetsCollector{ + config: config, + executor: executor, + } +} + +// Collect 收集登录日志 +func (lac *LoginAssetsCollector) Collect() *protocol.LoginAssets { + assets := &protocol.LoginAssets{} + + // 收集成功登录历史 + assets.SuccessfulLogins = lac.collectSuccessfulLogins() + + // 收集失败登录历史 + assets.FailedLogins = lac.collectFailedLogins() + + // 收集当前登录会话 + assets.CurrentSessions = lac.collectCurrentSessions() + + // 统计信息 + assets.Statistics = lac.calculateStatistics(assets) + + return assets +} + +// collectSuccessfulLogins 收集成功登录历史 +func (lac *LoginAssetsCollector) collectSuccessfulLogins() []protocol.LoginRecord { + var records []protocol.LoginRecord + + // 使用 last 命令获取登录历史 + output, err := lac.executor.Execute("last", "-n", "100", "-F", "-w") + if err != nil { + globalLogger.Debug("获取登录历史失败: %v", err) + return records + } + + lines := strings.Split(output, "\n") + for _, line := range lines { + line = strings.TrimSpace(line) + + // 跳过空行和特殊行 + if line == "" || strings.HasPrefix(line, "wtmp") || + strings.HasPrefix(line, "reboot") || strings.Contains(line, "system boot") { + continue + } + + fields := strings.Fields(line) + if len(fields) < 3 { + continue + } + + username := fields[0] + terminal := fields[1] + ip := fields[2] + + // 处理本地登录(没有IP的情况) + if ip == ":0" || ip == ":0.0" { + ip = "localhost" + } else if strings.HasPrefix(ip, ":") { + ip = "localhost" + ip + } + + // 解析登录时间(简化处理) + timestamp := time.Now().UnixMilli() + if len(fields) >= 4 { + // 尝试解析时间字段 + // 格式通常是: Mon Dec 25 10:30:00 2023 + if len(fields) >= 8 { + timeStr := strings.Join(fields[3:8], " ") + if t, err := time.Parse("Mon Jan _2 15:04:05 2006", timeStr); err == nil { + timestamp = t.UnixMilli() + } + } + } + + record := protocol.LoginRecord{ + Username: username, + Terminal: terminal, + IP: ip, + Timestamp: timestamp, + Status: "success", + } + + records = append(records, record) + + // 限制数量 + if len(records) >= 100 { + break + } + } + + return records +} + +// collectFailedLogins 收集失败登录历史 +func (lac *LoginAssetsCollector) collectFailedLogins() []protocol.LoginRecord { + var records []protocol.LoginRecord + + // 使用 lastb 命令获取失败登录历史 + output, err := lac.executor.Execute("lastb", "-n", "100", "-F", "-w") + if err != nil { + globalLogger.Debug("获取失败登录历史失败: %v (需要root权限)", err) + + // 尝试从日志文件读取 + records = lac.collectFailedLoginsFromAuthLog() + return records + } + + lines := strings.Split(output, "\n") + for _, line := range lines { + line = strings.TrimSpace(line) + + // 跳过空行和特殊行 + if line == "" || strings.HasPrefix(line, "btmp") { + continue + } + + fields := strings.Fields(line) + if len(fields) < 3 { + continue + } + + username := fields[0] + terminal := fields[1] + ip := fields[2] + + // 处理本地登录 + if ip == ":0" || ip == ":0.0" { + ip = "localhost" + } + + // 解析登录时间 + timestamp := time.Now().UnixMilli() + if len(fields) >= 8 { + timeStr := strings.Join(fields[3:8], " ") + if t, err := time.Parse("Mon Jan _2 15:04:05 2006", timeStr); err == nil { + timestamp = t.UnixMilli() + } + } + + record := protocol.LoginRecord{ + Username: username, + Terminal: terminal, + IP: ip, + Timestamp: timestamp, + Status: "failed", + } + + records = append(records, record) + + // 限制数量 + if len(records) >= 100 { + break + } + } + + return records +} + +// collectFailedLoginsFromAuthLog 从认证日志读取失败登录 +func (lac *LoginAssetsCollector) collectFailedLoginsFromAuthLog() []protocol.LoginRecord { + var records []protocol.LoginRecord + + // 尝试读取不同的认证日志文件 + authLogPaths := []string{ + "/var/log/auth.log", + "/var/log/secure", + } + + var authLog string + for _, path := range authLogPaths { + if _, err := os.Stat(path); err == nil { + authLog = path + break + } + } + + if authLog == "" { + return records + } + + file, err := os.Open(authLog) + if err != nil { + return records + } + defer file.Close() + + scanner := bufio.NewScanner(file) + count := 0 + + for scanner.Scan() && count < 100 { + line := scanner.Text() + + // 查找失败的SSH登录 + if strings.Contains(line, "Failed password") || + strings.Contains(line, "authentication failure") { + + record := lac.parseFailedLoginFromLog(line) + if record != nil { + records = append(records, *record) + count++ + } + } + } + + return records +} + +// parseFailedLoginFromLog 从日志行解析失败登录 +func (lac *LoginAssetsCollector) parseFailedLoginFromLog(line string) *protocol.LoginRecord { + // 简化解析,提取用户名和IP + username := "unknown" + ip := "unknown" + + // 提取用户名 + if idx := strings.Index(line, "user "); idx != -1 { + rest := line[idx+5:] + if spaceIdx := strings.Index(rest, " "); spaceIdx != -1 { + username = rest[:spaceIdx] + } + } else if idx := strings.Index(line, "for "); idx != -1 { + rest := line[idx+4:] + if spaceIdx := strings.Index(rest, " "); spaceIdx != -1 { + username = rest[:spaceIdx] + } + } + + // 提取IP地址 + if idx := strings.Index(line, "from "); idx != -1 { + rest := line[idx+5:] + if spaceIdx := strings.Index(rest, " "); spaceIdx != -1 { + ip = rest[:spaceIdx] + } else { + ip = rest + } + } + + return &protocol.LoginRecord{ + Username: username, + IP: ip, + Terminal: "ssh", + Timestamp: time.Now().UnixMilli(), + Status: "failed", + } +} + +// collectCurrentSessions 收集当前登录会话 +func (lac *LoginAssetsCollector) collectCurrentSessions() []protocol.LoginSession { + var sessions []protocol.LoginSession + + // 使用 w 命令 + output, err := lac.executor.Execute("w", "-h") + if err != nil { + globalLogger.Debug("获取当前登录失败: %v", err) + return sessions + } + + lines := strings.Split(output, "\n") + for _, line := range lines { + line = strings.TrimSpace(line) + if line == "" { + continue + } + + fields := strings.Fields(line) + if len(fields) < 4 { + continue + } + + username := fields[0] + terminal := fields[1] + fromIP := fields[2] + + // 处理本地会话 + if fromIP == "-" || fromIP == "" { + fromIP = "localhost" + } + + // 解析空闲时间 + idleStr := fields[3] + idleSeconds := lac.parseIdleTime(idleStr) + + // 解析登录时间(从空闲时间推算) + loginTime := time.Now().Add(-time.Duration(idleSeconds) * time.Second).UnixMilli() + + session := protocol.LoginSession{ + Username: username, + Terminal: terminal, + IP: fromIP, + LoginTime: loginTime, + IdleTime: idleSeconds, + } + + sessions = append(sessions, session) + } + + return sessions +} + +// parseIdleTime 解析空闲时间字符串 +func (lac *LoginAssetsCollector) parseIdleTime(idleStr string) int { + if idleStr == "-" || idleStr == "?" { + return 0 + } + + // 支持格式: "1.00s", "2:30", "1:00m", "3days" + idleStr = strings.TrimSpace(idleStr) + + // 秒 + if strings.HasSuffix(idleStr, "s") { + var seconds float64 + if _, err := fmt.Sscanf(idleStr, "%f", &seconds); err == nil { + return int(seconds) + } + } + + // 分:秒 或 时:分 + if strings.Contains(idleStr, ":") { + parts := strings.Split(idleStr, ":") + if len(parts) == 2 { + var hours, minutes int + if _, err := fmt.Sscanf(idleStr, "%d:%d", &hours, &minutes); err == nil { + return hours*3600 + minutes*60 + } + } + } + + // 天 + if strings.Contains(idleStr, "day") { + var days int + if _, err := fmt.Sscanf(idleStr, "%dday", &days); err == nil { + return days * 86400 + } + } + + return 0 +} + +// calculateStatistics 计算统计信息 +func (lac *LoginAssetsCollector) calculateStatistics(assets *protocol.LoginAssets) *protocol.LoginStatistics { + stats := &protocol.LoginStatistics{ + TotalLogins: len(assets.SuccessfulLogins), + FailedLogins: len(assets.FailedLogins), + CurrentSessions: len(assets.CurrentSessions), + UniqueIPs: make(map[string]int), + UniqueUsers: make(map[string]int), + } + + // 统计唯一IP和用户 + for _, login := range assets.SuccessfulLogins { + stats.UniqueIPs[login.IP]++ + stats.UniqueUsers[login.Username]++ + } + + // 查找高频IP + for ip, count := range stats.UniqueIPs { + if count > 10 { + if stats.HighFrequencyIPs == nil { + stats.HighFrequencyIPs = make(map[string]int) + } + stats.HighFrequencyIPs[ip] = count + } + } + + return stats +} diff --git a/pkg/agent/audit/asset_process.go b/pkg/agent/audit/asset_process.go index 8f8fa3d..74e74e7 100644 --- a/pkg/agent/audit/asset_process.go +++ b/pkg/agent/audit/asset_process.go @@ -2,6 +2,7 @@ package audit import ( "sort" + "strings" "github.com/dushixiang/pika/internal/protocol" "github.com/shirou/gopsutil/v4/process" @@ -33,10 +34,16 @@ func (pac *ProcessAssetsCollector) Collect() *protocol.ProcessAssets { // 收集所有进程信息 var allProcesses []protocol.ProcessInfo + var suspiciousProcesses []protocol.ProcessInfo + for _, p := range procs { procInfo := pac.convertToProcessInfo(p) if procInfo != nil { allProcesses = append(allProcesses, *procInfo) + // 检查是否可疑 + if procInfo.ExeDeleted { + suspiciousProcesses = append(suspiciousProcesses, *procInfo) + } } } @@ -46,6 +53,9 @@ func (pac *ProcessAssetsCollector) Collect() *protocol.ProcessAssets { // TOP 内存进程 assets.TopMemoryProcesses = pac.getTopProcesses(allProcesses, "memory", 15) + // 可疑进程 + assets.SuspiciousProcesses = suspiciousProcesses + // 可选:完整进程列表 (配置控制) // 暂时不包含完整列表,避免数据过大 // assets.RunningProcesses = allProcesses @@ -79,6 +89,17 @@ func (pac *ProcessAssetsCollector) convertToProcessInfo(p *process.Process) *pro memoryMB = memInfo.RSS / 1024 / 1024 } + // 检查 Exe 是否已删除 + exeDeleted := false + if exe != "" { + // Linux 下已删除的 exe 通常以 " (deleted)" 结尾 + // 注意:gopsutil 可能会处理这个,但为了保险起见我们自己检查 + if strings.HasSuffix(exe, " (deleted)") || strings.Contains(exe, "; rm ") { + exeDeleted = true + } + // TODO: 可以增加更多检查逻辑,如 exe 指向 /tmp 或 /dev/shm + } + return &protocol.ProcessInfo{ PID: p.Pid, Name: name, @@ -91,6 +112,7 @@ func (pac *ProcessAssetsCollector) convertToProcessInfo(p *process.Process) *pro MemoryMB: memoryMB, Status: status[0], // 取第一个状态 CreateTime: createTime, + ExeDeleted: exeDeleted, } } diff --git a/pkg/agent/audit/audit.go b/pkg/agent/audit/audit.go index ba30152..3406fdb 100644 --- a/pkg/agent/audit/audit.go +++ b/pkg/agent/audit/audit.go @@ -4,6 +4,7 @@ import ( "fmt" "os" "runtime" + "sync" "time" "github.com/dushixiang/pika/internal/protocol" @@ -29,6 +30,7 @@ type Auditor struct { userAssetsCollector *UserAssetsCollector fileAssetsCollector *FileAssetsCollector kernelAssetsCollector *KernelAssetsCollector + loginAssetsCollector *LoginAssetsCollector } // NewAuditor 创建审计器 @@ -52,6 +54,7 @@ func NewAuditor(config *Config) *Auditor { userAssetsCollector: NewUserAssetsCollector(config, executor), fileAssetsCollector: NewFileAssetsCollector(config, executor), kernelAssetsCollector: NewKernelAssetsCollector(config, executor), + loginAssetsCollector: NewLoginAssetsCollector(config, executor), } } @@ -136,13 +139,22 @@ func (a *Auditor) collectAssets() *protocol.AssetInventory { {"内核资产", func() { inventory.KernelAssets = a.kernelAssetsCollector.Collect() }}, + {"登录资产", func() { + inventory.LoginAssets = a.loginAssetsCollector.Collect() + }}, } - // 串行执行(避免资源竞争,实际可以优化为并发) + // 并发执行 + var wg sync.WaitGroup for _, task := range tasks { - globalLogger.Debug("收集%s...", task.name) - task.fn() + wg.Add(1) + go func(t assetTask) { + defer wg.Done() + globalLogger.Debug("收集%s...", t.name) + t.fn() + }(task) } + wg.Wait() return inventory } @@ -167,6 +179,10 @@ func (a *Auditor) calculateStatistics(inventory *protocol.AssetInventory) *proto stats.FileStats = inventory.FileAssets.Statistics } + if inventory.LoginAssets != nil { + stats.LoginStats = inventory.LoginAssets.Statistics + } + return stats } diff --git a/pkg/agent/audit/audit_test.go b/pkg/agent/audit/audit_test.go deleted file mode 100644 index ac37ff2..0000000 --- a/pkg/agent/audit/audit_test.go +++ /dev/null @@ -1,279 +0,0 @@ -package audit - -import ( - "os" - "testing" - "time" -) - -func TestDefaultConfig(t *testing.T) { - config := DefaultConfig() - - if config == nil { - t.Fatal("DefaultConfig returned nil") - } - - // 验证关键配置 - if config.ProcessConfig.HighCPUThreshold != 70.0 { - t.Errorf("Expected HighCPUThreshold to be 70.0, got %f", config.ProcessConfig.HighCPUThreshold) - } - - if len(config.ProcessConfig.MinerKeywords) == 0 { - t.Error("MinerKeywords should not be empty") - } - - if config.ScoringConfig.CriticalThreshold != 80 { - t.Errorf("Expected CriticalThreshold to be 80, got %d", config.ScoringConfig.CriticalThreshold) - } -} - -func TestProcessCache(t *testing.T) { - cache := NewProcessCache(100 * time.Millisecond) - - // 第一次获取 - procs1, err := cache.Get() - if err != nil { - t.Fatalf("Failed to get processes: %v", err) - } - - if len(procs1) == 0 { - t.Error("Expected processes, got empty list") - } - - // 第二次获取(应该从缓存) - procs2, err := cache.Get() - if err != nil { - t.Fatalf("Failed to get cached processes: %v", err) - } - - // 应该是相同的引用 - if len(procs1) != len(procs2) { - t.Error("Cache should return same process list") - } - - // 等待缓存过期 - time.Sleep(150 * time.Millisecond) - - // 获取新的进程列表 - procs3, err := cache.Get() - if err != nil { - t.Fatalf("Failed to get refreshed processes: %v", err) - } - - if len(procs3) == 0 { - t.Error("Expected processes after cache expiry") - } -} - -func TestCommandExecutor(t *testing.T) { - executor := NewCommandExecutor(5 * time.Second) - - // 测试成功的命令 - output, err := executor.Execute("echo", "hello") - if err != nil { - t.Fatalf("Failed to execute command: %v", err) - } - - if output != "hello\n" { - t.Errorf("Expected 'hello\\n', got '%s'", output) - } - - // 测试超时 - executor2 := NewCommandExecutor(100 * time.Millisecond) - _, err = executor2.Execute("sleep", "1") - if err == nil { - t.Error("Expected timeout error") - } -} - -func TestFileHashCache(t *testing.T) { - cache := NewFileHashCache() - - // 创建临时文件 - tmpFile, err := os.CreateTemp("", "test-hash-*.txt") - if err != nil { - t.Fatalf("Failed to create temp file: %v", err) - } - defer os.Remove(tmpFile.Name()) - - tmpFile.WriteString("test content") - tmpFile.Close() - - // 第一次计算 - hash1 := cache.GetSHA256(tmpFile.Name()) - if hash1 == "" { - t.Error("Expected hash, got empty string") - } - - // 第二次应该从缓存 - hash2 := cache.GetSHA256(tmpFile.Name()) - if hash1 != hash2 { - t.Error("Cache should return same hash") - } - - // 修改文件 - os.WriteFile(tmpFile.Name(), []byte("modified content"), 0644) - - // 应该计算新的哈希 - hash3 := cache.GetSHA256(tmpFile.Name()) - if hash3 == hash1 { - t.Error("Hash should be different after file modification") - } -} - -func TestStringUtils(t *testing.T) { - su := &StringUtils{} - - // 测试 Truncate - if result := su.Truncate("hello", 10); result != "hello" { - t.Errorf("Expected 'hello', got '%s'", result) - } - - if result := su.Truncate("hello world", 5); result != "hello" { - t.Errorf("Expected 'hello', got '%s'", result) - } - - // 测试 ContainsAny - keywords := []string{"foo", "bar", "baz"} - - if !su.ContainsAny("hello foobar", keywords) { - t.Error("Expected true for 'hello foobar'") - } - - if su.ContainsAny("hello world", keywords) { - t.Error("Expected false for 'hello world'") - } - - // 测试大小写不敏感 - if !su.ContainsAny("HELLO FOO", keywords) { - t.Error("Expected true for case-insensitive match") - } -} - -func TestIsLocalIP(t *testing.T) { - tests := []struct { - ip string - expected bool - }{ - {"127.0.0.1", true}, - {"::1", true}, - {"localhost", true}, - {"192.168.1.1", true}, - {"10.0.0.1", true}, - {"172.16.0.1", true}, - {"8.8.8.8", false}, - {"1.1.1.1", false}, - } - - for _, tt := range tests { - result := IsLocalIP(tt.ip) - if result != tt.expected { - t.Errorf("IsLocalIP(%s) = %v, expected %v", tt.ip, result, tt.expected) - } - } -} - -func TestBatchProcessor(t *testing.T) { - bp := NewBatchProcessor(3) - - items := []string{"a", "b", "c", "d", "e", "f", "g"} - processed := []string{} - - err := bp.Process(items, func(batch []string) error { - processed = append(processed, batch...) - return nil - }) - - if err != nil { - t.Fatalf("Process failed: %v", err) - } - - if len(processed) != len(items) { - t.Errorf("Expected %d items, got %d", len(items), len(processed)) - } - - // 验证顺序 - for i, item := range items { - if processed[i] != item { - t.Errorf("Order mismatch at index %d: expected %s, got %s", i, item, processed[i]) - } - } -} - -func TestWarningCollector(t *testing.T) { - wc := NewWarningCollector() - - wc.Add("warning 1") - wc.Add("warning 2") - wc.Add("warning 3") - - warnings := wc.GetAll() - - if len(warnings) != 3 { - t.Errorf("Expected 3 warnings, got %d", len(warnings)) - } - - if warnings[0] != "warning 1" { - t.Errorf("Expected 'warning 1', got '%s'", warnings[0]) - } -} - -// 集成测试(需要 root 权限和 Linux 环境) -func TestAuditorIntegration(t *testing.T) { - // 跳过如果不是 Linux 或没有 root 权限 - if os.Getenv("RUN_INTEGRATION_TESTS") != "true" { - t.Skip("Skipping integration test. Set RUN_INTEGRATION_TESTS=true to run") - } - - auditor := NewAuditor(nil) - - result, err := auditor.RunAudit() - if err != nil { - t.Fatalf("RunAudit failed: %v", err) - } - - if result == nil { - t.Fatal("Expected result, got nil") - } - - if len(result.SecurityChecks) == 0 { - t.Error("Expected security checks, got none") - } - - if result.RiskScore < 0 || result.RiskScore > 100 { - t.Errorf("Invalid risk score: %d", result.RiskScore) - } - - if result.ThreatLevel == "" { - t.Error("Threat level should not be empty") - } - - t.Logf("Audit completed in %dms", result.EndTime-result.StartTime) - t.Logf("Risk Score: %d, Threat Level: %s", result.RiskScore, result.ThreatLevel) - t.Logf("Security Checks: %d", len(result.SecurityChecks)) -} - -// 性能基准测试 -func BenchmarkProcessCache(b *testing.B) { - cache := NewProcessCache(1 * time.Second) - - b.ResetTimer() - for i := 0; i < b.N; i++ { - cache.Get() - } -} - -func BenchmarkFileHashCache(b *testing.B) { - cache := NewFileHashCache() - - // 创建临时文件 - tmpFile, _ := os.CreateTemp("", "bench-*.txt") - tmpFile.WriteString("test content for benchmarking") - tmpFile.Close() - defer os.Remove(tmpFile.Name()) - - b.ResetTimer() - for i := 0; i < b.N; i++ { - cache.GetSHA256(tmpFile.Name()) - } -} diff --git a/web/src/api/agent.ts b/web/src/api/agent.ts index e63748c..8cc2fb3 100644 --- a/web/src/api/agent.ts +++ b/web/src/api/agent.ts @@ -137,10 +137,63 @@ export interface ListeningPort { isPublic: boolean; } +export interface NetworkConnection { + protocol: string; + localAddr: string; + localPort: number; + remoteAddr: string; + remotePort: number; + state: string; + processPid?: number; + processName?: string; +} + +export interface NetworkInterface { + name: string; + macAddress: string; + addresses?: string[]; + mtu: number; + isUp: boolean; + flags?: string[]; +} + +export interface RouteEntry { + destination: string; + gateway: string; + genmask: string; + interface: string; + metric: number; +} + +export interface FirewallRule { + chain: string; + target: string; + protocol?: string; + source?: string; + dest?: string; + port?: string; +} + +export interface FirewallInfo { + type: string; + status: string; + rules?: FirewallRule[]; +} + +export interface ARPEntry { + ipAddress: string; + macAddress: string; + interface: string; +} + export interface NetworkAssets { listeningPorts?: ListeningPort[]; - connections?: any[]; - interfaces?: any[]; + connections?: NetworkConnection[]; + interfaces?: NetworkInterface[]; + routingTable?: RouteEntry[]; + firewallRules?: FirewallInfo; + dnsServers?: string[]; + arpTable?: ARPEntry[]; } export interface ProcessInfo { @@ -152,11 +205,14 @@ export interface ProcessInfo { cpuPercent: number; memPercent: number; memoryMb: number; + exeDeleted?: boolean; } export interface ProcessAssets { + runningProcesses?: ProcessInfo[]; topCpuProcesses?: ProcessInfo[]; topMemoryProcesses?: ProcessInfo[]; + suspiciousProcesses?: ProcessInfo[]; } export interface UserInfo { @@ -170,25 +226,109 @@ export interface UserInfo { hasPassword: boolean; } +export interface LoginRecord { + username: string; + ip?: string; + terminal: string; + timestamp: number; + status?: string; +} + +export interface LoginSession { + username: string; + terminal: string; + ip: string; + loginTime: number; + idleTime: number; +} + +export interface SSHKeyInfo { + username: string; + keyType: string; + fingerprint: string; + comment?: string; + filePath: string; + addedTime?: number; +} + +export interface SudoUserInfo { + username: string; + rules?: string; + noPasswd: boolean; +} + export interface UserAssets { systemUsers?: UserInfo[]; - loginHistory?: any[]; - sshKeys?: any[]; - sudoUsers?: any[]; + loginHistory?: LoginRecord[]; + currentLogins?: LoginSession[]; + sshKeys?: SSHKeyInfo[]; + sudoUsers?: SudoUserInfo[]; +} + +export interface LoginAssets { + successfulLogins?: LoginRecord[]; + failedLogins?: LoginRecord[]; + currentSessions?: LoginSession[]; +} + +export interface FileInfo { + path: string; + size: number; + modTime: number; + permissions?: string; + owner?: string; + group?: string; + isExecutable: boolean; +} + +export interface CronJob { + user: string; + schedule: string; + command: string; + filePath?: string; +} + +export interface SystemdService { + name: string; + state?: string; + enabled: boolean; + execStart?: string; + description?: string; + unitFile?: string; +} + +export interface StartupScript { + type: string; + path: string; + name: string; + enabled: boolean; } export interface FileAssets { - cronJobs?: any[]; - systemdServices?: any[]; - startupScripts?: any[]; - recentModified?: any[]; - largeFiles?: any[]; + cronJobs?: CronJob[]; + systemdServices?: SystemdService[]; + startupScripts?: StartupScript[]; + recentModified?: FileInfo[]; + largeFiles?: FileInfo[]; + tmpExecutables?: FileInfo[]; +} + +export interface KernelModule { + name: string; + size: number; + usedBy: number; +} + +export interface SecurityModuleInfo { + selinuxStatus?: string; + apparmorStatus?: string; + secureBootState?: string; } export interface KernelAssets { - loadedModules?: any[]; + loadedModules?: KernelModule[]; kernelParameters?: Record; - securityModules?: any; + securityModules?: SecurityModuleInfo; } export interface AssetInventory { @@ -197,6 +337,7 @@ export interface AssetInventory { userAssets?: UserAssets; fileAssets?: FileAssets; kernelAssets?: KernelAssets; + loginAssets?: LoginAssets; } export interface AuditStatistics { diff --git a/web/src/pages/Agents/AuditResultView.tsx b/web/src/pages/Agents/AuditResultView.tsx index 7f6e57b..e980082 100644 --- a/web/src/pages/Agents/AuditResultView.tsx +++ b/web/src/pages/Agents/AuditResultView.tsx @@ -13,9 +13,11 @@ import { Activity, Calendar, Settings, - PlayCircle + PlayCircle, + AlertOctagon, + LogIn } from 'lucide-react'; -import type {VPSAuditResult, VPSAuditAnalysis} from '../../api/agent'; +import type {VPSAuditResult, ProcessInfo, FileInfo, LoginRecord, LoginSession, SSHKeyInfo, SudoUserInfo} from '../../api/agent'; import dayjs from 'dayjs'; import duration from 'dayjs/plugin/duration'; @@ -23,11 +25,98 @@ dayjs.extend(duration); const {Panel} = Collapse; +interface RiskItem { + level: 'critical' | 'high' | 'medium' | 'low'; + title: string; + description: string; +} + interface AuditResultViewProps { result: VPSAuditResult; } const AuditResultView = ({result}: AuditResultViewProps) => { + const analyzeRisks = (result: VPSAuditResult): RiskItem[] => { + const risks: RiskItem[] = []; + + // 1. Suspicious Processes + if (result.assetInventory.processAssets?.suspiciousProcesses?.length) { + risks.push({ + level: 'critical', + title: '发现可疑进程', + description: `发现 ${result.assetInventory.processAssets.suspiciousProcesses.length} 个可执行文件已删除的进程` + }); + } + + // 2. Tmp Executables + if (result.assetInventory.fileAssets?.tmpExecutables?.length) { + risks.push({ + level: 'high', + title: '发现临时目录可执行文件', + description: `在 /tmp 或 /dev/shm 目录下发现 ${result.assetInventory.fileAssets.tmpExecutables.length} 个可执行文件` + }); + } + + // 3. Root Equivalent Users + const rootEquivUsers = result.assetInventory.userAssets?.systemUsers?.filter(u => u.isRootEquiv); + if (rootEquivUsers?.length) { + risks.push({ + level: 'high', + title: '存在Root权限用户', + description: `发现 ${rootEquivUsers.length} 个UID为0的非root用户: ${rootEquivUsers.map(u => u.username).join(', ')}` + }); + } + + // 4. Loginable Users with No Password + const noPwdUsers = result.assetInventory.userAssets?.systemUsers?.filter(u => u.isLoginable && !u.hasPassword); + if (noPwdUsers?.length) { + risks.push({ + level: 'medium', + title: '存在无密码可登录用户', + description: `发现 ${noPwdUsers.length} 个用户无密码且可登录: ${noPwdUsers.map(u => u.username).join(', ')}` + }); + } + + // 5. Failed Login Attempts + const failedLogins = result.assetInventory.loginAssets?.failedLogins?.length || 0; + if (failedLogins > 50) { + risks.push({ + level: 'high', + title: '存在大量失败登录尝试', + description: `发现 ${failedLogins} 次失败登录尝试,可能存在暴力破解攻击` + }); + } else if (failedLogins > 20) { + risks.push({ + level: 'medium', + title: '存在失败登录尝试', + description: `发现 ${failedLogins} 次失败登录尝试` + }); + } + + // 6. High Frequency Login IPs + if (result.assetInventory.loginAssets?.successfulLogins) { + const ipCount: Record = {}; + result.assetInventory.loginAssets.successfulLogins.forEach(login => { + if (login.ip && login.ip !== 'localhost') { + ipCount[login.ip] = (ipCount[login.ip] || 0) + 1; + } + }); + + const highFreqIPs = Object.entries(ipCount).filter(([_, count]) => count > 30); + if (highFreqIPs.length > 0) { + risks.push({ + level: 'medium', + title: '发现高频登录IP', + description: `以下IP登录次数异常频繁: ${highFreqIPs.map(([ip, count]) => `${ip}(${count}次)`).join(', ')}` + }); + } + } + + return risks; + }; + + const risks = analyzeRisks(result); + const getStatusIcon = (status: string) => { switch (status) { case 'pass': @@ -108,15 +197,15 @@ const AuditResultView = ({result}: AuditResultViewProps) => { { title: '本地地址', key: 'local', - render: (record: any) => `${record.laddr?.ip || ''}:${record.laddr?.port || ''}`, + render: (record: any) => `${record.localAddr || ''}:${record.localPort || ''}`, }, { title: '远程地址', key: 'remote', - render: (record: any) => `${record.raddr?.ip || ''}:${record.raddr?.port || ''}`, + render: (record: any) => `${record.remoteAddr || ''}:${record.remotePort || ''}`, }, - {title: '状态', dataIndex: 'status', key: 'status', width: 120}, - {title: 'PID', dataIndex: 'pid', key: 'pid', width: 80}, + {title: '状态', dataIndex: 'state', key: 'state', width: 120}, + {title: 'PID', dataIndex: 'processPid', key: 'processPid', width: 80}, {title: '进程', dataIndex: 'processName', key: 'processName'}, ]; @@ -168,6 +257,76 @@ const AuditResultView = ({result}: AuditResultViewProps) => { }, ]; + const loginRecordColumns = [ + {title: '用户名', dataIndex: 'username', key: 'username', width: 120}, + {title: 'IP地址', dataIndex: 'ip', key: 'ip', width: 150}, + {title: '终端', dataIndex: 'terminal', key: 'terminal', width: 100}, + { + title: '登录时间', + dataIndex: 'timestamp', + key: 'timestamp', + render: (val: number) => dayjs(val).format('YYYY-MM-DD HH:mm:ss') + }, + { + title: '状态', + dataIndex: 'status', + key: 'status', + width: 80, + render: (status: string) => status === 'success' ? + 成功 : 失败 + }, + ]; + + const currentSessionColumns = [ + {title: '用户名', dataIndex: 'username', key: 'username', width: 120}, + {title: 'IP地址', dataIndex: 'ip', key: 'ip', width: 150}, + {title: '终端', dataIndex: 'terminal', key: 'terminal', width: 100}, + { + title: '登录时间', + dataIndex: 'loginTime', + key: 'loginTime', + render: (val: number) => dayjs(val).format('YYYY-MM-DD HH:mm:ss') + }, + { + title: '空闲时间', + dataIndex: 'idleTime', + key: 'idleTime', + width: 100, + render: (seconds: number) => { + if (seconds === 0) return '-'; + const hours = Math.floor(seconds / 3600); + const minutes = Math.floor((seconds % 3600) / 60); + return hours > 0 ? `${hours}h ${minutes}m` : `${minutes}m`; + } + }, + ]; + + const sshKeyColumns = [ + {title: '用户', dataIndex: 'username', key: 'username', width: 120}, + {title: '密钥类型', dataIndex: 'keyType', key: 'keyType', width: 120}, + {title: '指纹', dataIndex: 'fingerprint', key: 'fingerprint', ellipsis: true}, + {title: '注释', dataIndex: 'comment', key: 'comment', ellipsis: true}, + { + title: '添加时间', + dataIndex: 'addedTime', + key: 'addedTime', + width: 180, + render: (val: number) => val ? dayjs(val).format('YYYY-MM-DD HH:mm:ss') : '-' + }, + ]; + + const sudoUserColumns = [ + {title: '用户名', dataIndex: 'username', key: 'username', width: 150}, + { + title: '免密码', + dataIndex: 'noPasswd', + key: 'noPasswd', + width: 100, + render: (val: boolean) => val ? 是 : 否 + }, + {title: '规则', dataIndex: 'rules', key: 'rules', ellipsis: true}, + ]; + const cronColumns = [ {title: '用户', dataIndex: 'user', key: 'user', width: 100}, {title: '计划', dataIndex: 'schedule', key: 'schedule', width: 150}, @@ -210,6 +369,27 @@ const AuditResultView = ({result}: AuditResultViewProps) => { return ( + {/* 风险概览 */} + {risks.length > 0 && ( + 风险概览} + className="border-red-200 bg-red-50" + > + ( + + {item.title}} + description={item.description} + /> + + )} + /> + + )} + {/* 系统信息 */} 系统信息} @@ -274,7 +454,7 @@ const AuditResultView = ({result}: AuditResultViewProps) => { size="small" dataSource={result.assetInventory.networkAssets.connections} columns={connectionColumns} - rowKey={(record, index) => `${record.laddr?.ip}:${record.laddr?.port}-${record.raddr?.ip}:${record.raddr?.port}-${index}`} + rowKey={(record, index) => `${record.localAddr}:${record.localPort}-${record.remoteAddr}:${record.remotePort}-${index}`} pagination={false} /> ) : ( @@ -304,6 +484,34 @@ const AuditResultView = ({result}: AuditResultViewProps) => { label: 进程资产, children: ( + {result.assetInventory.processAssets?.suspiciousProcesses && result.assetInventory.processAssets.suspiciousProcesses.length > 0 && ( + + )} + 可疑进程}> + {result.assetInventory.processAssets?.suspiciousProcesses?.length ? ( +
    record.exeDeleted ? Exe已删除 : null + } + ]} + rowKey="pid" + pagination={false} + /> + ) : ( + + )} + {result.assetInventory.processAssets?.topCpuProcesses?.length ? (
    { key: 'user', label: 用户资产, children: ( - - {result.assetInventory.userAssets?.systemUsers?.length ? ( -
    - ) : ( - - )} - + + + {result.assetInventory.userAssets?.systemUsers?.length ? ( +
    + ) : ( + + )} + + + {result.assetInventory.userAssets?.sshKeys?.length ? ( +
    `${record.username}-${index}`} + pagination={false} + /> + ) : ( + + )} + + + {result.assetInventory.userAssets?.sudoUsers?.length ? ( +
    + ) : ( + + )} + + + {result.assetInventory.userAssets?.currentLogins?.length ? ( +
    `${record.username}-${record.terminal}-${index}`} + pagination={false} + /> + ) : ( + + )} + + ), }, { @@ -357,6 +606,32 @@ const AuditResultView = ({result}: AuditResultViewProps) => { label: 文件资产, children: ( + {result.assetInventory.fileAssets?.tmpExecutables && result.assetInventory.fileAssets.tmpExecutables.length > 0 && ( + + )} + 临时目录可执行文件}> + {result.assetInventory.fileAssets?.tmpExecutables?.length ? ( +
    `${(val / 1024).toFixed(2)} KB`}, + {title: '修改时间', dataIndex: 'modTime', key: 'modTime', render: (val: number) => dayjs(val).format('YYYY-MM-DD HH:mm:ss')}, + {title: '权限', dataIndex: 'permissions', key: 'permissions'}, + ]} + rowKey="path" + pagination={false} + /> + ) : ( + + )} + 定时任务}> {result.assetInventory.fileAssets?.cronJobs?.length ? (
    { ), }, + { + key: 'login', + label: 登录日志, + children: ( + + {result.assetInventory.loginAssets?.failedLogins && result.assetInventory.loginAssets.failedLogins.length > 0 && ( + + )} + + {result.assetInventory.loginAssets?.successfulLogins?.length ? ( +
    `success-${index}`} + pagination={{pageSize: 20}} + /> + ) : ( + + )} + + 失败登录历史}> + {result.assetInventory.loginAssets?.failedLogins?.length ? ( +
    `failed-${index}`} + pagination={{pageSize: 20}} + /> + ) : ( + + )} + + + {result.assetInventory.loginAssets?.currentSessions?.length ? ( +
    `session-${index}`} + pagination={false} + /> + ) : ( + + )} + + + ), + }, { key: 'kernel', label: 内核信息, From 919111502f1a0fe12d2799f578c61dfd9d180e5d Mon Sep 17 00:00:00 2001 From: dushixiang Date: Wed, 26 Nov 2025 23:18:22 +0800 Subject: [PATCH 12/27] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=AE=89=E5=85=A8?= =?UTF-8?q?=E5=AE=A1=E8=AE=A1=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/protocol/message.go | 17 ++ pkg/agent/audit/asset_file.go | 90 ++++++++-- pkg/agent/audit/asset_login.go | 92 +++++++--- pkg/agent/audit/asset_user.go | 100 +++++++++++ web/src/api/agent.ts | 16 ++ web/src/pages/Agents/AuditResultView.tsx | 216 +++++++++++++++++++++-- 6 files changed, 481 insertions(+), 50 deletions(-) diff --git a/internal/protocol/message.go b/internal/protocol/message.go index d7bd696..604c434 100644 --- a/internal/protocol/message.go +++ b/internal/protocol/message.go @@ -467,6 +467,7 @@ type UserAssets struct { CurrentLogins []LoginSession `json:"currentLogins,omitempty"` // 当前登录 SSHKeys []SSHKeyInfo `json:"sshKeys,omitempty"` // SSH密钥 SudoUsers []SudoUserInfo `json:"sudoUsers,omitempty"` // Sudo用户 + SSHConfig *SSHConfig `json:"sshConfig,omitempty"` // SSH配置 Statistics *UserStatistics `json:"statistics,omitempty"` // 统计信息 } @@ -517,6 +518,22 @@ type SudoUserInfo struct { NoPasswd bool `json:"noPasswd"` // 是否免密 } +// SSHConfig SSH配置信息 +type SSHConfig struct { + Port int `json:"port"` // SSH端口 + PermitRootLogin string `json:"permitRootLogin"` // 是否允许root登录 (yes/no/prohibit-password) + PasswordAuthentication bool `json:"passwordAuthentication"` // 是否允许密码认证 + PubkeyAuthentication bool `json:"pubkeyAuthentication"` // 是否允许公钥认证 + PermitEmptyPasswords bool `json:"permitEmptyPasswords"` // 是否允许空密码 + Protocol string `json:"protocol,omitempty"` // 协议版本 + MaxAuthTries int `json:"maxAuthTries,omitempty"` // 最大认证尝试次数 + ClientAliveInterval int `json:"clientAliveInterval,omitempty"` // 客户端保活间隔 + ClientAliveCountMax int `json:"clientAliveCountMax,omitempty"` // 客户端保活最大次数 + X11Forwarding bool `json:"x11Forwarding,omitempty"` // 是否允许X11转发 + UsePAM bool `json:"usePAM,omitempty"` // 是否使用PAM + ConfigFilePath string `json:"configFilePath,omitempty"` // 配置文件路径 +} + // UserStatistics 用户统计 type UserStatistics struct { TotalUsers int `json:"totalUsers"` // 用户总数 diff --git a/pkg/agent/audit/asset_file.go b/pkg/agent/audit/asset_file.go index 8775a61..9a5323b 100644 --- a/pkg/agent/audit/asset_file.go +++ b/pkg/agent/audit/asset_file.go @@ -141,8 +141,8 @@ func (fac *FileAssetsCollector) parseCronFile(filePath string, defaultUser strin func (fac *FileAssetsCollector) collectSystemdServices() []protocol.SystemdService { var services []protocol.SystemdService - // 使用 systemctl list-units - output, err := fac.executor.Execute("systemctl", "list-units", "--type=service", "--all", "--no-pager") + // 使用 systemctl list-units 获取服务列表 + output, err := fac.executor.Execute("systemctl", "list-units", "--type=service", "--all", "--no-pager", "--no-legend") if err != nil { globalLogger.Debug("获取systemd服务失败: %v", err) return services @@ -151,7 +151,7 @@ func (fac *FileAssetsCollector) collectSystemdServices() []protocol.SystemdServi lines := strings.Split(output, "\n") for _, line := range lines { line = strings.TrimSpace(line) - if line == "" || strings.HasPrefix(line, "UNIT") || strings.HasPrefix(line, "●") { + if line == "" { continue } @@ -165,21 +165,33 @@ func (fac *FileAssetsCollector) collectSystemdServices() []protocol.SystemdServi continue } - state := "" - if len(fields) > 2 { - state = fields[2] + // 加载状态和活动状态 + loadState := fields[1] // loaded/not-found + activeState := fields[2] // active/inactive/failed + // subState := fields[3] // running/dead/exited (目前未使用) + + // 获取服务的详细信息 + service := protocol.SystemdService{ + Name: serviceName, + State: activeState, } - service := protocol.SystemdService{ - Name: serviceName, - State: state, - Enabled: strings.Contains(line, "enabled"), + // 判断是否启用(开机自启) + if loadState == "loaded" { + enabledOutput, err := fac.executor.Execute("systemctl", "is-enabled", serviceName) + if err == nil { + enabledStatus := strings.TrimSpace(enabledOutput) + service.Enabled = enabledStatus == "enabled" + } } + // 获取服务详细信息 + fac.enrichServiceInfo(&service) + services = append(services, service) // 限制数量 - if len(services) >= 100 { + if len(services) >= 150 { break } } @@ -187,6 +199,62 @@ func (fac *FileAssetsCollector) collectSystemdServices() []protocol.SystemdServi return services } +// enrichServiceInfo 丰富服务信息 +func (fac *FileAssetsCollector) enrichServiceInfo(service *protocol.SystemdService) { + // 使用 systemctl show 获取详细信息 + output, err := fac.executor.Execute("systemctl", "show", service.Name, "--no-pager") + if err != nil { + return + } + + lines := strings.Split(output, "\n") + for _, line := range lines { + line = strings.TrimSpace(line) + if line == "" { + continue + } + + // 解析 Key=Value 格式 + parts := strings.SplitN(line, "=", 2) + if len(parts) != 2 { + continue + } + + key := parts[0] + value := parts[1] + + switch key { + case "Description": + service.Description = value + case "ExecStart": + // ExecStart 格式: { path=/usr/bin/xxx ; argv[]=/usr/bin/xxx ... } + // 提取可执行路径 + if strings.Contains(value, "path=") { + start := strings.Index(value, "path=") + if start != -1 { + start += 5 + end := strings.Index(value[start:], " ") + if end != -1 { + service.ExecStart = value[start : start+end] + } else { + // 可能到结尾了 + end = strings.Index(value[start:], ";") + if end != -1 { + service.ExecStart = value[start : start+end] + } + } + } + } + // 如果没有 path=,尝试直接提取 + if service.ExecStart == "" && value != "" { + service.ExecStart = value + } + case "FragmentPath": + service.UnitFile = value + } + } +} + // collectStartupScripts 收集启动脚本 func (fac *FileAssetsCollector) collectStartupScripts() []protocol.StartupScript { var scripts []protocol.StartupScript diff --git a/pkg/agent/audit/asset_login.go b/pkg/agent/audit/asset_login.go index e145b22..6392930 100644 --- a/pkg/agent/audit/asset_login.go +++ b/pkg/agent/audit/asset_login.go @@ -80,18 +80,8 @@ func (lac *LoginAssetsCollector) collectSuccessfulLogins() []protocol.LoginRecor ip = "localhost" + ip } - // 解析登录时间(简化处理) - timestamp := time.Now().UnixMilli() - if len(fields) >= 4 { - // 尝试解析时间字段 - // 格式通常是: Mon Dec 25 10:30:00 2023 - if len(fields) >= 8 { - timeStr := strings.Join(fields[3:8], " ") - if t, err := time.Parse("Mon Jan _2 15:04:05 2006", timeStr); err == nil { - timestamp = t.UnixMilli() - } - } - } + // 解析登录时间 + timestamp := lac.parseLoginTime(fields) record := protocol.LoginRecord{ Username: username, @@ -112,6 +102,38 @@ func (lac *LoginAssetsCollector) collectSuccessfulLogins() []protocol.LoginRecor return records } +// parseLoginTime 解析登录时间 +func (lac *LoginAssetsCollector) parseLoginTime(fields []string) int64 { + // last -F 输出格式示例: + // username pts/0 192.168.1.1 Mon Dec 25 10:30:00 2023 - Mon Dec 25 11:00:00 2023 + // 时间在第4-8个字段 + + if len(fields) < 8 { + return time.Now().UnixMilli() + } + + // 尝试多种时间格式 + timeFormats := []string{ + "Mon Jan _2 15:04:05 2006", // 标准格式 + "Mon Jan 2 15:04:05 2006", // 不带下划线 + "2006-01-02 15:04:05", // ISO格式 + } + + // 从第3个字段开始(索引2),因为前面是 username terminal ip + timeStr := strings.Join(fields[3:8], " ") + + for _, format := range timeFormats { + if t, err := time.Parse(format, timeStr); err == nil { + // 使用本地时区解析时间 + return t.UnixMilli() + } + } + + // 如果解析失败,返回当前时间 + globalLogger.Debug("无法解析登录时间: %s", timeStr) + return time.Now().UnixMilli() +} + // collectFailedLogins 收集失败登录历史 func (lac *LoginAssetsCollector) collectFailedLogins() []protocol.LoginRecord { var records []protocol.LoginRecord @@ -150,13 +172,7 @@ func (lac *LoginAssetsCollector) collectFailedLogins() []protocol.LoginRecord { } // 解析登录时间 - timestamp := time.Now().UnixMilli() - if len(fields) >= 8 { - timeStr := strings.Join(fields[3:8], " ") - if t, err := time.Parse("Mon Jan _2 15:04:05 2006", timeStr); err == nil { - timestamp = t.UnixMilli() - } - } + timestamp := lac.parseLoginTime(fields) record := protocol.LoginRecord{ Username: username, @@ -255,15 +271,51 @@ func (lac *LoginAssetsCollector) parseFailedLoginFromLog(line string) *protocol. } } + // 尝试解析日志时间 + // syslog 格式: Dec 25 10:30:00 + timestamp := lac.parseSyslogTime(line) + return &protocol.LoginRecord{ Username: username, IP: ip, Terminal: "ssh", - Timestamp: time.Now().UnixMilli(), + Timestamp: timestamp, Status: "failed", } } +// parseSyslogTime 解析syslog时间格式 +func (lac *LoginAssetsCollector) parseSyslogTime(line string) int64 { + // syslog 时间格式通常在行首: Dec 25 10:30:00 + fields := strings.Fields(line) + if len(fields) < 3 { + return time.Now().UnixMilli() + } + + // 获取当前年份(syslog不包含年份) + currentYear := time.Now().Year() + + // 尝试解析: Month Day Time + timeStr := fmt.Sprintf("%s %s %s %d", fields[0], fields[1], fields[2], currentYear) + + formats := []string{ + "Jan _2 15:04:05 2006", + "Jan 2 15:04:05 2006", + } + + for _, format := range formats { + if t, err := time.Parse(format, timeStr); err == nil { + // 如果解析的时间比当前时间晚,说明是去年的日志 + if t.After(time.Now()) { + t = t.AddDate(-1, 0, 0) + } + return t.UnixMilli() + } + } + + return time.Now().UnixMilli() +} + // collectCurrentSessions 收集当前登录会话 func (lac *LoginAssetsCollector) collectCurrentSessions() []protocol.LoginSession { var sessions []protocol.LoginSession diff --git a/pkg/agent/audit/asset_user.go b/pkg/agent/audit/asset_user.go index 3f503b8..b657026 100644 --- a/pkg/agent/audit/asset_user.go +++ b/pkg/agent/audit/asset_user.go @@ -44,6 +44,9 @@ func (uac *UserAssetsCollector) Collect() *protocol.UserAssets { // 收集Sudo用户 assets.SudoUsers = uac.collectSudoUsers() + // 收集SSH配置 + assets.SSHConfig = uac.collectSSHConfig() + // 统计信息 assets.Statistics = uac.calculateStatistics(assets) @@ -369,6 +372,103 @@ func (uac *UserAssetsCollector) getAllUserDirectories() []string { return dirs } +// collectSSHConfig 收集SSH配置 +func (uac *UserAssetsCollector) collectSSHConfig() *protocol.SSHConfig { + configPath := "/etc/ssh/sshd_config" + + // 检查配置文件是否存在 + if _, err := os.Stat(configPath); err != nil { + globalLogger.Debug("SSH配置文件不存在: %v", err) + return nil + } + + file, err := os.Open(configPath) + if err != nil { + globalLogger.Debug("读取SSH配置失败: %v", err) + return nil + } + defer file.Close() + + // 默认值(OpenSSH默认配置) + config := &protocol.SSHConfig{ + Port: 22, + PermitRootLogin: "prohibit-password", // 默认值因发行版而异 + PasswordAuthentication: true, + PubkeyAuthentication: true, + PermitEmptyPasswords: false, + MaxAuthTries: 6, + ClientAliveInterval: 0, + ClientAliveCountMax: 3, + X11Forwarding: false, + UsePAM: true, + ConfigFilePath: configPath, + } + + // 解析配置文件 + scanner := bufio.NewScanner(file) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + + // 跳过注释和空行 + if line == "" || strings.HasPrefix(line, "#") { + continue + } + + // 解析配置项 + fields := strings.Fields(line) + if len(fields) < 2 { + continue + } + + key := strings.ToLower(fields[0]) + value := strings.Join(fields[1:], " ") + + switch key { + case "port": + if port := parseInt(value); port > 0 { + config.Port = port + } + case "permitrootlogin": + config.PermitRootLogin = strings.ToLower(value) + case "passwordauthentication": + config.PasswordAuthentication = parseBool(value) + case "pubkeyauthentication": + config.PubkeyAuthentication = parseBool(value) + case "permitemptypasswords": + config.PermitEmptyPasswords = parseBool(value) + case "protocol": + config.Protocol = value + case "maxauthtries": + if tries := parseInt(value); tries > 0 { + config.MaxAuthTries = tries + } + case "clientaliveinterval": + config.ClientAliveInterval = parseInt(value) + case "clientalivecountmax": + config.ClientAliveCountMax = parseInt(value) + case "x11forwarding": + config.X11Forwarding = parseBool(value) + case "usepam": + config.UsePAM = parseBool(value) + } + } + + return config +} + +// parseInt 解析整数 +func parseInt(s string) int { + var result int + fmt.Sscanf(s, "%d", &result) + return result +} + +// parseBool 解析布尔值 +func parseBool(s string) bool { + s = strings.ToLower(s) + return s == "yes" || s == "true" || s == "1" +} + // calculateStatistics 计算统计信息 func (uac *UserAssetsCollector) calculateStatistics(assets *protocol.UserAssets) *protocol.UserStatistics { stats := &protocol.UserStatistics{ diff --git a/web/src/api/agent.ts b/web/src/api/agent.ts index 8cc2fb3..5ab7432 100644 --- a/web/src/api/agent.ts +++ b/web/src/api/agent.ts @@ -257,12 +257,28 @@ export interface SudoUserInfo { noPasswd: boolean; } +export interface SSHConfig { + port: number; + permitRootLogin: string; + passwordAuthentication: boolean; + pubkeyAuthentication: boolean; + permitEmptyPasswords: boolean; + protocol?: string; + maxAuthTries?: number; + clientAliveInterval?: number; + clientAliveCountMax?: number; + x11Forwarding?: boolean; + usePAM?: boolean; + configFilePath?: string; +} + export interface UserAssets { systemUsers?: UserInfo[]; loginHistory?: LoginRecord[]; currentLogins?: LoginSession[]; sshKeys?: SSHKeyInfo[]; sudoUsers?: SudoUserInfo[]; + sshConfig?: SSHConfig; } export interface LoginAssets { diff --git a/web/src/pages/Agents/AuditResultView.tsx b/web/src/pages/Agents/AuditResultView.tsx index e980082..00f7da7 100644 --- a/web/src/pages/Agents/AuditResultView.tsx +++ b/web/src/pages/Agents/AuditResultView.tsx @@ -20,6 +20,7 @@ import { import type {VPSAuditResult, ProcessInfo, FileInfo, LoginRecord, LoginSession, SSHKeyInfo, SudoUserInfo} from '../../api/agent'; import dayjs from 'dayjs'; import duration from 'dayjs/plugin/duration'; +import React from 'react'; dayjs.extend(duration); @@ -36,6 +37,22 @@ interface AuditResultViewProps { } const AuditResultView = ({result}: AuditResultViewProps) => { + // 判断是否为内网IP + const isPrivateIP = (ip: string): boolean => { + if (!ip || ip === 'localhost') return true; + + // IPv4 私有地址 + const privateRanges = [ + /^10\./, // 10.0.0.0/8 + /^172\.(1[6-9]|2[0-9]|3[0-1])\./, // 172.16.0.0/12 + /^192\.168\./, // 192.168.0.0/16 + /^127\./, // 127.0.0.0/8 (loopback) + /^169\.254\./, // 169.254.0.0/16 (link-local) + ]; + + return privateRanges.some(range => range.test(ip)); + }; + const analyzeRisks = (result: VPSAuditResult): RiskItem[] => { const risks: RiskItem[] = []; @@ -67,47 +84,118 @@ const AuditResultView = ({result}: AuditResultViewProps) => { }); } - // 4. Loginable Users with No Password - const noPwdUsers = result.assetInventory.userAssets?.systemUsers?.filter(u => u.isLoginable && !u.hasPassword); + // 4. Loginable Users with No Password (排除系统用户) + const systemUsernames = ['sync', 'shutdown', 'halt', 'daemon', 'bin', 'sys', 'adm', 'games', 'ftp', 'nobody', 'systemd-network', 'systemd-resolve']; + const noPwdUsers = result.assetInventory.userAssets?.systemUsers?.filter(u => { + // 必须可登录且无密码 + if (!u.isLoginable || u.hasPassword) return false; + + // 排除系统用户 (UID < 1000) + const uid = parseInt(u.uid); + if (!isNaN(uid) && uid < 1000) return false; + + // 排除常见系统用户名 + if (systemUsernames.includes(u.username)) return false; + + return true; + }); + if (noPwdUsers?.length) { risks.push({ level: 'medium', title: '存在无密码可登录用户', - description: `发现 ${noPwdUsers.length} 个用户无密码且可登录: ${noPwdUsers.map(u => u.username).join(', ')}` + description: `发现 ${noPwdUsers.length} 个普通用户无密码且可登录: ${noPwdUsers.map(u => u.username).join(', ')}` }); } // 5. Failed Login Attempts const failedLogins = result.assetInventory.loginAssets?.failedLogins?.length || 0; - if (failedLogins > 50) { + if (failedLogins > 100) { risks.push({ level: 'high', title: '存在大量失败登录尝试', description: `发现 ${failedLogins} 次失败登录尝试,可能存在暴力破解攻击` }); - } else if (failedLogins > 20) { + } else if (failedLogins > 50) { risks.push({ level: 'medium', title: '存在失败登录尝试', - description: `发现 ${failedLogins} 次失败登录尝试` + description: `发现 ${failedLogins} 次失败登录尝试,建议检查日志` }); } - // 6. High Frequency Login IPs + // 6. SSH Configuration Security Issues + const sshConfig = result.assetInventory.userAssets?.sshConfig; + if (sshConfig) { + // 允许root密码登录 + if (sshConfig.permitRootLogin === 'yes' && sshConfig.passwordAuthentication) { + risks.push({ + level: 'high', + title: 'SSH允许root密码登录', + description: 'SSH配置允许root用户使用密码登录,存在被暴力破解的风险,建议设置为 prohibit-password 或 no' + }); + } + + // 允许空密码登录 + if (sshConfig.permitEmptyPasswords) { + risks.push({ + level: 'critical', + title: 'SSH允许空密码登录', + description: 'SSH配置允许空密码登录,严重的安全隐患!' + }); + } + + // 仅使用密码认证,没有启用公钥认证 + if (sshConfig.passwordAuthentication && !sshConfig.pubkeyAuthentication) { + risks.push({ + level: 'medium', + title: 'SSH仅启用密码认证', + description: 'SSH配置仅启用密码认证,建议启用公钥认证以提高安全性' + }); + } + + // 使用旧协议 + if (sshConfig.protocol && sshConfig.protocol.includes('1')) { + risks.push({ + level: 'high', + title: 'SSH使用不安全的协议版本', + description: 'SSH配置使用Protocol 1,存在安全漏洞,应仅使用Protocol 2' + }); + } + } + + // 7. High Frequency Login IPs (区分内外网) if (result.assetInventory.loginAssets?.successfulLogins) { - const ipCount: Record = {}; + const publicIPCount: Record = {}; + const privateIPCount: Record = {}; + result.assetInventory.loginAssets.successfulLogins.forEach(login => { - if (login.ip && login.ip !== 'localhost') { - ipCount[login.ip] = (ipCount[login.ip] || 0) + 1; + if (!login.ip || login.ip === 'localhost') return; + + if (isPrivateIP(login.ip)) { + privateIPCount[login.ip] = (privateIPCount[login.ip] || 0) + 1; + } else { + publicIPCount[login.ip] = (publicIPCount[login.ip] || 0) + 1; } }); - const highFreqIPs = Object.entries(ipCount).filter(([_, count]) => count > 30); - if (highFreqIPs.length > 0) { + // 外网IP:超过20次就警告 + const highFreqPublicIPs = Object.entries(publicIPCount).filter(([_, count]) => count > 20); + if (highFreqPublicIPs.length > 0) { risks.push({ level: 'medium', - title: '发现高频登录IP', - description: `以下IP登录次数异常频繁: ${highFreqIPs.map(([ip, count]) => `${ip}(${count}次)`).join(', ')}` + title: '发现高频外网IP登录', + description: `以下公网IP登录次数较多: ${highFreqPublicIPs.map(([ip, count]) => `${ip}(${count}次)`).join(', ')}` + }); + } + + // 内网IP:超过100次才警告(内网环境下频繁登录是正常的) + const highFreqPrivateIPs = Object.entries(privateIPCount).filter(([_, count]) => count > 100); + if (highFreqPrivateIPs.length > 0) { + risks.push({ + level: 'low', + title: '内网IP登录次数较多', + description: `以下内网IP登录次数较多: ${highFreqPrivateIPs.map(([ip, count]) => `${ip}(${count}次)`).join(', ')}` }); } } @@ -334,9 +422,20 @@ const AuditResultView = ({result}: AuditResultViewProps) => { {title: '文件路径', dataIndex: 'filePath', key: 'filePath', width: 200, ellipsis: true}, ]; + const [showAllServices, setShowAllServices] = React.useState(false); + const serviceColumns = [ {title: '服务名', dataIndex: 'name', key: 'name'}, - {title: '状态', dataIndex: 'state', key: 'state', width: 100}, + { + title: '状态', + dataIndex: 'state', + key: 'state', + width: 100, + render: (state: string) => { + const color = state === 'active' ? 'success' : state === 'failed' ? 'error' : 'default'; + return {state || '-'}; + } + }, { title: '开机启动', dataIndex: 'enabled', @@ -348,6 +447,15 @@ const AuditResultView = ({result}: AuditResultViewProps) => { {title: '描述', dataIndex: 'description', key: 'description', ellipsis: true}, ]; + // 过滤 systemd 服务 + const filteredServices = React.useMemo(() => { + const services = result.assetInventory.fileAssets?.systemdServices || []; + if (showAllServices) { + return services; + } + return services.filter(s => s.state === 'active'); + }, [result.assetInventory.fileAssets?.systemdServices, showAllServices]); + const startupScriptColumns = [ {title: '类型', dataIndex: 'type', key: 'type', width: 150}, {title: '名称', dataIndex: 'name', key: 'name'}, @@ -598,6 +706,59 @@ const AuditResultView = ({result}: AuditResultViewProps) => { )} + {result.assetInventory.userAssets?.sshConfig && ( + + + + {result.assetInventory.userAssets.sshConfig.port} + {result.assetInventory.userAssets.sshConfig.port !== 22 && ( + 非标准端口 + )} + + + {result.assetInventory.userAssets.sshConfig.permitRootLogin === 'yes' ? ( + 允许 + ) : result.assetInventory.userAssets.sshConfig.permitRootLogin === 'prohibit-password' ? ( + 仅密钥 + ) : ( + 禁止 + )} + + + {result.assetInventory.userAssets.sshConfig.passwordAuthentication ? ( + 启用 + ) : ( + 禁用 + )} + + + {result.assetInventory.userAssets.sshConfig.pubkeyAuthentication ? ( + 启用 + ) : ( + 禁用 + )} + + + {result.assetInventory.userAssets.sshConfig.permitEmptyPasswords ? ( + 允许 + ) : ( + 禁止 + )} + + + {result.assetInventory.userAssets.sshConfig.maxAuthTries || '-'} + + {result.assetInventory.userAssets.sshConfig.protocol && ( + + {result.assetInventory.userAssets.sshConfig.protocol} + {result.assetInventory.userAssets.sshConfig.protocol.includes('1') && ( + 不安全 + )} + + )} + + + )} ), }, @@ -645,17 +806,34 @@ const AuditResultView = ({result}: AuditResultViewProps) => { )} - Systemd服务}> - {result.assetInventory.fileAssets?.systemdServices?.length ? ( + Systemd服务} + extra={ + + + 共 {result.assetInventory.fileAssets?.systemdServices?.length || 0} 个服务 + {!showAllServices && ` (显示 ${filteredServices.length} 个活跃服务)`} + + + + } + > + {filteredServices.length ? (
    ) : ( - + )} 启动脚本}> From 0379b8064c076651e4c5420832ac0a909572c06f Mon Sep 17 00:00:00 2001 From: dushixiang Date: Wed, 26 Nov 2025 23:27:11 +0800 Subject: [PATCH 13/27] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=AE=89=E5=85=A8?= =?UTF-8?q?=E5=AE=A1=E8=AE=A1=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/pages/Agents/AuditResultView.tsx | 36 ++++++++++++------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/web/src/pages/Agents/AuditResultView.tsx b/web/src/pages/Agents/AuditResultView.tsx index 00f7da7..fb3214c 100644 --- a/web/src/pages/Agents/AuditResultView.tsx +++ b/web/src/pages/Agents/AuditResultView.tsx @@ -127,15 +127,6 @@ const AuditResultView = ({result}: AuditResultViewProps) => { // 6. SSH Configuration Security Issues const sshConfig = result.assetInventory.userAssets?.sshConfig; if (sshConfig) { - // 允许root密码登录 - if (sshConfig.permitRootLogin === 'yes' && sshConfig.passwordAuthentication) { - risks.push({ - level: 'high', - title: 'SSH允许root密码登录', - description: 'SSH配置允许root用户使用密码登录,存在被暴力破解的风险,建议设置为 prohibit-password 或 no' - }); - } - // 允许空密码登录 if (sshConfig.permitEmptyPasswords) { risks.push({ @@ -145,15 +136,6 @@ const AuditResultView = ({result}: AuditResultViewProps) => { }); } - // 仅使用密码认证,没有启用公钥认证 - if (sshConfig.passwordAuthentication && !sshConfig.pubkeyAuthentication) { - risks.push({ - level: 'medium', - title: 'SSH仅启用密码认证', - description: 'SSH配置仅启用密码认证,建议启用公钥认证以提高安全性' - }); - } - // 使用旧协议 if (sshConfig.protocol && sshConfig.protocol.includes('1')) { risks.push({ @@ -162,6 +144,24 @@ const AuditResultView = ({result}: AuditResultViewProps) => { description: 'SSH配置使用Protocol 1,存在安全漏洞,应仅使用Protocol 2' }); } + + // 允许root密码登录 + if (sshConfig.permitRootLogin === 'yes' && sshConfig.passwordAuthentication) { + risks.push({ + level: 'medium', + title: 'SSH允许root密码登录', + description: 'SSH配置允许root用户使用密码登录,建议配合fail2ban等防护措施,或设置为 prohibit-password' + }); + } + + // 仅使用密码认证,没有启用公钥认证 + if (sshConfig.passwordAuthentication && !sshConfig.pubkeyAuthentication) { + risks.push({ + level: 'low', + title: 'SSH仅启用密码认证', + description: 'SSH配置仅启用密码认证,建议同时启用公钥认证以提高安全性' + }); + } } // 7. High Frequency Login IPs (区分内外网) From 35b2934d0a1a263c8e5d3adcd7b6bc5231e155bf Mon Sep 17 00:00:00 2001 From: dushixiang Date: Wed, 26 Nov 2025 23:55:49 +0800 Subject: [PATCH 14/27] =?UTF-8?q?=E5=AE=8C=E5=96=84=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 52 +++++++++++++++++++++++++++++++++++----- screenshots/deploy.png | Bin 98069 -> 0 bytes screenshots/public2.png | Bin 190639 -> 0 bytes 3 files changed, 46 insertions(+), 6 deletions(-) delete mode 100644 screenshots/deploy.png delete mode 100644 screenshots/public2.png diff --git a/README.md b/README.md index 765b63c..3cfe724 100644 --- a/README.md +++ b/README.md @@ -4,20 +4,54 @@ 一个基于 Go + PostgreSQL 的实时探针监控系统 -[快速开始](#快速开始) • [功能特性](#功能特性) • [文档](#文档) • [架构](#架构) +[快速开始](#快速开始) • [功能特性](#功能特性) • [文档](#文档) ## 简介 -Pika 是一个轻量级的探针监控系统,支持实时数据采集、存储和查询。系统采用 WebSocket 进行探针与服务端的通信,使用 PostgreSQL 存储时序数据。 +Pika 是一个轻量级的探针监控系统,支持实时数据采集、存储和查询。系统采用 WebSocket 进行探针与服务端的通信,使用 PostgreSQL 存储时序数据。除了基础监控功能外,还提供 Linux 应急响应和安全基线检查能力,帮助快速发现和分析系统安全风险。 + +## 功能特性 + +### 📊 实时性能监控 + +- 系统资源监控:CPU、内存、磁盘、网络、GPU、温度等指标 +- 时序数据查询:支持多种时间范围(5分钟、15分钟、30分钟、1小时),实时刷新和历史趋势分析 + +### 🔍 服务监控 + +- HTTP/HTTPS 监控:支持状态码检查、响应时间测量、内容匹配、HTTPS 证书到期检测 +- TCP 端口监控:检测端口连通性和响应时间 +- ICMP/Ping 监控:测量网络延迟和丢包率 + +### 🛡️ 防篡改保护 + +- 文件保护:保护关键目录,防止未授权修改 +- 实时监控:基于 fsnotify 实时监控受保护目录的文件变动 +- 属性巡检:定期检查不可变属性,自动恢复被篡改的保护 +- 事件告警:实时上报文件变动事件和属性篡改告警 + +### 🔒 安全审计与应急响应 + +- **资产清单收集**:支持收集网络资产(端口、连接、防火墙)、进程资产、用户资产(SSH配置、密钥)、登录日志、文件资产(Cron、服务、启动脚本)、内核资产等 +- **安全风险分析**:自动检测登录异常、可疑进程、用户权限风险、SSH配置安全问题等,并按严重程度分级(Critical/High/Medium/Low) +- **历史审计记录**:保存审计历史,支持查询和对比 + +### 🔐 认证与授权 + +- 支持多种认证方式:Basic Auth(bcrypt)、OIDC、GitHub OAuth +- 灵活的权限管理:管理员权限、公开页面、JWT Token 认证 + +### 📦 部署与运维 + +- Docker Compose 一键部署,数据持久化到 PostgreSQL +- 灵活的 YAML 配置文件,支持网卡过滤和数据保留策略 ## 截图 ![public1.png](screenshots/public1.png) -![public2.png](screenshots/public2.png) -![deploy.png](screenshots/deploy.png) ## 快速开始 @@ -210,9 +244,15 @@ docker-compose restart #### 端口冲突 -如果 8080 或 5432 端口被占用,修改 `docker-compose.yml` 中的端口映射: +如果 8080 端口被占用,修改 `docker-compose.yml` 中的端口映射: ```yaml ports: - "8081:8080" # 将 8080 改为其他端口 -``` \ No newline at end of file +``` + +#### 网卡过滤 + +如果探针采集到了很多网卡,说明默认的过滤规则已经不适用于你的环境了。 + +你可以参考 [agent.example.yaml](cmd/agent/agent.example.yaml) 修改 `collector` 下的 `network_include` 或者 `network_exclude` 配置。 \ No newline at end of file diff --git a/screenshots/deploy.png b/screenshots/deploy.png deleted file mode 100644 index 9ee0c2810b8bc08d035ab07d307b6f6f00b960f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98069 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 xWH?vu0 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 From 728b151ba457620c60034d3d3fe473fd1850cacb Mon Sep 17 00:00:00 2001 From: dushixiang Date: Wed, 26 Nov 2025 23:59:36 +0800 Subject: [PATCH 15/27] =?UTF-8?q?=E5=AE=8C=E5=96=84=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 +++++++- screenshots/wx1.png | Bin 0 -> 360464 bytes 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 screenshots/wx1.png diff --git a/README.md b/README.md index 3cfe724..70e4ab6 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ 一个基于 Go + PostgreSQL 的实时探针监控系统 -[快速开始](#快速开始) • [功能特性](#功能特性) • [文档](#文档) +[快速开始](#快速开始) • [截图](#截图) • [功能特性](#功能特性) • [加入群聊](#加入群聊) @@ -53,6 +53,12 @@ Pika 是一个轻量级的探针监控系统,支持实时数据采集、存储 ![public1.png](screenshots/public1.png) +## 加入群聊 + +请备注 pika + + + ## 快速开始 ### 环境要求 diff --git a/screenshots/wx1.png b/screenshots/wx1.png new file mode 100644 index 0000000000000000000000000000000000000000..2a406bbeef1962c2ed8105f406fc5c16882c749a GIT binary patch literal 360464 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ʣ#SucYE}-&fiRxC= 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%0D>ltku!rJw({9lweY^p>x5d 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 literal 0 HcmV?d00001 From 1076c8c3f30b3c35cdd439f8cfd74983cc13c3a0 Mon Sep 17 00:00:00 2001 From: dushixiang Date: Thu, 27 Nov 2025 18:38:57 +0800 Subject: [PATCH 16/27] =?UTF-8?q?-=20=E7=A7=BB=E9=99=A4=E7=AB=AF=E5=8F=A3?= =?UTF-8?q?=E5=85=AC=E7=BD=91=E7=9B=91=E5=90=AC=E7=9A=84=E6=B8=B2=E6=9F=93?= =?UTF-8?q?=20-=20=E5=A2=9E=E5=8A=A0=E6=8E=A2=E9=92=88=E7=A6=BB=E7=BA=BF/?= =?UTF-8?q?=E4=B8=8A=E7=BA=BF=E7=9A=84=E7=9B=91=E6=8E=A7=20-=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E8=87=AA=E5=AE=9A=E4=B9=89=20webhook=20-=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=9A=97=E9=BB=91=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 4 +- go.sum | 20 ++ internal/app.go | 5 + internal/handler/agent_handler.go | 7 +- internal/models/alert.go | 4 + internal/models/property.go | 17 +- internal/repo/agent_repo.go | 5 +- internal/service/agent_service.go | 15 +- internal/service/alert_service.go | 156 +++++++++ internal/service/notifier.go | 217 +++++++++++-- pkg/agent/updater/updater.go | 148 +-------- web/src/components/PublicFooter.tsx | 12 +- web/src/components/PublicHeader.tsx | 122 +++++++- web/src/index.css | 12 + web/src/pages/Agents/AuditResultView.tsx | 8 - web/src/pages/Public/MonitorDetail.tsx | 122 ++++---- web/src/pages/Public/MonitorList.tsx | 90 +++--- web/src/pages/Public/ServerDetail.tsx | 221 +++++++------ web/src/pages/Public/ServerList.tsx | 146 +++++---- web/src/pages/PublicLayout.tsx | 2 +- web/src/pages/Settings/AlertSettings.tsx | 35 +++ .../pages/Settings/NotificationChannels.tsx | 295 ++++++++++++++++-- web/src/types/index.ts | 8 +- 23 files changed, 1177 insertions(+), 494 deletions(-) diff --git a/go.mod b/go.mod index e5639fc..fd3aa5d 100644 --- a/go.mod +++ b/go.mod @@ -18,10 +18,12 @@ require ( github.com/jpillora/backoff v1.0.0 github.com/kardianos/service v1.2.4 github.com/labstack/echo/v4 v4.13.4 + github.com/minio/selfupdate v0.6.0 github.com/prometheus-community/pro-bing v0.7.0 github.com/shirou/gopsutil/v4 v4.25.10 github.com/spf13/afero v1.15.0 github.com/spf13/cobra v1.10.1 + github.com/valyala/fasttemplate v1.2.2 go.uber.org/zap v1.27.1 golang.org/x/crypto v0.45.0 golang.org/x/oauth2 v0.33.0 @@ -31,6 +33,7 @@ require ( ) require ( + aead.dev/minisign v0.2.0 // indirect filippo.io/edwards25519 v1.1.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/ebitengine/purego v0.9.0 // indirect @@ -66,7 +69,6 @@ require ( github.com/tklauser/go-sysconf v0.3.15 // indirect github.com/tklauser/numcpus v0.10.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/valyala/fasttemplate v1.2.2 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect go.uber.org/multierr v1.11.0 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect diff --git a/go.sum b/go.sum index 35b7af5..dc2cde3 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +aead.dev/minisign v0.2.0 h1:kAWrq/hBRu4AARY6AlciO83xhNnW9UaC8YipS2uhLPk= +aead.dev/minisign v0.2.0/go.mod h1:zdq6LdSd9TbuSxchxwhpA9zEb9YXcVGoE8JakuiGaIQ= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= github.com/coreos/go-oidc/v3 v3.17.0 h1:hWBGaQfbi0iVviX4ibC7bk8OKT5qNr4klBaCHVNvehc= @@ -99,6 +101,8 @@ github.com/mattn/go-sqlite3 v1.14.32 h1:JD12Ag3oLy1zQA+BNn74xRgaBbdhbNIDYvQUEuuE github.com/mattn/go-sqlite3 v1.14.32/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/microsoft/go-mssqldb v1.7.2 h1:CHkFJiObW7ItKTJfHo1QX7QBBD1iV+mn1eOyRP3b/PA= github.com/microsoft/go-mssqldb v1.7.2/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA= +github.com/minio/selfupdate v0.6.0 h1:i76PgT0K5xO9+hjzKcacQtO7+MjJ4JKA8Ak8XQ9DDwU= +github.com/minio/selfupdate v0.6.0/go.mod h1:bO02GTIPCMQFTEvE5h4DjYB58bCoZ35XLeBf0buTDdM= github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w= github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= @@ -154,27 +158,43 @@ go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= golang.org/x/exp v0.0.0-20251113190631-e25ba8c21ef6 h1:zfMcR1Cs4KNuomFFgGefv5N0czO2XZpUbxGUy8i8ug0= golang.org/x/exp v0.0.0-20251113190631-e25ba8c21ef6/go.mod h1:46edojNIoXTNOhySWIWdix628clX9ODXwPsQuG6hsK0= golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk= golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= golang.org/x/oauth2 v0.33.0 h1:4Q+qn+E5z8gPRJfmRy7C2gGG3T4jIprK6aSYgTXGRpo= golang.org/x/oauth2 v0.33.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210228012217-479acdf4ea46/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ= golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/internal/app.go b/internal/app.go index 278792e..2bfb8e7 100644 --- a/internal/app.go +++ b/internal/app.go @@ -71,6 +71,11 @@ func setup(app *orz.App) error { app.Logger().Error("初始化默认属性配置失败", zap.Error(err)) // 不返回错误,继续启动 } + // 初始化探针的状态全部为离线 + if err := components.AgentService.InitStatus(ctx); err != nil { + app.Logger().Error("初始化探针状态失败", zap.Error(err)) + // 不返回错误,继续启动 + } // 启动WebSocket管理器 go components.WSManager.Run(ctx) diff --git a/internal/handler/agent_handler.go b/internal/handler/agent_handler.go index a4c8635..d8b7903 100644 --- a/internal/handler/agent_handler.go +++ b/internal/handler/agent_handler.go @@ -911,12 +911,7 @@ register_agent() { echo_info "正在注册探针..." - if /usr/local/bin/$AGENT_NAME register --endpoint "$endpoint" --token "$token"; then - echo_info "探针注册成功" - else - echo_error "探针注册失败" - exit 1 - fi + /usr/local/bin/$AGENT_NAME register --endpoint "$endpoint" --token "$token" } # 主流程 diff --git a/internal/models/alert.go b/internal/models/alert.go index acc6a0a..a0ad785 100644 --- a/internal/models/alert.go +++ b/internal/models/alert.go @@ -41,6 +41,10 @@ type AlertRules struct { // 服务下线告警配置 ServiceEnabled bool `json:"serviceEnabled"` // 是否启用服务下线告警 ServiceDuration int `json:"serviceDuration"` // 持续时间(秒) + + // 探针离线告警配置 + AgentOfflineEnabled bool `json:"agentOfflineEnabled"` // 是否启用探针离线告警 + AgentOfflineDuration int `json:"agentOfflineDuration"` // 持续时间(秒) } func (AlertConfig) TableName() string { diff --git a/internal/models/property.go b/internal/models/property.go index c1617a5..e74f10e 100644 --- a/internal/models/property.go +++ b/internal/models/property.go @@ -24,7 +24,22 @@ type NotificationChannelConfig struct { // dingtalk: { "secretKey": "xxx", "signSecret": "xxx" } // wecom: { "secretKey": "xxx" } // feishu: { "secretKey": "xxx", "signSecret": "xxx" } -// webhook: { "url": "https://..." } +// webhook: { +// "url": "https://...", +// "method": "POST", // 可选:GET, POST, PUT, PATCH, DELETE,默认 POST +// "headers": {"key": "value"}, // 可选:自定义请求头 +// "bodyTemplate": "json" // 可选:json(默认), form, custom +// "customBody": "" // 当 bodyTemplate 为 custom 时使用,支持变量替换 +// } + +// WebhookConfig 自定义 Webhook 配置结构 +type WebhookConfig struct { + URL string `json:"url"` // Webhook URL + Method string `json:"method,omitempty"` // 请求方法,默认 POST + Headers map[string]string `json:"headers,omitempty"` // 自定义请求头 + BodyTemplate string `json:"bodyTemplate,omitempty"` // 请求体模板:json, form, custom + CustomBody string `json:"customBody,omitempty"` // 自定义请求体模板(支持变量) +} type SystemConfig struct { SystemNameZh string `json:"systemNameZh"` // 系统名称(中文) diff --git a/internal/repo/agent_repo.go b/internal/repo/agent_repo.go index 29028e7..d49013e 100644 --- a/internal/repo/agent_repo.go +++ b/internal/repo/agent_repo.go @@ -2,7 +2,6 @@ package repo import ( "context" - "time" "github.com/dushixiang/pika/internal/models" "github.com/go-orz/orz" @@ -22,13 +21,13 @@ func NewAgentRepo(db *gorm.DB) *AgentRepo { } // UpdateStatus 更新探针状态 -func (r *AgentRepo) UpdateStatus(ctx context.Context, agentID string, status int) error { +func (r *AgentRepo) UpdateStatus(ctx context.Context, agentID string, status int, lastSeenAt int64) error { return r.db.WithContext(ctx). Model(&models.Agent{}). Where("id = ?", agentID). Updates(map[string]interface{}{ "status": status, - "last_seen_at": time.Now().UnixMilli(), + "last_seen_at": lastSeenAt, }).Error } diff --git a/internal/service/agent_service.go b/internal/service/agent_service.go index 14f0fed..e4708fe 100644 --- a/internal/service/agent_service.go +++ b/internal/service/agent_service.go @@ -109,7 +109,7 @@ func (s *AgentService) RegisterAgent(ctx context.Context, ip string, info *proto // UpdateAgentStatus 更新探针状态 func (s *AgentService) UpdateAgentStatus(ctx context.Context, agentID string, status int) error { - return s.AgentRepo.UpdateStatus(ctx, agentID, status) + return s.AgentRepo.UpdateStatus(ctx, agentID, status, time.Now().UnixMilli()) } // GetAgent 获取探针信息 @@ -790,3 +790,16 @@ func (s *AgentService) GetAgentByAuth(ctx context.Context, id string, isAuthenti func (s *AgentService) GetAllTags(ctx context.Context) ([]string, error) { return s.AgentRepo.GetAllTags(ctx) } + +func (s *AgentService) InitStatus(ctx context.Context) error { + agents, err := s.AgentRepo.FindAll(ctx) + if err != nil { + return err + } + for _, agent := range agents { + if err := s.AgentRepo.UpdateStatus(ctx, agent.ID, 0, 0); err != nil { + return err + } + } + return nil +} diff --git a/internal/service/alert_service.go b/internal/service/alert_service.go index 8d7e7d5..cb23a71 100644 --- a/internal/service/alert_service.go +++ b/internal/service/alert_service.go @@ -354,6 +354,13 @@ func (s *AlertService) CheckMonitorAlerts(ctx context.Context) error { s.logger.Error("检查服务下线告警失败", zap.Error(err)) } } + + // 检查探针离线告警 + if config.Rules.AgentOfflineEnabled { + if err := s.checkAgentOfflineAlerts(ctx, &config, now); err != nil { + s.logger.Error("检查探针离线告警失败", zap.Error(err)) + } + } } return nil @@ -710,3 +717,152 @@ func (s *AlertService) resolveServiceDownAlert(ctx context.Context, config *mode state.IsFiring = false state.LastRecordID = 0 } + +// checkAgentOfflineAlerts 检查探针离线告警 +func (s *AlertService) checkAgentOfflineAlerts(ctx context.Context, config *models.AlertConfig, now int64) error { + // 获取所有探针 + agents, err := s.agentRepo.FindAll(ctx) + if err != nil { + return err + } + + for _, agent := range agents { + stateKey := fmt.Sprintf("%s:%s:agent_offline:%s", config.AgentID, config.ID, agent.ID) + + s.mu.Lock() + state, exists := s.states[stateKey] + if !exists { + state = &models.AlertState{ + AgentID: agent.ID, + ConfigID: config.ID, + AlertType: "agent_offline", + Threshold: 0, + Duration: config.Rules.AgentOfflineDuration, + } + s.states[stateKey] = state + } + s.mu.Unlock() + + state.LastCheckTime = now + + // 计算探针离线时间(秒) + offlineSeconds := (now - agent.LastSeenAt) / 1000 + + // 检查探针是否离线超过阈值 + if offlineSeconds >= int64(config.Rules.AgentOfflineDuration) { + // 探针离线超过阈值 + if !state.IsFiring { + // 触发告警 + s.fireAgentOfflineAlert(ctx, config, &agent, state, offlineSeconds, now) + } + } else { + // 探针在线或离线时间未达到阈值 + if state.IsFiring { + // 从告警状态变为恢复状态 + s.resolveAgentOfflineAlert(ctx, config, &agent, state) + } + } + } + + return nil +} + +// fireAgentOfflineAlert 触发探针离线告警 +func (s *AlertService) fireAgentOfflineAlert(ctx context.Context, config *models.AlertConfig, agent *models.Agent, state *models.AlertState, offlineSeconds int64, now int64) { + s.logger.Info("触发探针离线告警", + zap.String("agentId", agent.ID), + zap.String("agentName", agent.Name), + zap.Int64("offlineSeconds", offlineSeconds), + zap.Int("threshold", state.Duration), + ) + + // 创建告警记录 + record := &models.AlertRecord{ + AgentID: agent.ID, + ConfigID: config.ID, + ConfigName: config.Name, + AlertType: "agent_offline", + Message: fmt.Sprintf("探针 %s 已离线%d秒,超过阈值%d秒", agent.Name, offlineSeconds, state.Duration), + Threshold: float64(state.Duration), + ActualValue: float64(offlineSeconds), + Level: "critical", + Status: "firing", + FiredAt: now, + CreatedAt: now, + } + + err := s.alertRepo.CreateAlertRecord(ctx, record) + if err != nil { + s.logger.Error("创建探针离线告警记录失败", zap.Error(err)) + return + } + + state.IsFiring = true + state.LastRecordID = record.ID + + // 发送通知 + go func() { + channelConfigs, err := s.propertyService.GetNotificationChannelConfigs(context.Background()) + if err != nil { + s.logger.Error("获取通知渠道配置失败", zap.Error(err)) + return + } + + var enabledChannels []models.NotificationChannelConfig + for _, channel := range channelConfigs { + if channel.Enabled { + enabledChannels = append(enabledChannels, channel) + } + } + + if err := s.notifier.SendNotificationByConfigs(context.Background(), enabledChannels, record, agent); err != nil { + s.logger.Error("发送探针离线告警通知失败", zap.Error(err)) + } + }() +} + +// resolveAgentOfflineAlert 恢复探针离线告警 +func (s *AlertService) resolveAgentOfflineAlert(ctx context.Context, config *models.AlertConfig, agent *models.Agent, state *models.AlertState) { + s.logger.Info("探针离线告警恢复", + zap.String("agentId", agent.ID), + zap.String("agentName", agent.Name), + ) + + // 更新告警记录状态 + if state.LastRecordID > 0 { + existingRecord, err := s.alertRepo.GetLatestAlertRecord(ctx, config.ID, "agent_offline") + if err == nil && existingRecord != nil { + existingRecord.Status = "resolved" + existingRecord.ResolvedAt = time.Now().UnixMilli() + existingRecord.UpdatedAt = time.Now().UnixMilli() + + err = s.alertRepo.UpdateAlertRecord(ctx, existingRecord) + if err != nil { + s.logger.Error("更新探针离线告警记录失败", zap.Error(err)) + } else { + // 发送恢复通知 + go func() { + channelConfigs, err := s.propertyService.GetNotificationChannelConfigs(context.Background()) + if err != nil { + s.logger.Error("获取通知渠道配置失败", zap.Error(err)) + return + } + + var enabledChannels []models.NotificationChannelConfig + for _, channel := range channelConfigs { + if channel.Enabled { + enabledChannels = append(enabledChannels, channel) + } + } + + if err := s.notifier.SendNotificationByConfigs(context.Background(), enabledChannels, existingRecord, agent); err != nil { + s.logger.Error("发送探针恢复通知失败", zap.Error(err)) + } + }() + } + } + } + + state.IsFiring = false + state.LastRecordID = 0 +} diff --git a/internal/service/notifier.go b/internal/service/notifier.go index a52297c..6356caf 100644 --- a/internal/service/notifier.go +++ b/internal/service/notifier.go @@ -10,9 +10,12 @@ import ( "fmt" "io" "net/http" + "net/url" + "strings" "time" "github.com/dushixiang/pika/internal/models" + "github.com/valyala/fasttemplate" "go.uber.org/zap" ) @@ -185,19 +188,182 @@ func (n *Notifier) sendFeishu(ctx context.Context, webhook, message string) erro } // sendCustomWebhook 发送自定义Webhook -func (n *Notifier) sendCustomWebhook(ctx context.Context, webhook string, message string) error { - // 发送完整的告警记录和探针信息 - body := map[string]interface{}{ - "msg_type": "text", - "text": map[string]string{ - "content": message, - }, +func (n *Notifier) sendCustomWebhook(ctx context.Context, config map[string]interface{}, agent *models.Agent, record *models.AlertRecord) error { + // 解析配置 + webhookURL, ok := config["url"].(string) + if !ok || webhookURL == "" { + return fmt.Errorf("自定义Webhook配置缺少 url") } - _, err := n.sendJSONRequest(ctx, webhook, body) - if err != nil { - return err + // 获取请求方法,默认 POST + method := "POST" + if m, ok := config["method"].(string); ok && m != "" { + method = strings.ToUpper(m) } + + // 获取自定义请求头 + headers := make(map[string]string) + if h, ok := config["headers"].(map[string]interface{}); ok { + for k, v := range h { + if strVal, ok := v.(string); ok { + headers[k] = strVal + } + } + } + + // 获取请求体模板类型,默认 json + bodyTemplate := "json" + if bt, ok := config["bodyTemplate"].(string); ok && bt != "" { + bodyTemplate = bt + } + + // 构建消息内容 + message := n.buildMessage(agent, record) + + // 根据模板类型构建请求体 + var reqBody io.Reader + var contentType string + + switch bodyTemplate { + case "json": + // JSON 格式 + body := map[string]interface{}{ + "msg_type": "text", + "text": map[string]string{ + "content": message, + }, + "agent": map[string]interface{}{ + "id": agent.ID, + "name": agent.Name, + "hostname": agent.Hostname, + "ip": agent.IP, + }, + "alert": map[string]interface{}{ + "type": record.AlertType, + "level": record.Level, + "status": record.Status, + "message": record.Message, + "threshold": record.Threshold, + "actualValue": record.ActualValue, + "firedAt": record.FiredAt, + "resolvedAt": record.ResolvedAt, + }, + } + data, err := json.Marshal(body) + if err != nil { + return fmt.Errorf("序列化 JSON 失败: %w", err) + } + reqBody = bytes.NewReader(data) + contentType = "application/json" + + case "form": + // Form 表单格式 + formData := url.Values{} + formData.Set("message", message) + formData.Set("agent_id", agent.ID) + formData.Set("agent_name", agent.Name) + formData.Set("agent_hostname", agent.Hostname) + formData.Set("agent_ip", agent.IP) + formData.Set("alert_type", record.AlertType) + formData.Set("alert_level", record.Level) + formData.Set("alert_status", record.Status) + formData.Set("alert_message", record.Message) + formData.Set("threshold", fmt.Sprintf("%.2f", record.Threshold)) + formData.Set("actual_value", fmt.Sprintf("%.2f", record.ActualValue)) + formData.Set("fired_at", fmt.Sprintf("%d", record.FiredAt)) + if record.ResolvedAt > 0 { + formData.Set("resolved_at", fmt.Sprintf("%d", record.ResolvedAt)) + } + reqBody = strings.NewReader(formData.Encode()) + contentType = "application/x-www-form-urlencoded" + + case "custom": + // 自定义模板,支持变量替换 + customBody, ok := config["customBody"].(string) + if !ok || customBody == "" { + return fmt.Errorf("使用 custom 模板时必须提供 customBody") + } + + // 使用 fasttemplate 进行变量替换 + t := fasttemplate.New(customBody, "{{", "}}") + bodyStr := t.ExecuteFuncString(func(w io.Writer, tag string) (int, error) { + switch tag { + case "message": + return w.Write([]byte(message)) + case "agent.id": + return w.Write([]byte(agent.ID)) + case "agent.name": + return w.Write([]byte(agent.Name)) + case "agent.hostname": + return w.Write([]byte(agent.Hostname)) + case "agent.ip": + return w.Write([]byte(agent.IP)) + case "alert.type": + return w.Write([]byte(record.AlertType)) + case "alert.level": + return w.Write([]byte(record.Level)) + case "alert.status": + return w.Write([]byte(record.Status)) + case "alert.message": + return w.Write([]byte(record.Message)) + case "alert.threshold": + return w.Write([]byte(fmt.Sprintf("%.2f", record.Threshold))) + case "alert.actualValue": + return w.Write([]byte(fmt.Sprintf("%.2f", record.ActualValue))) + case "alert.firedAt": + return w.Write([]byte(fmt.Sprintf("%d", record.FiredAt))) + case "alert.resolvedAt": + return w.Write([]byte(fmt.Sprintf("%d", record.ResolvedAt))) + default: + // 未知变量保持原样 + return w.Write([]byte("{{" + tag + "}}")) + } + }) + reqBody = strings.NewReader(bodyStr) + contentType = "text/plain" + + default: + return fmt.Errorf("不支持的 bodyTemplate: %s", bodyTemplate) + } + + // 创建请求 + req, err := http.NewRequestWithContext(ctx, method, webhookURL, reqBody) + if err != nil { + return fmt.Errorf("创建请求失败: %w", err) + } + + // 设置 Content-Type + req.Header.Set("Content-Type", contentType) + + // 设置自定义请求头 + for k, v := range headers { + req.Header.Set(k, v) + } + + // 发送请求 + client := &http.Client{ + Timeout: 10 * time.Second, + } + + resp, err := client.Do(req) + if err != nil { + return fmt.Errorf("发送请求失败: %w", err) + } + defer resp.Body.Close() + + // 读取响应 + respBody, _ := io.ReadAll(resp.Body) + + if resp.StatusCode < 200 || resp.StatusCode >= 300 { + return fmt.Errorf("请求失败,状态码: %d, 响应: %s", resp.StatusCode, string(respBody)) + } + + n.logger.Info("自定义Webhook发送成功", + zap.String("url", webhookURL), + zap.String("method", method), + zap.String("response", string(respBody)), + ) + return nil } @@ -279,13 +445,8 @@ func (n *Notifier) sendFeishuByConfig(ctx context.Context, config map[string]int } // sendWebhookByConfig 根据配置发送自定义Webhook -func (n *Notifier) sendWebhookByConfig(ctx context.Context, config map[string]interface{}, message string) error { - url, ok := config["url"].(string) - if !ok || url == "" { - return fmt.Errorf("自定义Webhook配置缺少 url") - } - - return n.sendCustomWebhook(ctx, url, message) +func (n *Notifier) sendWebhookByConfig(ctx context.Context, config map[string]interface{}, agent *models.Agent, record *models.AlertRecord) error { + return n.sendCustomWebhook(ctx, config, agent, record) } // SendNotificationByConfig 根据新的配置结构发送通知 @@ -309,7 +470,7 @@ func (n *Notifier) SendNotificationByConfig(ctx context.Context, channelConfig * case "feishu": return n.sendFeishuByConfig(ctx, channelConfig.Config, message) case "webhook": - return n.sendWebhookByConfig(ctx, channelConfig.Config, message) + return n.sendWebhookByConfig(ctx, channelConfig.Config, agent, record) case "email": // TODO: 实现邮件通知 return fmt.Errorf("邮件通知暂未实现") @@ -354,7 +515,23 @@ func (n *Notifier) SendFeishuByConfig(ctx context.Context, config map[string]int return n.sendFeishuByConfig(ctx, config, message) } -// SendWebhookByConfig 导出方法供外部调用 +// SendWebhookByConfig 导出方法供外部调用(测试用) func (n *Notifier) SendWebhookByConfig(ctx context.Context, config map[string]interface{}, message string) error { - return n.sendWebhookByConfig(ctx, config, message) + // 为了测试,创建一个临时的 agent 和 record + agent := &models.Agent{ + ID: "test-agent", + Name: "测试探针", + Hostname: "test-host", + IP: "127.0.0.1", + } + record := &models.AlertRecord{ + AlertType: "test", + Level: "info", + Status: "firing", + Message: message, + Threshold: 0, + ActualValue: 0, + FiredAt: time.Now().UnixMilli(), + } + return n.sendWebhookByConfig(ctx, config, agent, record) } diff --git a/pkg/agent/updater/updater.go b/pkg/agent/updater/updater.go index 32a6b05..225779c 100644 --- a/pkg/agent/updater/updater.go +++ b/pkg/agent/updater/updater.go @@ -5,16 +5,14 @@ import ( "crypto/tls" "encoding/json" "fmt" - "io" "log" "net/http" "os" - "os/exec" - "path/filepath" "runtime" "time" "github.com/dushixiang/pika/pkg/agent/config" + "github.com/minio/selfupdate" ) // VersionInfo 版本信息 @@ -145,23 +143,6 @@ func (u *Updater) downloadAndUpdate(versionInfo *VersionInfo) error { log.Printf("📥 下载新版本: %s", versionInfo.Version) downloadURL := u.cfg.GetDownloadURL() - if err := u.updateWithClient(downloadURL); err != nil { - return err - } - - log.Printf("✅ 新版本已安装到: %s", u.executablePath) - return nil -} - -// updateWithClient 使用实例的 httpClient 下载并更新 -func (u *Updater) updateWithClient(downloadURL string) error { - execPath := u.executablePath - - // 解析实际路径(处理符号链接) - execPath, err := filepath.EvalSymlinks(execPath) - if err != nil { - return fmt.Errorf("解析可执行文件路径失败: %w", err) - } // 下载文件 resp, err := u.httpClient.Get(downloadURL) @@ -174,31 +155,18 @@ func (u *Updater) updateWithClient(downloadURL string) error { return fmt.Errorf("HTTP 状态码: %d", resp.StatusCode) } - // 创建临时文件 - tmpFile := execPath + ".new" - out, err := os.OpenFile(tmpFile, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0755) - if err != nil { - return fmt.Errorf("创建临时文件失败: %w", err) - } - defer out.Close() - defer os.Remove(tmpFile) - - // 写入文件 - written, err := io.Copy(out, resp.Body) - if err != nil { - return fmt.Errorf("写入文件失败: %w", err) + // 使用 selfupdate 应用更新 + if err := selfupdate.Apply(resp.Body, selfupdate.Options{}); err != nil { + return fmt.Errorf("应用更新失败: %w", err) } - log.Printf("下载完成,文件大小: %d 字节", written) + log.Printf("✅ 更新成功,进程即将退出,等待系统服务重启...") - // 根据操作系统选择不同的更新策略 - if runtime.GOOS == "windows" { - // Windows: 使用批处理脚本延迟替换 - return updateOnWindows(execPath, tmpFile) - } + // 退出当前进程,让系统服务管理器(systemd/supervisor等)自动重启 + // 注意:这要求服务配置了自动重启(如 systemd 的 Restart=always) + os.Exit(1) - // Unix-like: 直接替换 - return updateOnUnix(execPath, tmpFile) + return nil } // CheckUpdate 手动检查更新(用于命令行) @@ -229,17 +197,6 @@ func CheckUpdate(updateURL, currentVer string) (*VersionInfo, error) { // Update 手动更新(用于命令行) func Update(downloadURL string) error { - execPath, err := os.Executable() - if err != nil { - return fmt.Errorf("获取可执行文件路径失败: %w", err) - } - - // 解析实际路径(处理符号链接) - execPath, err = filepath.EvalSymlinks(execPath) - if err != nil { - return fmt.Errorf("解析可执行文件路径失败: %w", err) - } - client := &http.Client{ Timeout: 300 * time.Second, } @@ -255,52 +212,12 @@ func Update(downloadURL string) error { return fmt.Errorf("HTTP 状态码: %d", resp.StatusCode) } - // 创建临时文件 - tmpFile := execPath + ".new" - out, err := os.OpenFile(tmpFile, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0755) - if err != nil { - return fmt.Errorf("创建临时文件失败: %w", err) - } - defer out.Close() - defer os.Remove(tmpFile) - - // 写入文件 - written, err := io.Copy(out, resp.Body) - if err != nil { - return fmt.Errorf("写入文件失败: %w", err) + // 使用 selfupdate 应用更新 + if err := selfupdate.Apply(resp.Body, selfupdate.Options{}); err != nil { + return fmt.Errorf("应用更新失败: %w", err) } - log.Printf("下载完成,文件大小: %d 字节", written) - - // 根据操作系统选择不同的更新策略 - if runtime.GOOS == "windows" { - // Windows: 使用批处理脚本延迟替换 - return updateOnWindows(execPath, tmpFile) - } - - // Unix-like: 直接替换 - return updateOnUnix(execPath, tmpFile) -} - -// updateOnUnix Unix-like 系统的更新逻辑 -func updateOnUnix(execPath, tmpFile string) error { - // 备份旧版本 - backupPath := execPath + ".bak" - if err := os.Rename(execPath, backupPath); err != nil { - return fmt.Errorf("备份旧版本失败: %w", err) - } - - // 替换为新版本 - if err := os.Rename(tmpFile, execPath); err != nil { - // 恢复备份 - os.Rename(backupPath, execPath) - return fmt.Errorf("替换新版本失败: %w", err) - } - - // 删除备份 - os.Remove(backupPath) - - log.Println("✅ 更新完成,进程即将退出,等待系统服务重启...") + log.Printf("✅ 更新成功,进程即将退出,等待系统服务重启...") // 退出当前进程,让系统服务管理器(systemd/supervisor等)自动重启 // 注意:这要求服务配置了自动重启(如 systemd 的 Restart=always) @@ -308,42 +225,3 @@ func updateOnUnix(execPath, tmpFile string) error { return nil } - -// updateOnWindows Windows 系统的更新逻辑 -func updateOnWindows(execPath, tmpFile string) error { - // 在 Windows 上,无法直接替换正在运行的可执行文件 - // 策略: 创建一个批处理脚本来延迟替换和重启 - - batScript := execPath + ".update.bat" - batContent := fmt.Sprintf(`@echo off -timeout /t 2 /nobreak >nul -move /y "%s" "%s.bak" -move /y "%s" "%s" -del "%s.bak" -start "" "%s" -del "%%~f0" -`, execPath, execPath, tmpFile, execPath, execPath, execPath) - - if err := os.WriteFile(batScript, []byte(batContent), 0755); err != nil { - return fmt.Errorf("创建更新脚本失败: %w", err) - } - - log.Println("✅ 更新完成,准备重启进程...") - - // 启动批处理脚本并退出当前进程 - cmd := exec.Command("cmd.exe", "/C", batScript) - cmd.Stdout = nil - cmd.Stderr = nil - cmd.Stdin = nil - - if err := cmd.Start(); err != nil { - os.Remove(batScript) - return fmt.Errorf("启动更新脚本失败: %w", err) - } - - // 让系统服务管理器来重启(当前进程退出后) - log.Println("进程即将退出,等待系统服务重启...") - os.Exit(0) - - return nil -} diff --git a/web/src/components/PublicFooter.tsx b/web/src/components/PublicFooter.tsx index f57932b..64da96f 100644 --- a/web/src/components/PublicFooter.tsx +++ b/web/src/components/PublicFooter.tsx @@ -5,12 +5,12 @@ const PublicFooter = () => { const icpCode = window.SystemConfig?.ICPCode || ''; return ( -