一、SELinux 简介
1、什么是 SELinux?(Security-Enhanced Linux)
是Linux内核的强制访问控制(MAC)安全子系统,提供更细粒度的权限控制,防止进程或用户越权操作。
2、核心思想
最小权限原则:进程/用户只能访问其明确需要的资源。
基于标签的访问控制:所有资源(文件、端口、进程)被赋予安全上下文(Security Context)。
3、工作模式
模式 | 描述 |
---|---|
Enforcing | 强制执行策略,拒绝非法操作并记录日志。 |
Permissive | 仅记录违规操作,不阻止(用于调试)。 |
Disabled | 完全关闭SELinux(需重启生效)。 |
二、基础操作命令
1. 查看SELinux状态
getenforce# 查看当前模式
sestatus# 详细状态(模式/策略类型)
2. 切换工作模式
setenforce 0# 切换到Permissive模式
setenforce 1# 切换到Enforcing模式
注意:setenforce仅临时生效,永久修改需编辑 /etc/selinux/config 文件。
三、安全上下文(Security Context)
1. 查看上下文
ls -Z /var/www/html # 查看文件/目录的上下文
ps -Z -C httpd# 查看进程的上下文
2. 修改上下文
2.1、chcon命令
选项 | 说明 | 示例消息 |
---|---|---|
-t, --type TYPE | 设置安全上下文的类型部分 | 已将 file.txt 的类型更改为 httpd_sys_content_t |
-u, --user USER | 设置安全上下文的用户部分 | 已将 file.txt 的用户更改为 system_u |
-r, --role ROLE | 设置安全上下文的角色部分 | 已将 file.txt 的角色更改为 object_r |
--reference=FILE | 使用指定文件的安全上下文 | 已从 ref_file 复制上下文到 target_file |
-R, --recursive | 递归处理文件和目录 | 已递归更改 dir/ 及其内容的上下文 |
-h, --help | 显示帮助信息 | 显示帮助菜单 |
-v, --verbose | 显示操作详情 | 正在更改 file.txt 的安全上下文 |
--version | 显示版本信息 | chcon (GNU coreutils) 8.32 |
选项使用案例
1、设置文件类型
将 /var/www/html/index.html 的上下文类型设为 httpd_sys_content_t:
sudo chcon -t httpd_sys_content_t /var/www/html/index.html
2、设置用户部分
将 /etc/nginx/nginx.conf 的用户部分设为 system_u:
sudo chcon -u system_u /etc/nginx/nginx.conf
3、设置角色部分
将 /home/user/file.txt 的角色部分设为 object_r:
sudo chcon -r object_r /home/user/file.txt
4、参照文件上下文
将 file2 的上下文设置为与 file1 一致:
sudo chcon --reference=file1 file2
5、递归操作目录
递归修改 /var/www/html/ 目录下所有文件的上下文类型:
sudo chcon -R -t httpd_sys_content_t /var/www/html/
6、显示帮助信息
chcon --help
7、显示版本信息
chcon --version
8、详细模式操作
启用详细输出,修改 ~/.ssh/config 的上下文类型:
sudo chcon -v -t ssh_home_t ~/.ssh/config
说明:
实际执行时,若未添加 -v 参数,chcon 默认不输出成功信息,仅在出错时显示错误。
使用 -v 参数可查看操作详情(如上述表格中的“示例消息”)。
chcon -t httpd_sys_content_t /var/www/html/index.html # 临时修改文件类型
restorecon -v /var/www/html/index.html # 恢复默认上下文
2.2、semanage 命令
子命令/选项 | 用途说明 | 常用选项 | 示例消息/操作 |
---|---|---|---|
semanage login | 管理SELinux用户与Linux账户的映射关系 | -a (添加)、-d (删除)、-m (修改) | 将用户 user1 映射到 SELinux 用户 staff_u |
semanage user | 管理SELinux用户及其角色和权限 | -a、-d、-R (角色)、-L (限制) | 创建新SELinux用户 web_user 并分配角色 httpd_role |
semanage port | 管理网络端口与SELinux类型的绑定关系 | -a、-d、-t (类型)、-p (协议) | 将TCP端口 8080 绑定到 http_port_t 类型 |
semanage interface | 管理网络接口与SELinux类型的绑定关系 | -a、-d、-t | 将接口 eth1 绑定到 netif_t 类型 |
semanage module | 管理SELinux策略模块(启用/禁用) | -a、-d、-e (启用)、-D (禁用) | 启用策略模块 my_custom_module |
semanage fcontext | 管理文件/目录的默认SELinux上下文规则 | -a、-d、-t、-s (范围) | 添加规则:/webapps(/.*)? 的上下文类型为 httpd_sys_content_t |
semanage boolean | 管理SELinux布尔值(开关策略功能) | -1 (查看)、--on、--off | 启用布尔值 httpd_can_network_connect |
semanage dontaudit | 管理dontaudit规则(是否记录特定访问拒绝事件) | --on、--off | 关闭对 sshd 的 dontaudit 规则 |
-h / --help | 显示帮助信息 | - | 显示子命令的帮助菜单 |
-v / --verbose | 显示详细操作信息 | - | 显示添加端口 8080 的详细过程 |
-n / --noheading | 输出时隐藏列标题 | - | 仅显示端口列表数据,无标题行 |
选项使用案例
1、管理端口绑定
将TCP端口 8080 标记为HTTP服务端口:
sudo semanage port -a -t http_port_t -p tcp 8080
说明:允许Apache等HTTP服务使用8080端口。
2、管理文件上下文规则
为自定义Web目录 /opt/webapps 设置默认上下文
sudo semanage fcontext -a -t httpd_sys_content_t "/opt/webapps(/.*)?"
sudo restorecon -Rv /opt/webapps
说明:添加规则后需运行 restorecon 立即生效
3、管理SELinux用户映射
将Linux用户 dev_user 映射到SELinux用户 user_u:
sudo semanage login -a -s user_u dev_user
说明:限制用户 dev_user 的SELinux权限。
4、启用布尔值
允许HTTP服务访问网络:
sudo semanage boolean --on httpd_can_network_connect
说明:无需重启服务,立即生效。
5、管理策略模块
禁用自定义策略模块 mymodule:
sudo semanage module -D mymodule
说明:禁用后相关规则不再生效。
6、查看当前端口绑定
列出所有HTTP相关端口:
semanage port -l | grep http_port_t
输出示例:
http_port_t tcp 80, 443, 8080
7、删除文件上下文规则
移除对 /tmp/custom_dir 的上下文规则:
sudo semanage fcontext -d "/tmp/custom_dir(/.*)?"
注意事项
权限要求:大多数操作需 sudo 或 root 权限。
持久化存储:semanage 修改的规则会保存到策略库(默认路径 /etc/selinux/targeted),重启后仍有效。
结合工具使用:修改文件上下文后,需运行 restorecon 或重启服务使更改生效。
四、SELinux布尔值(Booleans)
SELinux策略通过布尔值动态调整权限控制(例如允许Apache访问用户家目录)。
getsebool -a | grep httpd# 查看所有与Apache相关的布尔值
setsebool -P httpd_enable_homedirs=on # 启用布尔值(-P永久生效)
五、日志分析与故障排除
1. 查看SELinux日志
tail -f /var/log/audit/audit.log # 直接查看原始日志
ausearch -m AVC -ts recent# 使用工具过滤日志
2. 生成解决方案建议
grep "avc: denied" /var/log/audit/audit.log | audit2allow -M mypolicy
semodule -i mypolicy.pp# 编译并加载自定义策略
六、常见问题与解决方案
场景1:Web服务器无法访问文件
现象:Apache返回403错误,但文件权限正常。
解决:
检查文件上下文:ls -Z /var/www/html
修复上下文:restorecon -Rv /var/www/html
场景2:服务无法绑定非标准端口
现象:Nginx无法监听8080端口。
解决:
semanage port -a -t http_port_t -p tcp 8080# 添加端口到SELinux策略
七、注意事项
不要随意禁用SELinux:优先使用Permissive模式调试。
谨慎使用chcon:错误修改上下文可能导致系统不稳定。
备份策略:修改策略前备份 /etc/selinux 目录。
八、练习与测试
1、将SELinux切换为Permissive模式,测试服务异常是否由SELinux引起。
临时切换(立即生效,重启后恢复)
setenforce 0
验证当前模式
getenforce
# 应显示 "Permissive"
如果需要永久修改(重启后依然生效)
sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
# 重启系统后生效
2、使用audit2why分析日志,生成解决方案并应用。
首先确保 auditd 服务正在运行
systemctl start auditd
systemctl enable auditd
分析最近的 SELinux 相关日志
ausearch -m avc -ts recent | audit2why
生成修复方案(临时生效)
ausearch -m avc -ts recent | audit2allow -M mypolicy
semodule -i mypolicy.pp
如果需要永久保存策略,可以将生成的模块保存到合适的位置
cp mypolicy.pp /usr/share/selinux/packages/
3、为FTP服务配置允许上传文件到自定义目录。
创建目录并设置权限
mkdir -p /data/ftp/upload
chown -R ftp:ftp /data/ftp
chmod -R 755 /data/ftp
chmod 775 /data/ftp/upload # 允许写入
配置 vsftpd 允许上传
vi /etc/vsftpd/vsftpd.conf
# 确保以下配置存在
write_enable=YES
local_umask=022
anon_upload_enable=YES # 如果允许匿名上传
anon_mkdir_write_enable=YES # 如果允许创建目录
配置 SELinux 策略允许 FTP 访问自定义目录
# 查看当前FTP相关的SELinux上下文
ls -Z /var/ftp
# 为自定义目录设置相同的SELinux上下文
sudo semanage fcontext -a -t public_content_rw_t "/data/ftp/upload(/.*)?"
sudo restorecon -Rv /data/ftp/upload
# 允许FTP写入
sudo setsebool -P ftpd_anon_write=1 # 匿名用户
sudo setsebool -P ftp_home_dir=1 # 本地用户
重启 vsftpd 服务
systemctl restart vsftpd
systemctl enable vsftpd