19.6.7 日志安全、脱敏与访问控制
日志安全遵循“最小可见、最小暴露、最小权限”,覆盖采集端、传输链路、存储与查询全链路。优先在采集或解析阶段“前置脱敏”,避免敏感信息进入下游;必须保留的取证字段采用可逆加密与审批访问的“双轨模式”。访问控制采用 RBAC/ABAC 结合索引/字段级权限与强认证,所有查询、导出与规则变更必须审计留痕。
采集端最小暴露与文件权限#
示例:限制日志目录权限、专用采集账户、只读挂载
# 1) 创建采集账户
sudo useradd -r -s /sbin/nologin logagent
# 2) 限制日志目录权限(仅root写,logagent只读)
sudo chown -R root:adm /var/log/app
sudo chmod -R 750 /var/log/app
sudo setfacl -m u:logagent:rx /var/log/app
# 3) 容器环境只读挂载
# docker run -v /var/log/app:/logs:ro ...
排错提示
- 采集无数据:检查 ACL 是否允许 logagent 读取
getfacl /var/log/app
- 采集权限错误:确认日志轮转后 ACL 是否继承
logrotate 配置中加 create 0640 root adm 与 su root adm
传输链路 TLS/mTLS 与证书轮换#
示例:基于 OpenSSL 生成 CA/证书并启用 mTLS(以 Filebeat 输出为例)
# 1) 生成 CA
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -key ca.key -days 3650 -subj "/CN=log-ca" -out ca.crt
# 2) 生成客户端证书
openssl genrsa -out client.key 2048
openssl req -new -key client.key -subj "/CN=log-agent" -out client.csr
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 365
# 3) 生成服务端证书
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=log-gateway" -out server.csr
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365
Filebeat 输出配置示例(/etc/filebeat/filebeat.yml)
output.logstash:
hosts: ["log-gateway:5044"]
ssl.certificate_authorities: ["/etc/filebeat/ca.crt"]
ssl.certificate: "/etc/filebeat/client.crt"
ssl.key: "/etc/filebeat/client.key"
ssl.verification_mode: full
排错提示
- 握手失败:检查证书 CN/SAN 与主机名一致
- 证书过期:通过 openssl x509 -in client.crt -noout -dates 检查
前置脱敏与规则化管理#
示例:使用 Logstash 进行正则脱敏(手机号/身份证/Token)
# /etc/logstash/conf.d/10-mask.conf
filter {
mutate {
gsub => [
"message", "(1[3-9][0-9])([0-9]{4})([0-9]{4})", "\\1****\\3",
"message", "([0-9]{6})([0-9]{8})([0-9]{4})", "\\1********\\3",
"message", "(Bearer\\s+)[A-Za-z0-9\\-_=\\.]+", "\\1***"
]
}
}
规则发布与回滚
# 规则版本化与灰度:使用软链接切换版本
ls -l /etc/logstash/conf.d
# 10-mask.conf -> 10-mask.v2.conf
sudo ln -sfn /etc/logstash/conf.d/10-mask.v1.conf /etc/logstash/conf.d/10-mask.conf
sudo systemctl reload logstash
排错提示
- 误脱敏:用样例日志回放验证
cat sample.log | /usr/share/logstash/bin/logstash -f 10-mask.conf -t
存储侧静态加密与高敏隔离#
示例:Linux LUKS 加密日志盘
# 1) 初始化加密盘
sudo cryptsetup luksFormat /dev/sdb
sudo cryptsetup open /dev/sdb logdata
# 2) 创建文件系统并挂载
sudo mkfs.xfs /dev/mapper/logdata
sudo mkdir -p /data/logs
sudo mount /dev/mapper/logdata /data/logs
# 3) /etc/crypttab 与 /etc/fstab 持久化
echo "logdata /dev/sdb none luks" | sudo tee -a /etc/crypttab
echo "/dev/mapper/logdata /data/logs xfs defaults 0 0" | sudo tee -a /etc/fstab
高敏日志隔离建议
- 高敏索引独立存储与独立访问策略
- 生命周期更短,删除需双人审批与操作留痕
访问控制、审计与导出审批#
示例:最小权限访问与导出审批流程
# 示例:将只读角色绑定索引前缀(伪命令,按具体日志平台实现)
# role: log_readonly -> index: app-*-prod, actions: read, view
# 导出审批流程(示例)
1) 用户提交导出申请(时间窗<=7天)
2) 负责人审批 -> 安全审批
3) 导出文件加密+水印+有效期
审计日志应覆盖
- 查询、导出、规则变更、权限变更、失败登录与越权尝试
常见故障排查清单#
- 采集无数据:权限/ACL、日志路径、轮转后权限
- TLS 连接失败:证书链不完整、CN/SAN 不匹配、时间漂移
- 脱敏无效:规则未加载、正则不匹配、字段名错误
- 索引访问被拒:角色未授权、索引别名未关联
练习#
- 为
/var/log/app配置最小可见权限,并验证logagent仅可读。 - 用 OpenSSL 生成 CA 与客户端证书,验证 mTLS 连接成功。
- 编写脱敏规则:手机号与邮箱脱敏,使用样例日志验证。
- 模拟高敏索引隔离:创建两个索引规则与两个角色,验证权限边界。