SELinux策略如何编写和优化
导读:编写与优化 SELinux 策略的实用指南 一 基础与准备 运行模式与状态 三种模式:Enforcing(强制执行)、Permissive(仅记录不拦截,便于调试)、Disabled(关闭)。常用命令:getenforce、setenf...
编写与优化 SELinux 策略的实用指南
一 基础与准备
- 运行模式与状态
- 三种模式:Enforcing(强制执行)、Permissive(仅记录不拦截,便于调试)、Disabled(关闭)。常用命令:
getenforce、setenforce 0|1、sestatus;永久配置在 /etc/selinux/config 的 SELINUX= 与 SELINUXTYPE=(常见值为 targeted)。在生产环境建议保持 Enforcing,问题排查阶段可切到 Permissive。
- 三种模式:Enforcing(强制执行)、Permissive(仅记录不拦截,便于调试)、Disabled(关闭)。常用命令:
- 安全上下文与标签
- 上下文格式:user:role:type:level(常见客体 role=object_r;type 是访问控制核心;level 用于 MLS)。查看命令:
ls -Z、ps -Z。
- 上下文格式:user:role:type:level(常见客体 role=object_r;type 是访问控制核心;level 用于 MLS)。查看命令:
- 策略类型
- 常见为 targeted(只保护特定服务)、MLS(多级安全,较少用于通用服务器)。一般服务器优先使用 targeted。
二 策略编写步骤
- 为服务创建专用域与可执行标签
- 定义类型(.te):声明服务域与可执行类型,并使用宏将服务纳入初始化域(便于正确启动与域转换)。示例:
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) - 标记可执行文件(file_contexts):
/usr/local/bin/myapp u:object_r:myapp_exec_t:s0 - 编译与加载模块:
checkmodule -M -m -o myapp.mod myapp.te、semodule_package -o myapp.pp -m myapp.mod、semodule -i myapp.pp。
- 定义类型(.te):声明服务域与可执行类型,并使用宏将服务纳入初始化域(便于正确启动与域转换)。示例:
- 为数据路径设置持久化文件上下文
- 使用
semanage fcontext添加规则并用restorecon应用,避免用易丢失的chcon:semanage fcontext -a -t httpd_sys_content_t "/web/data(/.*)?" restorecon -Rv /web/data - 常见场景:Web 内容目录使用 httpd_sys_content_t,数据库数据目录使用对应服务类型(如 mysqld_db_t 等)。
- 使用
- 使用布尔值快速启用/关闭功能
- 查看与设置:
getsebool -a、setsebool httpd_can_network_connect_db on、setsebool -P httpd_can_network_connect_db on(持久化)。优先用布尔值而非直接放开规则。
- 查看与设置:
- 处理域转换与客体默认类型
- 当进程执行特定可执行文件后切换到服务域,需配合 type_transition 与必要的 allow 规则;示例:
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。
- 当进程执行特定可执行文件后切换到服务域,需配合 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 冲突与可维护性。
- 使用
- 性能与可维护优化
- 遵循最小权限原则:只授予完成功能所必需的权限;优先用布尔值与细化类型,少用通配与过宽规则。
- 保持策略模块化、可复用(属性与宏),定期清理无用规则与历史模块;对高并发服务,避免不必要的复杂策略与过度日志。
- 模式切换与灰度策略
- 新服务或大规模变更:先在 Permissive 观察完整拒绝日志,再切回 Enforcing;对仍频繁报错的个别网域可短期保留 Permissive,但应有明确回退计划。
四 常见场景与命令清单
- Web 服务(以 httpd 为例)
- 目录标签:
semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?" & & restorecon -R /var/www/html - 允许数据库连通(如确有需要):
setsebool -P httpd_can_network_connect_db on - 端口标签:如需使用非默认端口,先为端口打标签,再在策略中允许访问该端口类型。
- 目录标签:
- 自定义服务(通用步骤)
- 定义类型与域、标记可执行文件、必要时设置 type_transition、编译并加载模块;用
ps -Z、ls -Z校验上下文是否生效。
- 定义类型与域、标记可执行文件、必要时设置 type_transition、编译并加载模块;用
- 常用命令速查
- 状态与模式:
sestatus、getenforce、setenforce 0|1 - 标签:
ls -Z、ps -Z、semanage fcontext、restorecon -Rv - 布尔值:
getsebool -a、setsebool、setsebool -P - 日志与修复:
ausearch -m avc、audit2allow -M < name>、semodule -i < name> .pp、sealert -a < log>
- 状态与模式:
五 安全与风险提示
- 切勿以关闭 SELinux 换取兼容性或性能(如将 SELINUX=disabled)。优先通过正确的标签、布尔值与最小权限规则解决问题。
- 避免在生产环境长期使用 chcon 或直接编辑策略文件;使用
semanage持久化上下文,策略变更通过模块管理。 - 对自动生成的规则保持审慎,务必复核访问向量与客体类别,防止过度授权与策略膨胀。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: SELinux策略如何编写和优化
本文地址: https://pptw.com/jishu/781872.html
