最小权限原则(Principle of Least Privilege):
常见威胁模型:
Systemd 原生安全支持: Systemd 提供了丰富的安全指令,能在单元文件中直接实现沙箱化运行。
SELinux(Security-Enhanced Linux)是 NSA 开发的强制访问控制(MAC)系统,CentOS/RHEL/Rocky Linux/AlmaLinux 默认启用。
1. 基础状态检查与模式切换
sestatus
getenforce # Enforcing / Permissive / Disabled
# 临时切换
setenforce 0 # 宽松模式(排查用)
setenforce 1 # 强制模式
# 永久修改
vim /etc/selinux/config
SELINUX=enforcing
SELINUXTYPE=targeted
2. 常见服务 SELinux 上下文管理
# 查看文件上下文
ls -Z /var/www/html/
ls -Z /etc/nginx/nginx.conf
# 恢复默认上下文
restorecon -Rv /var/log/nginx/
restorecon -Rv /var/www/
# 修改端口上下文(Nginx 使用 8080)
semanage port -a -t http_port_t -p tcp 8080
3. 重要服务策略配置
setsebool -P httpd_can_network_connect 1
setsebool -P httpd_execmem 1
semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?"
restorecon -Rv /data/mysql
audit2allow 生成策略:# 捕捉拒绝日志
ausearch -m avc -ts recent -c nginx | audit2allow -M mynginx
semodule -i mynginx.pp
4. 生产 SELinux 最佳实践
enforcing 模式。sealert -a /var/log/audit/audit.log 分析告警。targeted 策略(平衡安全与兼容性)。container-selinux 策略。AppArmor 是路径-based 的 MAC 系统,配置更直观。
1. 安装与状态
apt install apparmor apparmor-utils -y
aa-status
aa-enforce /etc/apparmor.d/*
2. Nginx AppArmor Profile 示例 文件:/etc/apparmor.d/usr.sbin.nginx
#include <tunables/global>
profile nginx /usr/sbin/nginx flags=(attach_disconnected) {
#include <abstractions/base>
#include <abstractions/nameservice>
capability net_bind_service,
capability setgid,
capability setuid,
network tcp,
/etc/nginx/** r,
/var/log/nginx/** rw,
/var/cache/nginx/** rw,
/usr/share/nginx/** r,
/tmp/** rw,
}
3. 操作命令
aa-complain /etc/apparmor.d/usr.sbin.nginx # 投诉模式(记录不阻挡)
aa-enforce /etc/apparmor.d/usr.sbin.nginx # 强制模式
apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx # 重新加载
4. 与 SELinux 对比选择:
Capabilities 将 root 权限拆分为 40+ 项细粒度能力,避免全 root 运行。
1. 常用 Capabilities
CAP_NET_BIND_SERVICE:绑定 1024 以下端口CAP_SYS_ADMIN:系统管理(谨慎授予)CAP_DAC_OVERRIDE:绕过权限检查CAP_CHOWN、CAP_FOWNER 等2. 在 Systemd 中配置
[Service]
CapabilityBoundingSet=CAP_NET_BIND_SERVICE CAP_SETUID CAP_SETGID
AmbientCapabilities=CAP_NET_BIND_SERVICE
SecureBits=keep-caps
NoNewPrivileges=true # 强烈推荐
3. 命令行查看与设置
getcap /usr/sbin/nginx
setcap'cap_net_bind_service+ep' /usr/sbin/nginx
# 查看进程 capabilities
cat /proc/$(pidof nginx)/status | grep Cap
生产建议:Nginx、Redis 等服务仅授予必要 Capabilities,禁止 CAP_SYS_ADMIN。
在 .service 文件中添加以下安全指令(强烈推荐):
[Service]
# 基础隔离
PrivateTmp=true
PrivateDevices=true
ProtectSystem=strict
ProtectHome=read-only
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectControlGroups=true
# 权限控制
User=nginx
Group=nginx
NoNewPrivileges=true
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
RestrictAddressFamilies=AF_INET AF_INET6
RestrictNamespaces=true
LockPersonality=true
MemoryDenyWriteExecute=true
# 系统调用过滤(最强沙箱)
SystemCallFilter=@system-service
SystemCallErrorNumber=EPERM
安全评分检查:
systemd-analyze security nginx.service
目标:分数越高越安全(满分 10.0)。
1. 新服务上线加固 Checklist
ss -tuln)lynis 审计2. 自动化加固脚本示例
#!/bin/bash
# harden_service.sh
SERVICE=$1
cat > /etc/systemd/system/${SERVICE}.service.d/security.conf << EOF
[Service]
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=strict
SystemCallFilter=@system-service
EOF
systemctl daemon-reload
systemctl restart ${SERVICE}
3. 容器化服务安全
spc_t 或 container_t案例1:Nginx 被利用提权 症状:攻击者通过配置错误获取 root shell。 根因:Nginx 以 root 运行 + 插件漏洞。 解决:专用用户 + NoNewPrivileges=true + Capabilities 限制。
案例2:SELinux 导致服务启动失败 症状:Permission denied 但文件权限正确。 排查:
ausearch -m avc -ts recent
journalctl -u nginx -xe
setenforce 0 # 测试后恢复
案例3:Capabilities 配置错误导致端口绑定失败 解决:授予 CAP_NET_BIND_SERVICE 并使用 AmbientCapabilities。
案例4:Dirty Pipe 漏洞利用 防御:保持内核更新 + 限制 CAP_DAC_READ_SEARCH。
案例5:日志泄露敏感信息 解决:rsyslog + Logstash 脱敏过滤 + AppArmor 限制日志目录访问。