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
相关推荐
bug攻城狮2 小时前
解决Ubuntu中apt-get -y安装时弹出交互提示的问题
linux·运维·ubuntu
xiachong273 小时前
ubuntu18.04安装PCL1.14
linux·ubuntu
夜阑珊夭夭3 小时前
linux自定义网卡名字
linux·运维
czhc11400756633 小时前
Linux912 shell:$# $1 $?;RHEL 8 AppStream BaseOS
linux
佛天华3 小时前
centos 时间校准
linux·运维·centos
小柯J桑_4 小时前
Linux:线程封装
linux·运维·c++
先锋队长5 小时前
linux系统搭建nacos集群,并通过nginx实现负载均衡
linux·nginx·负载均衡
zwhSunday5 小时前
Linux驱动开发(1)概念、环境与代码框架
linux·运维·驱动开发