1. SELinux 基础概念与工作原理
SELinux(Security-Enhanced Linux)是美国国家安全局(NSA)开发的一种强制访问控制(MAC)安全机制,它通过为系统中的每个进程、文件和网络端口等对象分配安全上下文(Security Context),并基于策略规则严格控制这些对象之间的交互,从而提供比传统Linux自主访问控制(DAC)更细粒度的安全防护。
1.1 安全上下文详解
SELinux安全上下文由四个部分组成,格式为:user:role:type:sensitivity。以system_u:system_r:sshd_t:s0为例:
- user:标识创建或拥有该对象的用户身份(如system_u表示系统用户)
- role:定义对象的角色(如system_r表示系统角色)
- type:最重要的部分,决定访问控制规则(如sshd_t表示SSH服务类型)
- sensitivity:多级安全(MLS)相关,通常为s0
查看文件上下文示例:
bash复制ls -Z /etc/passwd
# 输出示例:system_u:object_r:passwd_file_t:s0 /etc/passwd
查看进程上下文示例:
bash复制ps -Z -C nginx
# 输出示例:system_u:system_r:httpd_t:s0 1234 ? 00:00:00 nginx
1.2 SELinux三种工作模式
-
Enforcing模式(强制模式):
- 默认工作模式
- 严格执行所有策略规则,拒绝任何未经明确允许的操作
- 违规行为会被记录到/var/log/audit/audit.log
- 生产环境推荐模式
-
Permissive模式(宽容模式):
- 仅记录违规行为而不阻止
- 用于策略调试和问题排查
- 可通过
setenforce 0临时切换
-
Disabled模式(禁用模式):
- 完全关闭SELinux功能
- 需要重启系统生效
- 不建议使用,会导致系统失去MAC保护
模式管理命令:
bash复制# 查看当前模式
getenforce
# 临时切换模式(重启后失效)
setenforce 0 # 切换为Permissive
setenforce 1 # 切换为Enforcing
# 永久修改模式(需修改配置文件)
vim /etc/selinux/config
# 修改SELINUX=enforcing|permissive|disabled
注意:从Disabled模式切换到Enforcing/Permissive模式时,系统会在下次启动时自动重新标记所有文件上下文,这可能导致首次启动时间较长。
2. 文件上下文管理实践
2.1 文件上下文继承规则
新创建的文件默认从父目录继承安全上下文,这是SELinux保持系统一致性的重要机制。但某些操作会影响这一行为:
-
普通文件复制:
bash复制cp /var/www/html/index.html /backups/ # 新文件会继承/backups/的上下文 -
带保留属性的复制:
bash复制cp -a /var/www/html/index.html /backups/ # 新文件保持原文件的上下文 -
文件移动:
bash复制mv /var/www/html/index.html /backups/ # 文件保持原有上下文不变
2.2 手动修改文件上下文
当需要自定义文件上下文时,可使用以下工具:
-
chcon命令(临时修改):
bash复制chcon -t httpd_sys_content_t /custom_web/index.html chcon -R --reference=/var/www/html /custom_web # 递归设置参考上下文 -
semanage+restorecon(永久修改):
bash复制# 安装管理工具 yum install policycoreutils-python-utils # 添加新规则 semanage fcontext -a -t httpd_sys_content_t "/custom_web(/.*)?" # 应用规则 restorecon -Rv /custom_web -
常用文件类型:
httpd_sys_content_t:Web内容public_content_t:共享文件(如FTP/NFS)var_log_t:日志文件etc_t:配置文件
2.3 实际案例:自定义Web目录
假设需要将/webapps设置为新的网站根目录:
bash复制# 创建目录结构
mkdir -p /webapps/{static,uploads}
echo "Test Page" > /webapps/static/index.html
# 设置安全上下文
semanage fcontext -a -t httpd_sys_content_t "/webapps(/.*)?"
semanage fcontext -a -t httpd_sys_rw_content_t "/webapps/uploads(/.*)?"
restorecon -Rv /webapps
# 验证设置
ls -Zd /webapps /webapps/static /webapps/uploads
经验:对于需要写入的目录(如uploads),应使用
httpd_sys_rw_content_t而非httpd_sys_content_t,同时确保文件系统权限也正确设置。
3. 网络端口控制实战
3.1 端口标签管理
SELinux通过端口标签防止服务监听非授权端口。查看默认端口标签:
bash复制semanage port -l | grep -E 'http_port_t|ssh_port_t'
典型输出:
code复制http_port_t tcp 80, 443, 8080
ssh_port_t tcp 22
3.2 自定义服务端口
当需要更改服务默认端口时(如将HTTP改为8081):
-
错误做法(直接修改服务配置):
bash复制vim /etc/httpd/conf/httpd.conf # 修改Listen 80为Listen 8081 systemctl restart httpd # 会失败,报权限错误 -
正确步骤:
bash复制# 1. 添加新端口标签 semanage port -a -t http_port_t -p tcp 8081 # 2. 修改服务配置 vim /etc/httpd/conf/httpd.conf # 3. 重启服务 systemctl restart httpd
3.3 端口管理命令详解
-
添加新端口标签:
bash复制
semanage port -a -t ssh_port_t -p tcp 2222 -
修改现有标签:
bash复制
semanage port -m -t http_port_t -p tcp 8081 -
删除自定义标签:
bash复制
semanage port -d -t http_port_t -p tcp 8081 -
查看自定义标签:
bash复制
semanage port -l -C
注意:修改端口标签后无需重启服务,立即生效。但服务本身可能需要配置调整才能使用新端口。
4. SELinux布尔值精细控制
4.1 布尔值基础
布尔值是SELinux策略中的开关选项,用于动态调整安全策略。常用布尔值相关命令:
-
查看所有布尔值:
bash复制
getsebool -a -
查看特定布尔值:
bash复制
getsebool httpd_enable_homedirs -
临时修改布尔值:
bash复制
setsebool httpd_enable_homedirs on -
永久修改布尔值:
bash复制
setsebool -P httpd_enable_homedirs on
4.2 常用布尔值示例
-
允许HTTP访问用户家目录:
bash复制
setsebool -P httpd_enable_homedirs on -
允许Samba共享NFS目录:
bash复制
setsebool -P samba_share_nfs on -
允许MySQL从用户目录加载数据:
bash复制
setsebool -P mysql_read_user_content on -
允许容器访问宿主机系统:
bash复制
setsebool -P container_manage_cgroup on
4.3 布尔值管理高级技巧
-
使用semanage管理布尔值:
bash复制semanage boolean -l # 查看所有 semanage boolean -m --on httpd_enable_cgi # 永久启用 -
批量修改布尔值:
bash复制
setsebool -P httpd_enable_cgi=1 httpd_enable_homedirs=0 -
查找相关布尔值:
bash复制
sepolicy booleans | grep httpd -
查看布尔值描述:
bash复制
sesearch -b httpd_enable_homedirs -AC
5. 故障排查与日志分析
5.1 常见问题诊断
-
权限被拒绝:
bash复制grep "AVC" /var/log/audit/audit.log | tail -n 10 -
服务启动失败:
bash复制
systemctl status httpd -l journalctl -xe -
上下文错误:
bash复制ls -Z /path/to/file
5.2 使用audit2why分析
bash复制grep "AVC" /var/log/audit/audit.log | audit2why
典型输出会建议:
- 需要修改哪些布尔值
- 需要添加哪些文件上下文规则
- 需要哪些策略模块
5.3 临时解决方案
-
生成自定义策略模块:
bash复制grep "AVC" /var/log/audit/audit.log | audit2allow -M mypolicy semodule -i mypolicy.pp -
恢复默认上下文:
bash复制
restorecon -Rv /path -
重新标记整个系统:
bash复制touch /.autorelabel reboot
5.4 生产环境建议
-
开发环境:
- 使用Permissive模式测试新应用
- 收集所有AVC拒绝消息
- 使用audit2allow生成定制策略
-
生产环境:
- 保持Enforcing模式
- 只加载必要的策略修改
- 定期审查SELinux日志
-
禁用SELinux的最后手段:
bash复制vim /etc/selinux/config # 修改为SELINUX=permissive reboot
重要:永远不要在生产环境直接禁用SELinux,应先设置为Permissive模式排查问题。