温馨提示×

Ubuntu SELinux如何更新策略文件

小樊
36
2025-12-20 11:00:19
栏目: 智能运维

Ubuntu 上更新 SELinux 策略文件的实用步骤

前置说明

  • Ubuntu 默认不启用 SELinux,默认使用 AppArmor。如确需使用 SELinux,需先安装并启用相关组件,再按下方步骤更新策略。启用前建议备份关键数据与配置。

启用或确认 SELinux 状态

  • 安装基础工具与策略包(含 SELinux 基础、默认策略、审计组件):
    • sudo apt update
    • sudo apt install selinux-basics selinux-policy-default auditd audispd-plugins
  • 检查当前模式:
    • getenforce(返回 Enforcing/Permissive/Disabled
  • 修改配置文件 /etc/selinux/config,将 SELINUX=permissive(首次建议宽容模式)或 SELINUX=enforcing,保存后重启:
    • sudo reboot
  • 重启后可再次用 getenforce 确认状态。

更新策略的常用方式

  • 方式一 从 AVC 拒绝日志自动生成并加载模块(适合快速修复被拒操作)

    • 查看拒绝日志:
      • grep avc /var/log/audit/audit.log
    • 生成并安装模块(示例将模块命名为 mypol):
      • grep avc /var/log/audit/audit.log | audit2allow -M mypol
      • sudo semodule -i mypol.pp
    • 如仅为“噪音”拒绝,可生成 dontaudit 规则(不推荐作为首选):
      • grep btmp /var/log/audit/audit.log | audit2allow -D -M mypol
    • 提示:模块名应具业务含义(如 custom_nginx_log),便于后续管理。
  • 方式二 自定义 TE 策略模块并编译安装(适合新增服务或精细授权)

    • 创建策略源文件(示例 custom_policy.te):
      • mkdir -p /selinux-custom-policy && cd $_
      • 示例规则(仅演示结构,按实际需求编写):
        • policy_module(custom_policy, 1.0)
        • type my_script_t;
        • type my_script_exec_t;
        • init_daemon_domain(my_script_t, my_script_exec_t)
        • allow my_script_t httpd_sys_rw_content_t:dir { read write };
    • 编译并安装:
      • make -f /usr/share/selinux/devel/Makefile
      • sudo semodule -i custom_policy.pp
    • 加载后使新标签生效:
      • sudo restorecon -Rv /path/to/your/directory
  • 方式三 维护文件上下文与端口标签(非编译模块)

    • 文件上下文:编辑或新增本地文件(如 /etc/selinux/targeted/contexts/files/file_contexts.local),添加规则后执行 restorecon 使标签生效:
      • sudo restorecon -Rv /path/to/affected/directory
      • 可用 ls -Z 校验标签是否已更新。
    • 端口标签(需相应工具支持):
      • 例如将 8080/tcp 标记为 http_port_t
        • sudo semanage port -a -t http_port_t -p tcp 8080

验证与回滚

  • 验证
    • 确认模块已加载:semodule -l | grep your_module_name
    • 查看拒绝日志是否减少:grep avc /var/log/audit/audit.log
    • 校验文件或目录标签:ls -Z /path
  • 回滚
    • 禁用模块:sudo semodule -d module_name
    • 重新启用:sudo semodule -e module_name
    • 彻底移除模块:sudo semodule -r module_name(谨慎操作,可能影响依赖该模块的服务)

注意事项

  • Ubuntu 上启用 SELinux 属于非默认路径,可能遇到软件兼容性与维护成本问题;生产环境建议先在测试环境验证,或考虑以 AppArmor 作为替代方案。

0