系统服务运行安全审计的核心是将权限控制、执行环境隔离和行为可追溯嵌入服务启动全流程,确保服务“只做该做的事,只读该读的文件,只连该连的地址”,并实时捕获越权行为。

系统服务运行安全审计的核心,不是事后查日志,而是把权限控制、执行环境隔离和行为可追溯嵌入到服务启动的每一环。关键在于让服务“只做该做的事,只读该读的文件,只连该连的地址”,并确保任何越权尝试都被实时捕获。
一、服务运行身份必须最小化
绝不能让业务服务以 root 身份运行。每个服务应使用专属低权限用户,且该用户仅拥有执行所需二进制、读取配置、写入日志的最小路径权限:
- 创建专用系统用户(如 nginx-svc、redis-svc),禁用登录 shell(/sbin/nologin)
- 修改服务单元文件(.service),强制指定 User= 和 Group=,例如:
User=nginx-svc
Group=nginx-svc - 检查服务工作目录、配置文件、日志路径的属主与权限,确保非所属用户不可写(如 /etc/nginx/ 应为 root:nginx-svc,权限 750)
二、启用 SELinux 或 AppArmor 强制上下文约束
仅靠 Linux DAC(自主访问控制)无法阻止提权后的行为扩散,必须启用 MAC(强制访问控制)机制,为每个服务定义明确的策略边界:
- 确认 SELinux 处于 enforcing 模式:getenforce 返回 Enforcing;若未启用,编辑 /etc/selinux/config 设置 SELINUX=enforcing
- 为自定义服务生成并加载策略模块:使用 audit2allow -a -M myapp 从 audit 日志中提取合法行为,再 semodule -i myapp.pp 加载
- 对已知服务(如 httpd、sshd)启用标准策略,并用 sestatus -b 验证布尔值开关(如 httpd_can_network_connect_db 仅在真需连数据库时开启)
三、限制服务资源与能力,切断横向移动路径
即使服务进程被劫持,也要让它无法执行敏感操作或逃逸出受限环境:
- 在 systemd 单元中配置 CapabilityBoundingSet=,移除不必要的 capabilities,例如禁止 CAP_SYS_ADMIN、CAP_NET_RAW
- 设置 NoNewPrivileges=true,阻止通过 execve 提权(如 setuid 程序失效)
- 启用 RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6,禁用 AF_PACKET 等原始套接字,防抓包与伪造协议
- 挂载只读文件系统:ProtectSystem=strict + ProtectHome=read-only,防止篡改系统配置或窃取用户数据
四、审计所有服务生命周期事件
监控服务本身是否被异常启停、重载或替换,是发现入侵的第一道哨兵:
- 用 auditctl 监控 systemd 目录与关键二进制:
auditctl -w /usr/lib/systemd/system/ -p wa -k systemd_units
auditctl -w /usr/bin/systemctl -p x -k systemctl_exec - 启用 journald 的持久日志,并配置 MaxRetentionSec=3month,确保服务启动参数、失败原因、环境变量变更可回溯
- 编写脚本定期比对 systemctl show --property=ExecStart,User,Environment 输出哈希值,一旦变化立即告警

















