522 字
3 分钟
apparmor
AppArmor (Application Armor) 是 Linux 系统的强制访问控制 (MAC) 框架,通过路径名控制程序访问资源。相比 SELinux,AppArmor 配置更简单直观。
基本概念
AppArmor 有三种模式:
- enforce:强制执行策略,违规操作被阻止
- complain:仅记录违规,不阻止操作
- unconfined:不受 AppArmor 控制
基本命令
查看状态:
sudo aa-status
apparmor_status
查看配置文件状态:
sudo aa-status --pretty
模式切换:
# 切换到 complain 模式
sudo aa-complain /path/to/profile
# 切换到 enforce 模式
sudo aa-enforce /path/to/profile
# 禁用配置文件
sudo aa-disable /path/to/profile
配置文件结构
配置文件位于 /etc/apparmor.d/
,基本语法:
#include <tunables/global>
/usr/bin/program {
#include <abstractions/base>
# 文件访问权限
/etc/passwd r, # 只读
/tmp/** rw, # 读写
/usr/bin/other-program Px, # 执行并切换配置文件
# 网络权限
network inet tcp,
network inet udp,
# 能力权限
capability setuid,
capability net_bind_service,
# 信号权限
signal send set=(term) peer=/usr/bin/target,
}
权限类型
文件权限:
r
- 读取w
- 写入x
- 执行m
- 内存映射k
- 文件锁定l
- 创建硬链接
执行权限:
ix
- 继承当前配置文件执行Px
- 切换到目标程序配置文件Cx
- 切换到子配置文件Ux
- 不受限制执行
实用配置示例
Web服务器配置:
/usr/sbin/nginx {
#include <abstractions/apache2-common>
capability setuid,
capability setgid,
capability net_bind_service,
/var/log/nginx/** w,
/var/www/** r,
/run/nginx.pid w,
network inet tcp,
network inet6 tcp,
}
开发和调试
生成配置文件:
# 自动生成基础配置文件
sudo aa-genprof /usr/bin/program
# 更新现有配置文件
sudo aa-logprof
查看日志:
# 查看违规日志
sudo dmesg | grep apparmor
journalctl | grep apparmor
# 查看详细日志
sudo aa-notify -p
调试模式:
# 设为 complain 模式进行测试
sudo aa-complain /usr/bin/program
# 执行程序触发访问
# 检查日志并更新配置文件
sudo aa-logprof
# 确认无误后切换到 enforce 模式
sudo aa-enforce /usr/bin/program
管理技巧
批量操作:
# 重新加载所有配置文件
sudo systemctl reload apparmor
# 重新加载特定配置文件
sudo apparmor_parser -r /etc/apparmor.d/usr.bin.program
实用abstractions:
<abstractions/base>
- 基础系统访问<abstractions/nameservice>
- DNS解析<abstractions/ssl_certs>
- SSL证书访问<abstractions/user-tmp>
- 用户临时文件