SELinux安全上下文

一、SELinux 简介

1、什么是 SELinux?(Security-Enhanced Linux)

是Linux内核的**强制访问控制(MAC)**安全子系统,提供更细粒度的权限控制,防止进程或用户越权操作。

2、核心思想

  • 最小权限原则:进程/用户只能访问其明确需要的资源。

  • 基于标签的访问控制:所有资源(文件、端口、进程)被赋予安全上下文(Security Context)。

3、工作模式

模式 描述
Enforcing 强制执行策略,拒绝非法操作并记录日志。
Permissive 仅记录违规操作,不阻止(用于调试)。
Disabled 完全关闭SELinux(需重启生效)。

二、基础操作命令

1. 查看SELinux状态

cpp 复制代码
getenforce# 查看当前模式
sestatus# 详细状态(模式/策略类型)

2. 切换工作模式

cpp 复制代码
setenforce 0# 切换到Permissive模式
setenforce 1# 切换到Enforcing模式

注意:setenforce仅临时生效,永久修改需编辑 /etc/selinux/config 文件。

三、安全上下文(Security Context)

1. 查看上下文

cpp 复制代码
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:

cpp 复制代码
sudo chcon -t httpd_sys_content_t /var/www/html/index.html
2、设置用户部分

将 /etc/nginx/nginx.conf 的用户部分设为 system_u:

cpp 复制代码
sudo chcon -u system_u /etc/nginx/nginx.conf
3、设置角色部分

将 /home/user/file.txt 的角色部分设为 object_r:

cpp 复制代码
sudo chcon -r object_r /home/user/file.txt
4、参照文件上下文

将 file2 的上下文设置为与 file1 一致:

cpp 复制代码
sudo chcon --reference=file1 file2
5、递归操作目录

递归修改 /var/www/html/ 目录下所有文件的上下文类型:

cpp 复制代码
sudo chcon -R -t httpd_sys_content_t /var/www/html/
6、显示帮助信息
cpp 复制代码
chcon --help
7、显示版本信息
cpp 复制代码
chcon --version
8、详细模式操作

启用详细输出,修改 ~/.ssh/config 的上下文类型:

cpp 复制代码
sudo chcon -v -t ssh_home_t ~/.ssh/config

说明

  • 实际执行时,若未添加 -v 参数,chcon 默认不输出成功信息,仅在出错时显示错误。

  • 使用 -v 参数可查看操作详情(如上述表格中的"示例消息")。

cpp 复制代码
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服务端口:

cpp 复制代码
sudo semanage port -a -t http_port_t -p tcp 8080

说明:允许Apache等HTTP服务使用8080端口。

2、管理文件上下文规则

为自定义Web目录 /opt/webapps 设置默认上下文

cpp 复制代码
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:

cpp 复制代码
sudo semanage login -a -s user_u dev_user

说明:限制用户 dev_user 的SELinux权限。

4、启用布尔值

允许HTTP服务访问网络:

cpp 复制代码
sudo semanage boolean --on httpd_can_network_connect

说明:无需重启服务,立即生效。

5、管理策略模块

禁用自定义策略模块 mymodule:

cpp 复制代码
sudo semanage module -D mymodule

说明:禁用后相关规则不再生效。

6、查看当前端口绑定

列出所有HTTP相关端口:

cpp 复制代码
semanage port -l | grep http_port_t

输出示例

cpp 复制代码
http_port_t    tcp    80, 443, 8080
7、删除文件上下文规则

移除对 /tmp/custom_dir 的上下文规则:

cpp 复制代码
sudo semanage fcontext -d "/tmp/custom_dir(/.*)?"

注意事项

  • 权限要求:大多数操作需 sudo 或 root 权限。

  • 持久化存储:semanage 修改的规则会保存到策略库(默认路径 /etc/selinux/targeted),重启后仍有效。

  • 结合工具使用:修改文件上下文后,需运行 restorecon 或重启服务使更改生效。

四、SELinux布尔值(Booleans)

SELinux策略通过布尔值动态调整权限控制(例如允许Apache访问用户家目录)。

cpp 复制代码
getsebool -a | grep httpd# 查看所有与Apache相关的布尔值
setsebool -P httpd_enable_homedirs=on # 启用布尔值(-P永久生效)

五、日志分析与故障排除

1. 查看SELinux日志

cpp 复制代码
tail -f /var/log/audit/audit.log # 直接查看原始日志
ausearch -m AVC -ts recent# 使用工具过滤日志

2. 生成解决方案建议

cpp 复制代码
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端口。

  • 解决

    cpp 复制代码
    semanage port -a -t http_port_t -p tcp 8080# 添加端口到SELinux策略

七、注意事项

  1. 不要随意禁用SELinux:优先使用Permissive模式调试。

  2. 谨慎使用chcon:错误修改上下文可能导致系统不稳定。

  3. 备份策略:修改策略前备份 /etc/selinux 目录。

八、练习与测试

1、将SELinux切换为Permissive模式,测试服务异常是否由SELinux引起。

临时切换(立即生效,重启后恢复)

cpp 复制代码
setenforce 0

验证当前模式

cpp 复制代码
getenforce
# 应显示 "Permissive"

如果需要永久修改(重启后依然生效)

cpp 复制代码
sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
# 重启系统后生效

2、使用audit2why分析日志,生成解决方案并应用。

首先确保 auditd 服务正在运行

cpp 复制代码
systemctl start auditd
systemctl enable auditd

分析最近的 SELinux 相关日志

cpp 复制代码
ausearch -m avc -ts recent | audit2why

生成修复方案(临时生效)

cpp 复制代码
ausearch -m avc -ts recent | audit2allow -M mypolicy
semodule -i mypolicy.pp

如果需要永久保存策略,可以将生成的模块保存到合适的位置

cpp 复制代码
cp mypolicy.pp /usr/share/selinux/packages/

3、为FTP服务配置允许上传文件到自定义目录。

创建目录并设置权限

cpp 复制代码
mkdir -p /data/ftp/upload
chown -R ftp:ftp /data/ftp
chmod -R 755 /data/ftp
chmod 775 /data/ftp/upload  # 允许写入

配置 vsftpd 允许上传

cpp 复制代码
vi /etc/vsftpd/vsftpd.conf
# 确保以下配置存在
write_enable=YES
local_umask=022
anon_upload_enable=YES  # 如果允许匿名上传
anon_mkdir_write_enable=YES  # 如果允许创建目录

配置 SELinux 策略允许 FTP 访问自定义目录

cpp 复制代码
# 查看当前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 服务

cpp 复制代码
systemctl restart vsftpd
systemctl enable vsftpd
相关推荐
实心儿儿26 分钟前
Linux —— 基础开发工具5
linux·运维·算法
oMcLin29 分钟前
如何在SUSE Linux Enterprise Server 15 SP4上通过配置并优化ZFS存储池,提升文件存储与数据备份的效率?
java·linux·运维
我是苏苏1 小时前
Web开发:C#通过ProcessStartInfo动态调用执行Python脚本
java·服务器·前端
相偎3 小时前
Ubuntu搭建svn服务器
服务器·ubuntu·svn
咕噜企业分发小米4 小时前
有哪些开源的直播云服务器安全防护方案?
运维·服务器·云计算
开开心心_Every4 小时前
安卓后台录像APP:息屏录存片段,行车用
java·服务器·前端·学习·eclipse·edge·powerpoint
qq_316837754 小时前
IP网段冲突 配置指定ip使用指定的网络接口发送,而不经过默认网关
服务器·网络·tcp/ip
王阿巴和王咕噜5 小时前
【WSL】安装并配置适用于Linux的Windows子系统(WSL)
linux·运维·windows
布史5 小时前
Tailscale虚拟私有网络指南
linux·网络
水天需0105 小时前
shift 命令详解
linux