温馨提示×

Ubuntu SELinux如何制定安全策略

小樊
46
2025-11-10 21:38:32
栏目: 智能运维

1. 前提准备:安装SELinux及相关工具
Ubuntu默认未启用SELinux,需先安装核心组件与管理工具。执行以下命令安装:

sudo apt update
sudo apt install selinux-basics selinux-policy-default policycoreutils selinux-utils auditd

安装完成后,通过sestatus命令验证SELinux是否安装成功(显示“SELinux status: enabled”即为成功)。

2. 启用SELinux并设置运行模式
SELinux有三种运行模式,需通过配置文件调整:

  • 修改配置文件:编辑/etc/selinux/config,设置SELINUX参数(可选enforcing/permissive/disabled),例如强制模式:
    sudo nano /etc/selinux/config
    # 修改为
    SELINUX=enforcing
    SELINUXTYPE=targeted  # 通常选择targeted(针对网络服务保护)
    
  • 临时切换模式:使用setenforce命令(无需重启),0为宽容模式(仅记录违规不阻止),1为强制模式(阻止违规):
    sudo setenforce 1  # 切换至强制模式
    
    注:从disabled切换至enforcing需重启系统,且disabled模式会清除所有SELinux标签。

3. 查看与管理安全上下文
安全上下文(user:role:type:level)是SELinux的核心,标识主体(进程)与客体(文件/端口)的安全属性。常用命令:

  • 查看文件/目录上下文
    ls -Z /path/to/file  # 示例:查看/var/www/html/index.html的上下文
    
  • 修改文件上下文:使用semanage fcontext添加自定义规则,restorecon恢复默认上下文:
    sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?"  # 添加规则
    sudo restorecon -Rv /var/www/html  # 递归恢复上下文
    
    注:httpd_sys_content_t是Apache默认可访问的文件类型。

4. 配置SELinux布尔值(快速调整权限)
布尔值是SELinux的开关选项,用于快速启用/禁用特定功能的权限(如允许Apache访问用户主目录)。常用命令:

  • 查看所有布尔值
    getsebool -a
    
  • 修改布尔值:使用setsebool-P参数表示永久生效(重启后仍有效):
    sudo setsebool -P httpd_enable_homedirs 1  # 允许Apache访问用户主目录
    
    常见布尔值:ftp_anon_write(匿名FTP写入)、ssh_chroot_rw_homedirs(SSH chroot读写家目录)。

5. 创建自定义SELinux策略模块(解决特定问题)
当遇到SELinux拒绝访问(如自定义应用无法访问文件)时,需通过audit2allow工具生成自定义策略:

  • 收集拒绝日志:使用ausearch获取最近的AVC(访问控制)拒绝事件:
    sudo ausearch -m avc -ts recent > avc_denials.txt
    
  • 生成策略模块:使用audit2allow解析日志并创建.te(策略源文件)与.pp(编译后模块):
    sudo audit2allow -M my_custom_policy < avc_denials.txt
    
  • 加载策略模块:使用semodule安装生成的模块:
    sudo semodule -i my_custom_policy.pp
    
    注:自定义策略需谨慎测试,避免过度授权。

6. 调试与验证SELinux策略

  • 查看拒绝日志:通过ausearch过滤AVC拒绝事件,定位问题:
    sudo ausearch -m avc -ts today
    
  • 分析拒绝原因:使用audit2why解释日志中的拒绝原因,提供解决方案:
    sudo ausearch -m avc -ts recent | audit2why
    
    示例输出:“avc: denied { read } for pid=1234 comm="httpd" name="index.html" dev="sda1" ino=5678 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file”,说明httpd_t进程无权访问admin_home_t类型的文件,需调整上下文或添加布尔值。

注意事项

  • Ubuntu对SELinux的支持不如RHEL/CentOS完善,部分功能可能受限;
  • 生产环境修改策略前,务必在测试环境验证,避免系统无法启动;
  • 定期备份SELinux配置(/etc/selinux/config、自定义策略模块)。

0