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 admsu 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) 导出文件加密+水印+有效期

审计日志应覆盖
- 查询、导出、规则变更、权限变更、失败登录与越权尝试

常见故障排查清单#

  1. 采集无数据:权限/ACL、日志路径、轮转后权限
  2. TLS 连接失败:证书链不完整、CN/SAN 不匹配、时间漂移
  3. 脱敏无效:规则未加载、正则不匹配、字段名错误
  4. 索引访问被拒:角色未授权、索引别名未关联

练习#

  1. /var/log/app 配置最小可见权限,并验证 logagent 仅可读。
  2. 用 OpenSSL 生成 CA 与客户端证书,验证 mTLS 连接成功。
  3. 编写脱敏规则:手机号与邮箱脱敏,使用样例日志验证。
  4. 模拟高敏索引隔离:创建两个索引规则与两个角色,验证权限边界。