自定义SELinux域与类型的核心是为新服务建立隔离:声明专属domain(如myapp_t)和type(如myapp_exec_t、myapp_etc_t),通过.te文件定义类型、域关联及最小访问规则,用.fc绑定路径上下文,编译加载策略并验证进程域与文件类型。

在服务器环境中自定义 SELinux 域(domain)与类型(type),核心是让新服务或脚本拥有独立、最小权限的安全上下文,既不破坏系统策略完整性,也不因权限不足而失败。关键不在“加权限”,而在“建隔离”——为进程分配专属 domain,为目标资源分配专属 type,并用精确规则连接二者。
明确目标域与类型边界
域(domain)专指进程运行时的安全上下文,如 httpd_t、sshd_t;类型(type)专指文件、目录、设备等对象的标签,如 httpd_sys_content_t、sshd_exec_t。二者不可混用,也不能复用已有高权限类型(如 bin_t 或 system_file)来绕过限制。
- 新服务可执行文件应声明为
myapp_exec_t,而非直接沿用bin_t - 该服务读写的配置目录应标记为
myapp_etc_t,而非打上etc_t - 运行时生成的数据目录建议用
myapp_var_t,避免与var_log_t或var_run_t混淆
编写 .te 策略文件
以 myapp.te 为例,需包含三类基础定义:
-
类型声明:定义新 domain 和新 type
type myapp_t, domain;type myapp_exec_t, exec_type, file_type;type myapp_etc_t, file_type; -
域关联:绑定可执行文件与进程域
init_daemon_domain(myapp_t, myapp_exec_t)(适用于 systemd 启动的服务)
或application_domain(myapp_t, myapp_exec_t)(适用于普通用户脚本) -
最小访问规则:仅开放必要操作
allow myapp_t myapp_etc_t:dir { read search open getattr };allow myapp_t myapp_etc_t:file { read open getattr };allow myapp_t self:capability { dac_override kill };(按需添加,勿滥用sys_admin)
绑定文件上下文与加载策略
仅写 .te 不够,还需将磁盘路径与新类型关联,并编译加载:
- 在
myapp.fc中写入上下文映射:/usr/local/bin/myapp -- gen_context(system_u:object_r:myapp_exec_t:s0)/etc/myapp(/.*)? gen_context(system_u:object_r:myapp_etc_t:s0) - 编译并安装:
checkmodule -M -m -o myapp.mod myapp.tesemodule_package -o myapp.pp -m myapp.modsemodule -i myapp.pp - 刷新文件上下文:
restorecon -Rv /usr/local/bin/myapp /etc/myapp
调试与验证
启用 permissive 模式快速定位缺失规则,再切回 enforcing:
- 临时切换:
setenforce 0,运行服务,抓取 AVC 日志:ausearch -m avc -ts recent | audit2why或grep myapp /var/log/audit/audit.log | audit2allow -a - 确认进程域已生效:
ps -eZ | grep myapp→ 应显示system_u:system_r:myapp_t:s0 - 确认文件类型已正确:
ls -Z /etc/myapp/config.conf→ 应显示system_u:object_r:myapp_etc_t:s0


















