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
最佳实践
- 不需要同时使用两者:选择发行版默认的 MAC 系统即可
- 从宽松模式开始:先用 complain/ permissive 模式分析应用行为
- 逐步收紧:确定必要操作后再切换到 enforce 模式
- 保留默认 Docker 配置:Docker 的默认 AppArmor/SELinux 配置已足够
- 配合其他安全机制:Capabilities + Seccomp + MAC 多层防御
- 生产环境保持启用:不要禁用 MAC 系统
AppArmor 和 SELinux 提供了传统 DAC 权限之外的深层防御,是生产环境容器安全的重要保障。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END


暂无评论内容