目录

SELinux安全上下文

SELinux安全上下文

一、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错误,但文件权限正常。

  • 解决

    1. 检查文件上下文:ls -Z /var/www/html
    2. 修复上下文:restorecon -Rv /var/www/html

场景2:服务无法绑定非标准端口

  • 现象:Nginx无法监听8080端口。

  • 解决

    
    semanage port -a -t http_port_t -p tcp 8080# 添加端口到SELinux策略

七、注意事项

  1. 不要随意禁用SELinux:优先使用Permissive模式调试。
  2. 谨慎使用chcon:错误修改上下文可能导致系统不稳定。
  3. 备份策略:修改策略前备份 /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