编写与优化 SELinux 策略的实用指南
一 基础与准备
getenforce、setenforce 0|1、sestatus;永久配置在 /etc/selinux/config 的 SELINUX= 与 SELINUXTYPE=(常见值为 targeted)。在生产环境建议保持 Enforcing,问题排查阶段可切到 Permissive。ls -Z、ps -Z。二 策略编写步骤
module myapp 1.0;
require { type init_t; class process transition; }
type myapp_t, domain;
type myapp_exec_t, exec_type, file_type;
init_daemon_domain(myapp_t)
/usr/local/bin/myapp u:object_r:myapp_exec_t:s0checkmodule -M -m -o myapp.mod myapp.te、semodule_package -o myapp.pp -m myapp.mod、semodule -i myapp.pp。semanage fcontext 添加规则并用 restorecon 应用,避免用易丢失的 chcon:semanage fcontext -a -t httpd_sys_content_t "/web/data(/.*)?"
restorecon -Rv /web/data
getsebool -a、setsebool httpd_can_network_connect_db on、setsebool -P httpd_can_network_connect_db on(持久化)。优先用布尔值而非直接放开规则。type_transition init_t myapp_exec_t : process myapp_t;
allow init_t myapp_exec_t : process transition;
allow myapp_t myapp_exec_t : file { execute read getattr };
allow myapp_t self : process { fork signal sigchld };
type_transition 只提供“默认类型”,不会自动赋予访问权限,仍需显式 allow。三 优化与排错
ausearch -m avc -ts recent 或 grep "avc:.*denied" /var/log/audit/audit.log。先判断访问是否合理,再决定是改标签、开布尔值,还是写最小规则。audit2allow -w -a(解释拒绝原因)、audit2allow -M mypolicy < /var/log/audit/audit.log、semodule -i mypolicy.pp。避免“照单全收”,仅授予必要权限。sealert -a /var/log/audit/audit.log 获取更友好的分析与修复建议;在策略合并与编译阶段关注 neverallow 冲突与可维护性。四 常见场景与命令清单
semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?" && restorecon -R /var/www/htmlsetsebool -P httpd_can_network_connect_db onps -Z、ls -Z 校验上下文是否生效。sestatus、getenforce、setenforce 0|1ls -Z、ps -Z、semanage fcontext、restorecon -Rvgetsebool -a、setsebool、setsebool -Pausearch -m avc、audit2allow -M <name>、semodule -i <name>.pp、sealert -a <log>五 安全与风险提示
semanage 持久化上下文,策略变更通过模块管理。