SELinux在Ubuntu上的支持现状
Ubuntu默认采用AppArmor作为安全模块,而非SELinux。若需在Ubuntu上使用SELinux,需手动安装并配置相关组件,但需注意:SELinux与AppArmor可能存在冲突,启用SELinux前建议停止并卸载AppArmor(sudo systemctl stop apparmor && sudo apt purge apparmor)。
在Ubuntu上启用SELinux的第一步是安装必要工具包,包括SELinux基础策略、审计工具及策略开发库:
sudo apt update
sudo apt install selinux-basics selinux-policy-default auditd setools selinux-policy-dev
其中,selinux-basics提供默认策略及库文件,auditd用于收集SELinux访问拒绝日志,setools包含策略分析工具(如apols)。
安装完成后,通过selinux-activate命令激活SELinux,该命令会修改内核启动参数(添加security=selinux),确保内核加载SELinux模块:
sudo selinux-activate
为确保文件系统对象(如文件、目录)拥有正确的SELinux标签(安全上下文),需创建.autorelabel文件,系统启动时会自动执行标签初始化(递归为所有文件打标签):
sudo touch /.autorelabel
重启系统以完成激活及标签初始化:
sudo reboot
使用sestatus命令检查SELinux是否启用及当前模式(Enforcing/Permissive/Disabled):
sestatus
输出应包含SELinux status: enabled(启用状态)及Current mode: enforcing/permissive(当前模式)。
SELinux有三种运行模式,可通过/etc/selinux/config文件永久修改,或使用setenforce命令临时调整:
临时切换模式(立即生效,重启失效):
sudo setenforce 1 # 切换至强制模式
sudo setenforce 0 # 切换至宽容模式
永久修改模式(需重启生效):
编辑/etc/selinux/config文件,修改SELINUX=参数:
sudo nano /etc/selinux/config
# 将SELINUX=permissive改为SELINUX=enforcing(或其他模式)
SELinux通过安全上下文(标签)控制进程对文件/目录的访问,标签格式为user:role:type:level(如user_home_t)。对于不同文件系统(如ext4、XFS、Btrfs、NFS),需确保标签正确继承或手动设置:
使用ls -Z命令查看目标对象的标签:
ls -Z /path/to/file_or_directory
输出示例:unconfined_u:object_r:user_home_t:s0(用户家目录的默认标签)。
使用chcon命令修改单个文件/目录的标签(仅当前有效,重启或restorecon后会恢复默认):
sudo chcon -t httpd_sys_content_t /var/www/html/index.html # 将网页文件设为httpd可访问类型
若需递归修改目录及子文件,添加-R参数:
sudo chcon -R -t var_t /mnt/data # 将/mnt/data目录设为var_t类型
使用semanage fcontext命令添加自定义策略规则,然后通过restorecon命令恢复默认标签(永久生效):
sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/custom(/.*)?" # 添加自定义规则(允许httpd读写/custom目录)
sudo restorecon -Rv /var/www/custom # 递归恢复/custom目录的标签
semanage fcontext会将规则保存至/etc/selinux/targeted/contexts/files/file_contexts.local,确保重启后仍有效。
本地文件系统(ext4/XFS/Btrfs):SELinux标签通过xattr(扩展属性)存储,需确保文件系统挂载时启用user_xattr选项(默认通常开启)。可通过mount命令检查挂载选项:
mount | grep /dev/sdX # 替换为实际设备名
若未启用,需修改/etc/fstab文件,在对应挂载行添加user_xattr(如defaults,user_xattr)。
网络文件系统(NFS):需在NFS服务器端启用sec=sys或sec=krb5等安全选项,并在客户端挂载时添加context=参数指定标签(如mount -t nfs -o context="system_u:object_r:httpd_sys_content_t:s0" server:/export /mnt/nfs)。
当SELinux阻止进程访问文件/目录时,需通过日志分析原因并调整策略:
ausearch命令过滤AVC(访问向量缓存)日志:sudo ausearch -m avc -ts today # 查看今日所有AVC拒绝事件
audit2allow工具从日志中提取规则并创建策略模块:sudo grep avc /var/log/audit/audit.log | audit2allow -M mypol # 生成mypol.te(策略源码)和mypol.pp(编译后的模块)
sudo semodule -i mypol.pp # 加载自定义策略模块
注意:自定义策略需谨慎,避免过度放宽权限(如仅允许必要进程访问特定资源)。/etc/selinux/config、自定义策略模块)。