SELinux/AppArmor 强制访问控制
SELinux 与 AppArmor: enforcing/permissive 模式管理、布尔值与策略查看、自定义规则与审计日志排查
SELinux 状态管理
基本写法:查看 SELinux 状态
getenforce
# 查看 SELinux 当前模式
getenforce
基本写法:查看详细状态
sestatus
# 查看 SELinux 详细状态与策略版本
sestatus
基本写法:临时设置为 Enforcing
setenforce 1
# 临时启用强制模式(重启失效)
sudo setenforce 1
基本写法:临时设置为 Permissive
setenforce 0
# 临时设为宽容模式(仅记录不拦截)
sudo setenforce 0
基本写法:永久修改模式
sed -i 's/SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config
# 永久设置为强制模式(需重启生效)
sudo sed -i 's/SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config
SELinux 上下文管理
基本写法:查看文件上下文
ls -Z <文件>
# 查看文件的安全上下文
ls -Z /var/www/html/
基本写法:查看进程上下文
ps -eZ | grep <进程名>
# 查看进程的安全上下文
ps -eZ | grep nginx
基本写法:修改文件上下文
chcon -t <类型> <文件>
# 修改文件安全上下文类型
sudo chcon -t httpd_sys_content_t /var/www/html/index.html
基本写法:递归修改上下文
chcon -R -t <类型> <目录>
# 递归修改目录下所有文件上下文
sudo chcon -R -t httpd_sys_content_t /var/www/html/
基本写法:恢复默认上下文
restorecon -Rv <目录>
# 恢复文件到策略定义的默认上下文
sudo restorecon -Rv /var/www/html/
SELinux 策略管理
基本写法:查看策略包
semodule -l
# 列出所有已安装的策略模块
sudo semodule -l
基本写法:安装策略模块
semodule -i <模块文件>
# 安装编译好的策略模块
sudo semodule -i mypolicy.pp
基本写法:移除策略模块
semodule -r <模块名>
# 移除已安装的策略模块
sudo semodule -r mypolicy
基本写法:查看布尔值
getsebool -a
# 列出所有布尔值开关
getsebool -a
基本写法:设置布尔值
setsebool -P <布尔值> <on|off>
# 永久启用 HTTPD 网络连接(需 -P 持久化)
sudo setsebool -P httpd_can_network_connect on
SELinux 策略生成
基本写法:生成策略模板
sepolgen <程序路径>
# 为程序生成 SELinux 策略模板
sepolgen /usr/local/bin/myapp
基本写法:使用 audit2allow 生成策略
audit2allow -a -m <模块名> -o <文件>
# 从审计日志生成允许规则策略
sudo audit2allow -a -m myapp -o myapp.te
基本写法:编译策略模块
checkmodule -M -m -o <模块名>.mod <模块名>.te
# 编译 TE 文件为模块
checkmodule -M -m -o myapp.mod myapp.te
基本写法:打包策略模块
semodule_package -o <模块名>.pp -m <模块名>.mod
# 打包模块为可安装的 pp 文件
semodule_package -o myapp.pp -m myapp.mod
基本写法:一键生成并安装
audit2allow -a -M <模块名> && semodule -i <模块名>.pp
# 从审计日志一键生成并安装策略
sudo audit2allow -a -M myapp && sudo semodule -i myapp.pp
SELinux 故障排查
基本写法:查看 AVC 拒绝日志
ausearch -m avc -ts recent
# 查看最近的 SELinux AVC 拒绝记录
sudo ausearch -m avc -ts recent
基本写法:实时监控 AVC 日志
tail -f /var/log/audit/audit.log | grep AVC
# 实时监控 SELinux 拒绝事件
sudo tail -f /var/log/audit/audit.log | grep AVC
基本写法:统计拒绝类型
aureport -a | head -20
# 统计 AVC 拒绝事件排行
sudo aureport -a | head -20
基本写法:生成可读报告
sealert -a /var/log/audit/audit.log
# 使用 sealert 分析并生成可读报告
sudo sealert -a /var/log/audit/audit.log > sealert.txt
基本写法:查看进程 AVC 拒绝
grep "avc:.*denied" /var/log/audit/audit.log | grep "<进程名>"
# 查看特定进程的 SELinux 拒绝
sudo grep "avc:.*denied" /var/log/audit/audit.log | grep "nginx"
AppArmor 状态管理
基本写法:查看 AppArmor 状态
apparmor_status
# 查看 AppArmor 运行状态
sudo apparmor_status
基本写法:启动 AppArmor 服务
systemctl start apparmor
# 启动 AppArmor 服务
sudo systemctl start apparmor
sudo systemctl enable apparmor
基本写法:查看加载的配置文件
apparmor_status --profiled
# 查看已加载的配置文件数量
apparmor_status --profiled
基本写法:查看进程关联的配置
aa-status
# 查看各进程的 AppArmor 模式
sudo aa-status
基本写法:查看特定进程模式
cat /proc/<pid>/attr/current
# 查看指定进程的 AppArmor 模式
cat /proc/1234/attr/current
AppArmor 配置文件管理
基本写法:列出所有配置文件
ls /etc/apparmor.d/
# 列出所有 AppArmor 配置文件
ls -l /etc/apparmor.d/
基本写法:加载配置文件
apparmor_parser -r /etc/apparmor.d/<配置>
# 重新加载指定配置文件
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx
基本写法:卸载配置文件
apparmor_parser -R /etc/apparmor.d/<配置>
# 卸载指定配置文件
sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.nginx
基本写法:设置 complain 模式
aa-complain /etc/apparmor.d/<配置>
# 将配置设为告警模式(仅记录不拦截)
sudo aa-complain /etc/apparmor.d/usr.sbin.nginx
基本写法:设置 enforce 模式
aa-enforce /etc/apparmor.d/<配置>
# 将配置设为强制模式
sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx
AppArmor 配置生成
基本写法:生成配置模板
aa-genprof <程序路径>
# 为程序生成 AppArmor 配置文件
sudo aa-genprof /usr/local/bin/myapp
基本写法:更新现有配置
aa-logprof
# 分析日志并更新现有配置
sudo aa-logprof
基本写法:自动学习模式
aa-autodep <程序路径>
# 自动生成依赖项配置
sudo aa-autodep /usr/local/bin/myapp
基本写法:配置文件语法检查
apparmor_parser -Q -T /etc/apparmor.d/<配置>
# 测试配置文件语法
sudo apparmor_parser -Q -T /etc/apparmor.d/usr.sbin.nginx
AppArmor 日志审计
基本写法:查看 AppArmor 日志
tail -f /var/log/syslog | grep -i apparmor
# 实时查看 AppArmor 日志
sudo tail -f /var/log/syslog | grep -i apparmor
基本写法:查看拒绝事件
grep "DENIED" /var/log/syslog | grep apparmor
# 查看 AppArmor 拒绝事件
sudo grep "DENIED" /var/log/syslog | grep apparmor
基本写法:统计拒绝次数
grep "DENIED" /var/log/syslog | grep -oE "profile=[^ ]+" | sort | uniq -c
# 统计各配置文件的拒绝次数
sudo grep "DENIED" /var/log/syslog | grep -oE "profile=[^ ]+" | sort | uniq -c | sort -rn
基本写法:查看特定程序拒绝
dmesg | grep -i apparmor | grep <程序名>
# 查看内核日志中的 AppArmor 拒绝
sudo dmesg | grep -i apparmor | grep nginx
MAC 策略审计
基本写法:SELinux 策略完整性检查
semodule --verify=extend
# 验证 SELinux 策略完整性
sudo semodule --verify=extend
基本写法:对比策略差异
sedismod <模块>
# 反汇编策略模块查看规则
sedismod myapp.pp
基本写法:查看策略允许规则
sesearch -A -s <源类型> -t <目标类型>
# 查询源到目标类型的允许规则
sesearch -A -s httpd_t -t httpd_sys_content_t
基本写法:查看策略布尔值影响
sesearch -A -b <布尔值>
# 查询布尔值影响的规则
sesearch -A -b httpd_can_network_connect
基本写法:AppArmor 配置审计
aa-status --audit
# 审计 AppArmor 配置完整性
sudo aa-status
MAC 与服务集成
基本写法:为 Web 服务启用 SELinux
setsebool -P httpd_enable_homedirs on
# 允许 HTTPD 访问用户主目录
sudo setsebool -P httpd_enable_homedirs on
基本写法:为数据库启用 SELinux
setsebool -P mysqld_disable_trans off
# 启用 MySQL 的 SELinux 策略
sudo setsebool -P mysqld_disable_trans off
基本写法:为 Nginx 配置 AppArmor
aa-enforce /etc/apparmor.d/usr.sbin.nginx
# 启用 Nginx 的 AppArmor 强制模式
sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx
基本写法:为容器配置 SELinux
docker run --security-opt label:type:<类型> <镜像>
# Docker 容器使用 SELinux 隔离
docker run --security-opt label:type:svirt_apache_t nginx
基本写法:验证服务配置
getsebool -a | grep <服务名>
# 查看 HTTPD 相关布尔值
getsebool -a | grep httpd