第一次接触SELinux时,我被它的复杂性吓到了——直到发现selinux-policy-default这个宝藏包。作为Linux系统管理员,我们每天都在和权限控制打交道,而SELinux正是将权限控制做到极致的工具。在Debian系统中,selinux-policy-default包就像是一个精心设计的权限规则库,包含了超过300个预编译的策略模块。
这个包的核心价值在于它实现了**参考策略(Reference Policy)**的Debian化封装。不同于其他发行版,Debian对其进行了深度定制:
我曾在生产环境中遇到过Apache因权限问题无法启动的情况。通过分析发现,正是apache.pp.bz2模块中的规则阻止了非标准目录的访问。这种细粒度的控制,正是SELinux区别于传统DAC权限系统的关键。
获取策略包最稳妥的方式是通过官方仓库:
bash复制apt source selinux-policy-default
但紧急情况下可能需要手动下载。我在亚洲区服务器通常选择:
bash复制wget http://ftp.cn.debian.org/debian/pool/main/s/selinux-policy-default/selinux-policy-default_2.20231119-2_all.deb
解包过程就像拆解一个安全工具箱:
bash复制ar -vx selinux-policy-default_2.20231119-2_all.deb
tar xvf data.tar.xz -C policy_data/
解压后会看到几个关键部分:
/usr/share/selinux/default/:存放所有二进制策略模块/etc/selinux/default/contexts/:系统默认安全上下文定义特别注意:我曾在Ubuntu上尝试使用Debian的包,结果导致系统无法启动。不同发行版的SELinux策略存在微妙差异,强烈建议保持发行版一致性。
base.pp.bz2是所有策略的基石,定义了:
通过这个命令可以查看基础规则:
bash复制sesearch -A -s kernel_t -t device_t -c chr_file -p write -d
以docker.pp.bz2为例,它包含:
我曾遇到容器无法访问宿主设备的问题,通过修改docker模块的TE规则解决:
bash复制semodule -i modified_docker.pp
模块间存在复杂的依赖关系。apache.pp依赖:
使用这个命令查看依赖图:
bash复制sepolicy graph -d /usr/share/selinux/default | dot -Tpng > policy_graph.png
完整部署流程应该是:
bash复制apt install selinux-policy-default policycoreutils setools
semanage module -l # 验证模块加载
postinst脚本会:
踩坑记录:在低配VPS上首次加载可能超时,建议添加-n参数延迟加载:
bash复制semodule -X 100 -n -s default -i base.pp.bz2
定制策略的三种途径:
bash复制semodule -X 200 -i custom_apache.pp
bash复制semanage fcontext -a -t httpd_sys_content_t "/webapps(/.*)?"
bash复制setsebool -P httpd_can_network_connect_db 1
部署后必须检查:
bash复制sealert -a /var/log/audit/audit.log # 分析AVC拒绝
sestatus -v # 验证策略生效
matchpathcon -V /var/www/html # 检查上下文
我常用的调试组合:
bash复制audit2why < /var/log/audit/audit.log | grep -A5 "denied"
sepolicy generate --init /usr/sbin/nginx # 自动生成新策略
Debian的策略存储在:
code复制/var/lib/selinux/default/active/
包含:
性能提示:定期清理过期模块可提升加载速度:
bash复制semodule --disable_dontaudit --build
更新时需特别注意:
bash复制semanage export -f backup.conf
bash复制rpm -qc selinux-policy-default | xargs ls -Z
bash复制semodule -X 100 -n -s default -i new_policy.pp
通过systemd单元确保策略正确加载:
systemd复制[Unit]
Description=Load SELinux custom policies
Before=sysinit.target
[Service]
Type=oneshot
ExecStart=/usr/sbin/semodule -i /etc/selinux/custom/*.pp
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
通过组合策略实现深度防御:
bash复制semanage fcontext -a -t httpd_script_exec_t "/var/www/html/upload(/.*)?"
bash复制setsebool -P httpd_can_network_connect_db=1
bash复制chcon -R -t httpd_sys_content_rw_t /var/www/html/config
利用container.pp实现:
关键配置示例:
bash复制semanage permissive -a container_t # 测试模式
setsebool -P container_manage_cgroup=1
通过userdomain.pp管理:
典型配置:
bash复制semanage login -a -s staff_u user1
usermod -Z sysadm_u admin1
bash复制grep "avc: denied" /var/log/audit/audit.log | audit2allow -M myfix
bash复制restorecon -Rv /etc/nginx
bash复制semodule --list=full | grep -E "^100|^200"
创建自定义审计规则:
bash复制auditctl -a always,exit -F arch=b64 -S open -F path=/etc/shadow
分析工具链:
bash复制ausearch -m AVC -ts today | aureport -i --summary
sealert -a /var/log/audit/audit.log -o html > report.html
开发流程示例:
bash复制sesearch -A -t httpd_t | tee myweb.te
bash复制checkmodule -M -m -o myweb.mod myweb.te
semodule_package -o myweb.pp -m myweb.mod
bash复制semodule -i myweb.pp
使用沙盒测试:
bash复制sepolgen /usr/sbin/nginx > nginx.te
make -f /usr/share/selinux/devel/Makefile nginx.pp
semodule -i nginx.pp
实时监控工具:
bash复制watch -n 1 'ps auxZ | grep httpd'
bash复制semodule --disable_dontaudit
bash复制semodule --rebuild
bash复制restorecon -R /var/lib/selinux
专用监控命令:
bash复制seinfo --stats
sesearch --stats
性能热点分析:
bash复制perf stat -e 'selinux:*' -a sleep 10
虽然不推荐,但可以通过:
bash复制update-alternatives --config selinux
选择策略后端
查看当前LSM堆叠:
bash复制cat /sys/kernel/security/lsm
配置启动参数:
bash复制selinux=1 lsm=lockdown,yama,selinux
创建巡检脚本:
bash复制#!/bin/bash
sestatus || systemctl restart selinux-autorelabel
ausearch -m AVC -ts yesterday | mail -s "SELinux Report" admin@example.com
建议将以下纳入Git:
备份命令示例:
bash复制semanage export -f selinux-backup-$(date +%F).conf