利用 Golang 日志提升 CentOS 系统安全性的落地方案
一 安全设计原则
二 系统与服务侧加固
三 Golang 代码与配置要点
四 监控告警与审计闭环
五 最小可行落地清单与示例
快速清单
useradd -r -s /sbin/nologin myapp;mkdir -p /var/log/myapp && chown root:myapp /var/log/myapp && chmod 750 /var/log/myappUser=myapp、Group=myapp0640 myapp myapp,目录 0750 root myapp/var/log/myapp,配置 logrotate 按日轮转、压缩与保留策略示例一 安全写入与权限控制(Golang)
package main
import (
"log"
"os"
"syscall"
)
func main() {
// 目录:root:myapp 750
if err := os.MkdirAll("/var/log/myapp", 0750); err != nil {
log.Fatalf("mkdir: %v", err)
}
// 文件:myapp:myapp 640
f, err := os.OpenFile("/var/log/myapp/app.log",
os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0640)
if err != nil {
log.Fatalf("open: %v", err)
}
defer f.Close()
log.SetOutput(f)
log.Println("secure log init ok")
}
package main
import (
"log"
"log/syslog"
)
func main() {
// 将日志写入 syslog(标识 myapp,包含 PID)
s, err := syslog.New(syslog.LOG_INFO|syslog.LOG_PID, "myapp")
if err != nil {
log.Fatalf("syslog: %v", err)
}
defer s.Close()
log.SetOutput(s)
log.Println("app started")
}
package main
import (
"crypto/aes"
"crypto/cipher"
"crypto/rand"
"io"
"os"
)
func encryptFile(inPath, outPath string, key []byte) error {
in, err := os.Open(inPath)
if err != nil { return err }
defer in.Close()
out, err := os.Create(outPath)
if err != nil { return err }
defer out.Close()
block, err := aes.NewCipher(key)
if err != nil { return err }
iv := make([]byte, aes.BlockSize)
if _, err := io.ReadFull(rand.Reader, iv); err != nil {
return err
}
if _, err := out.Write(iv); err != nil {
return err
}
stream := cipher.NewCFBEncrypter(block, iv)
buf := make([]byte, 4096)
for {
n, err := in.Read(buf)
if n > 0 {
c := make([]byte, n)
stream.XORKeyStream(c, buf[:n])
if _, werr := out.Write(c); werr != nil {
return werr
}
}
if err == io.EOF { break }
if err != nil { return err }
}
return nil
}
func main() {
// 16/24/32 字节密钥
key := []byte("thisis32bitlongpassphrase!")
if err := encryptFile("/var/log/myapp/app.log", "/var/log/myapp/app.log.enc", key); err != nil {
panic(err)
}
}
提示:生产环境请将密钥托管在 KMS/Vault,并通过最小权限与审计策略保护密钥生命周期。