AppArmor 和 SELinux

AppArmor 和 SELinux

什么是强制访问控制

AppArmor 和 SELinux 都是 Linux 的强制访问控制(MAC,Mandatory Access Control)机制。相比传统的自主访问控制(DAC,读/写/执行权限),MAC 提供了更精细的安全策略——即使进程以 root 运行,也会受到 MAC 策略的限制。

AppArmor

AppArmor(Application Armor)是基于路径的访问控制系统,使用程序路径名来限制程序行为。

AppArmor 配置文件

# 查看 AppArmor 状态
sudo aa-status

# 查看已加载的 AppArmor 配置文件
sudo apparmor_status

Docker 默认的 AppArmor 策略

Docker 自动为容器加载 docker-default 配置文件:

# 检查 Docker 默认 AppArmor 配置
docker inspect container_name | grep -A2 AppArmor
# "AppArmorProfile": "docker-default"

自定义 AppArmor 配置

# 1. 创建配置文件 /etc/apparmor.d/docker-nginx
#include 

profile docker-nginx flags=(attach_disconnected,mediate_deleted) {
  #include 

  # 网络访问
  network tcp,
  network udp,

  # 文件访问
  /var/log/nginx/** rw,
  /etc/nginx/** r,
  /usr/share/nginx/** r,

  # 禁止的操作
  deny /proc/** w,
  deny /sys/** w,
}

# 2. 加载配置
sudo apparmor_parser -r -W /etc/apparmor.d/docker-nginx

# 3. 使用自定义策略
docker run --security-opt apparmor=docker-nginx nginx

# 4. 禁用 AppArmor
docker run --security-opt apparmor=unconfined nginx

AppArmor 策略示例

# 限制文件访问
deny /etc/shadow r,
deny /root/** rw,
deny /proc/sysrq-trigger w,

# 只允许读
/var/www/** r,
/etc/nginx/** r,

# 允许写日志
/var/log/nginx/*.log rw,

SELinux

SELinux(Security-Enhanced Linux)是基于标签的强制访问控制系统,由 NSA 开发。它使用安全上下文(Security Context)控制所有访问。

SELinux 安全上下文

# 查看文件的安全上下文
ls -Z
# system_u:object_r:container_file_t:s0  file.txt

# 查看进程的安全上下文
ps -eZ
# system_u:system_r:container_t:s0:c1  pid  cmd

安全上下文格式:user:role:type:sensitivity[:categories]

Docker 与 SELinux

# 启用 SELinux 标签
docker run --security-opt label=type:container_t nginx

# 启用 SELinux 级别
docker run --security-opt label=level:s0:c100,c200 nginx

# 禁用 SELinux 隔离
docker run --security-opt label=disable nginx

# 使用 SELinux 挂载标签
docker run -v /data:/data:Z nginx    # Z = 共享标签
docker run -v /data:/data:z nginx    # z = 私有标签

SELinux Booleans

# 查看容器相关的 SELinux 设置
getsebool -a | grep container
# container_connect_any --> off
# container_use_cephfs --> off

# 允许容器连接任意端口
sudo setsebool container_connect_any on

AppArmor vs SELinux

特性 AppArmor SELinux
控制方式 基于路径 基于标签
配置难度 较简单 较复杂
文件系统 需要支持 xattr 需要文件系统标签
性能影响 较小 略大
默认使用 Ubuntu, Debian, SUSE RHEL, CentOS, Fedora
策略语言 简单易读 复杂强大
Root 用户 受限制 受限制

Docker Compose 中的配置

services:
  app:
    image: myapp
    security_opt:
      # AppArmor
      - apparmor=my-custom-profile
      - apparmor=unconfined

      # SELinux
      - label=type:container_t
      - label=level:s0:c100
      - label=disable

    # SELinux 挂载标签
    volumes:
      - /host/data:/data:Z   # 共享标签
      - /host/cache:/cache:z # 私有标签

创建安全策略的流程

AppArmor

# 1. 分析应用行为
sudo aa-genprof /usr/bin/nginx

# 2. 生成基础配置
sudo aa-autodep nginx

# 3. 加载配置
sudo apparmor_parser -r /etc/apparmor.d/usr.bin.nginx

# 4. 设置为强制模式
sudo aa-enforce /usr/bin/nginx

SELinux

# 1. 创建自定义模块
sepolicy generate --init /path/to/app

# 2. 编译模块
make -f /usr/share/selinux/devel/Makefile myapp.pp

# 3. 安装模块
semodule -i myapp.pp

# 4. 设置上下文
semanage fcontext -a -t myapp_t /path/to/app(/.*)?
restorecon -Rv /path/to/app

调试和日志

# AppArmor 日志
sudo journalctl -f | grep apparmor

# SELinux 日志
sudo ausearch -m avc -ts recent
sudo sealert -a /var/log/audit/audit.log

# 临时允许所有 SELinux
sudo setenforce 0   # Permissive 模式
sudo setenforce 1   # Enforcing 模式

# 永久关闭 SELinux(不推荐)
# 编辑 /etc/selinux/config
# SELINUX=disabled

最佳实践

  1. 不需要同时使用两者:选择发行版默认的 MAC 系统即可
  2. 从宽松模式开始:先用 complain/ permissive 模式分析应用行为
  3. 逐步收紧:确定必要操作后再切换到 enforce 模式
  4. 保留默认 Docker 配置:Docker 的默认 AppArmor/SELinux 配置已足够
  5. 配合其他安全机制:Capabilities + Seccomp + MAC 多层防御
  6. 生产环境保持启用:不要禁用 MAC 系统

AppArmor 和 SELinux 提供了传统 DAC 权限之外的深层防御,是生产环境容器安全的重要保障。

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容