在 Debian 上运行的 Go 程序,日志“加密”通常分几种场景。下面按常见做法 + 示例给你几种可行方案,你可以按需求选。
在 Go 里写日志前就加密,日志文件里全是密文。
适合:日志文件落到磁盘前就加密
package main
import (
"crypto/aes"
"crypto/cipher"
"crypto/rand"
"encoding/base64"
"io"
"log"
"os"
)
func encrypt(key []byte, text string) (string, error) {
block, _ := aes.NewCipher(key)
gcm, _ := cipher.NewGCM(block)
nonce := make([]byte, gcm.NonceSize())
io.ReadFull(rand.Reader, nonce)
cipherText := gcm.Seal(nonce, nonce, []byte(text), nil)
return base64.StdEncoding.EncodeToString(cipherText), nil
}
func main() {
key := []byte("32-byte-key-for-aes-256-encryption")
msg, _ := encrypt(key, "user login success")
f, _ := os.OpenFile("/var/log/app.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0600)
log.SetOutput(f)
log.Println(msg)
}
✅ 优点:
❌ 缺点:
适合:不想改业务代码
io.Writertype EncWriter struct {
w io.Writer
key []byte
}
func (e *EncWriter) Write(p []byte) (int, error) {
enc, _ := encrypt(e.key, string(p))
return e.w.Write([]byte(enc + "\n"))
}
然后:
log.SetOutput(&EncWriter{w: os.Stdout, key: key})
日志照常写,Debian 帮你加密
cryptsetup luksFormat /dev/sdb1
cryptsetup open /dev/sdb1 logenc
mkfs.ext4 /dev/mapper/logenc
mount /dev/mapper/logenc /var/log
✅ 优点:
❌ 缺点:
apt install ecryptfs-utils
mount -t ecryptfs /var/log/app /var/log/app
适合:日志发到 ELK / Loki / 远端
| 场景 | 推荐方案 |
|---|---|
| 防止磁盘泄漏 | LUKS |
| 防止日志被读 | AES 应用层 |
| 防止传输泄露 | TLS |
| 合规(等保/GDPR) | 应用层 + TLS |
EnvironmentFile如果你能说清楚:
我可以直接给你一套可落地的配置方案。