在 CentOS 中对 Golang 应用进行日志审计的完整方案
一、总体思路与分层
二、应用层 Golang 日志规范与示例
package main
import (
"github.com/sirupsen/logrus"
"gopkg.in/natefinch/lumberjack.v2"
"os"
)
func main() {
log := logrus.New()
log.SetFormatter(&logrus.JSONFormatter{})
log.SetLevel(logrus.InfoLevel)
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 100, // MB
MaxBackups: 30,
MaxAge: 90, // days
Compress: true,
})
log.WithFields(logrus.Fields{
"user_id": "u1001",
"action": "login",
"ip": "192.168.1.10",
"method": "POST",
"path": "/api/v1/login",
"status": 200,
}).Info("user login")
}
三、系统层 Linux 审计 auditd 配置
sudo yum -y install audit auditd-libs
sudo systemctl enable --now auditd
sudo auditctl -lsudo autrace -r /path/to/your/appsudo ausearch -i -p <PID>sudo aureport -lsudo tee /etc/audit/rules.d/99-golang-audit.rules >/dev/null <<'EOF'
-a always,exit -F path=/usr/local/bin/myapp -F perm=x -k myapp_exec
-a always,exit -F dir=/var/log/myapp/ -F perm=rwa -k myapp_log
-a always,exit -F path=/etc/myapp/ -F perm=rwa -k myapp_conf
-w /var/lib/myapp/ -p wa -k myapp_data
EOF
sudo augenrules --load
sudo systemctl restart auditd
四、日志收集传输与集中分析
input {
file {
path => "/var/log/myapp/app.log"
start_position => "beginning"
sincedb_path => "/var/lib/logstash/sincedb_myapp"
codec => json
}
}
filter {
date {
match => [ "ts", "ISO8601" ]
target => "@timestamp"
}
}
output {
elasticsearch {
hosts => ["http://es:9200"]
index => "myapp-audit-%{+YYYY.MM.dd}"
}
}
五、运行维护与合规要点