当前位置:首页>Linux>Linux 服务安全加固与权限管理:SELinux、AppArmor、Capabilities 及最小权限原则

Linux 服务安全加固与权限管理:SELinux、AppArmor、Capabilities 及最小权限原则

  • 2026-10-11 07:32:04
Linux 服务安全加固与权限管理:SELinux、AppArmor、Capabilities 及最小权限原则

Linux 服务安全加固与权限管理:SELinux、AppArmor、Capabilities 及最小权限原则

一、安全加固核心原则与威胁模型

最小权限原则(Principle of Least Privilege):

  • 服务只拥有完成工作必需的权限。
  • 拒绝默认开放,明确允许必要操作。

常见威胁模型:

  • 进程提权(Root 服务被利用)
  • 文件越权访问
  • 内核漏洞利用(Dirty COW、Dirty Pipe 等)
  • 容器逃逸
  • 日志/配置泄露

Systemd 原生安全支持: Systemd 提供了丰富的安全指令,能在单元文件中直接实现沙箱化运行。

二、SELinux 深度运维实战

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. 重要服务策略配置

  • Nginx:
setsebool -P httpd_can_network_connect 1
setsebool -P httpd_execmem 1
  • MySQL:
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 深度配置(Ubuntu/Debian 主流)

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 对比选择:

  • RHEL 系 → 优先 SELinux
  • Ubuntu/Debian → 优先 AppArmor
  • 高安全环境 → 两者叠加使用

四、Linux Capabilities 能力边界控制

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。

五、Systemd 单元文件安全强化选项

在 .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

  • [ ] 使用专用低权限用户运行
  • [ ] 启用 SELinux/AppArmor
  • [ ] 配置 Systemd 安全选项
  • [ ] 最小 Capabilities
  • [ ] 关闭不必要端口(ss -tuln)
  • [ ] 文件权限 644/755
  • [ ] 定期 lynis 审计
  • [ ] 启用 fail2ban + 防火墙

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. 容器化服务安全

  • Podman > Docker(rootless 模式)
  • SELinux 类型 spc_t 或 container_t
  • seccomp 配置文件限制系统调用

七、常见安全故障与攻防案例

案例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 限制日志目录访问。

最新文章

随机文章