您现在的位置是:首页 >技术交流 >重生之我要当云原生大师(十七)管理SELinux安全性网站首页技术交流
重生之我要当云原生大师(十七)管理SELinux安全性
目录
一、SELinux如何保护资源?二、如何修改SELinux模式?
五、如何控制SELinux上下文?六、复制和移动时的SELinux标签有何不同?
一、SELinux如何保护资源?
SELinux(Security-Enhanced Linux)是红帽企业 Linux(RHEL)中一种强大的安全机制,它通过强制访问控制(MAC,Mandatory Access Control)来保护系统资源。以下是 SELinux 如何保护资源的主要方式:
1. 强制访问控制(MAC)
- 传统的 Linux 使用自主访问控制(DAC,Discretionary Access Control),即文件或资源的访问权限由所有者决定(如 rwx 权限)。
- SELinux 引入了 MAC,系统管理员可以定义严格的访问规则,即使 root 用户也无法绕过这些规则。
- 例如,即使一个文件的所有者设置了 777 权限,SELinux 策略仍然可以限制某些进程或用户访问该文件。
2. 基于标签的安全模型
- SELinux 为系统中的所有对象(如文件、目录、进程、端口等)分配一个安全上下文(Security Context)。
- 安全上下文由以下部分组成:
- 用户(User):SELinux 用户,与普通 Linux 用户不同。
- 角色(Role):定义用户可以访问的对象类型。
- 类型(Type):最重要的部分,定义对象的类型(如文件类型或进程域)。
- 级别(Level):用于多级安全(MLS)或多类别安全(MCS)。
- 通过类型强制(Type Enforcement),SELinux 确保只有具有特定类型的进程才能访问特定类型的资源。
3. 最小权限原则
- SELinux 遵循最小权限原则,默认情况下拒绝所有访问,只有在策略中明确允许的访问才会被授权。
- 例如,一个 Web 服务器进程(如 httpd)只能访问与其类型(如 httpd_t)相关的文件和目录,而不能访问其他类型的资源。
4. 保护关键系统资源
- SELinux 可以防止恶意程序或用户滥用系统资源。例如:
- 限制普通用户访问系统配置文件。
- 防止 Web 服务器进程修改系统文件。
- 限制容器或虚拟机访问主机资源。
5. 防止权限提升攻击
- SELinux 可以防止进程通过漏洞提升权限。例如,即使一个进程被攻击并获得了 root 权限,SELinux 仍然会限制其访问范围,使其无法执行超出其安全上下文的操作。
6. 灵活的策略管理
- SELinux 使用策略文件来定义访问规则。RHEL 默认提供了预定义的策略(如 targeted 策略),管理员也可以根据需要自定义策略。
- 策略文件定义了哪些进程可以访问哪些资源,以及如何进行访问。
7. 日志和审计
- SELinux 会记录所有被拒绝的访问尝试,这些日志可以通过 auditd 或 ausearch 工具查看。
- 管理员可以通过分析日志来调整策略或检测潜在的安全威胁。
8. 多级安全(MLS)和多类别安全(MCS)
- SELinux 支持 MLS 和 MCS,适用于需要更高安全级别的环境(如军事或政府机构)。
- MLS 允许将资源划分为不同的安全级别(如机密、秘密、绝密)。
- MCS 通常用于容器化环境,确保不同容器之间的资源隔离。
9. 保护网络资源
- SELinux 可以为网络端口、套接字等资源分配安全上下文,限制哪些进程可以绑定或访问这些资源。
- 例如,只有 httpd_t 类型的进程可以绑定到 HTTP 端口(80/tcp)。
10. 与容器和虚拟化集成
- SELinux 在容器(如 Docker 和 Podman)和虚拟化环境中提供了额外的安全层。
- 例如,SELinux 可以防止容器逃逸攻击,确保容器无法访问主机文件系统。
总结
SELinux 通过强制访问控制、安全上下文、最小权限原则和灵活的策略管理,为 RHEL 提供了强大的资源保护机制。它可以有效防止恶意软件、权限提升攻击和资源滥用,是 RHEL 安全架构的重要组成部分。
二、如何修改SELinux模式?
在红帽企业 Linux(RHEL)中,SELinux 有三种运行模式:Enforcing(强制模式)、Permissive(宽容模式)和Disabled(禁用模式)。你可以根据需要修改 SELinux 的模式。以下是具体方法:
1. 查看当前 SELinux 状态
在修改 SELinux 模式之前,可以先查看当前的状态和模式:
sestatus
输出示例:
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
...
或者使用以下命令快速查看模式:
getenforce
输出可能是 Enforcing、Permissive 或 Disabled。
2. 临时修改 SELinux 模式
你可以临时修改 SELinux 的模式,重启后会恢复为配置文件中的模式。
- 切换到 Enforcing 模式:
sudo setenforce 1
- 切换到 Permissive 模式:
sudo setenforce 0
- 注意:
- Disabled 模式不能通过 setenforce 命令设置,只能通过修改配置文件实现。
- 临时修改的模式在系统重启后会失效。
3. 永久修改 SELinux 模式
如果需要永久修改 SELinux 的模式,需要编辑配置文件并重启系统。
- 编辑 SELinux 配置文件 /etc/selinux/config:
sudo vi /etc/selinux/config
- 找到以下行并修改 SELINUX 的值:
SELINUX=enforcing # 强制模式
SELINUX=permissive # 宽容模式
SELINUX=disabled # 禁用模式
- 保存文件并退出编辑器。
- 重启系统以使更改生效:
sudo reboot
4. 从 Disabled 模式切换到 Enforcing/Permissive 模式
如果 SELinux 当前处于 Disabled 模式,切换到 Enforcing 或 Permissive 模式需要额外的步骤:
- 编辑 /etc/selinux/config 文件,将 SELINUX 设置为 enforcing 或 permissive。
- 在系统根目录下创建空文件 .autorelabel:
sudo touch /.autorelabel
- 重启系统:sudo reboot
- 系统重启后,SELinux 会重新标记所有文件的安全上下文,这可能需要一些时间。
5. 验证 SELinux 模式
修改后,可以通过以下命令验证 SELinux 的当前模式:
getenforce
或者查看详细信息:
sestatus
6. 模式说明
- Enforcing(强制模式):
- SELinux 强制执行所有策略,拒绝未经授权的访问。
- 适用于生产环境。
- Permissive(宽容模式):
- SELinux 记录违规行为,但不会阻止访问。
- 适用于调试和测试 SELinux 策略。
- Disabled(禁用模式):
- SELinux 完全关闭,不提供任何保护。
不建议在生产环境中使用。
三、普通文件权限安全模式的隐患?
文件权限控制特定用户或组的文件访问权限,但是不会阻止具有文件权限的授权用户将文件用于非预期用途。
四、SELinux的主要目标是什么?
保护用户数据,以便被已遭泄露的应用或系统应服务访问。
五、如何控制SELinux上下文?
1. 查看 SELinux 上下文
在管理 SELinux 上下文之前,首先需要查看对象的当前上下文。
- 查看文件的 SELinux 上下文:
ls -Z /path/to/file
示例输出:
-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html
其中 system_u:object_r:httpd_sys_content_t:s0 就是文件的 SELinux 上下文。
- 查看目录的 SELinux 上下文:
ls -Zd /path/to/directory
- 查看进程的 SELinux 上下文:
ps -Z -p <PID>
或者查看当前进程的上下文:
ps -Z
- 查看端口的 SELinux 上下文:
sudo semanage port -l
2. 修改文件的 SELinux 上下文
可以使用 chcon 命令临时修改文件或目录的 SELinux 上下文。
- 修改文件的上下文:
sudo chcon -t <type> /path/to/file
例如,将文件的类型修改为 httpd_sys_content_t:
sudo chcon -t httpd_sys_content_t /var/www/html/index.html
- 递归修改目录及其内容的上下文:
sudo chcon -R -t <type> /path/to/directory
- 恢复文件的默认上下文:
如果希望将文件或目录的上下文恢复为默认值,可以使用 restorecon 命令:
sudo restorecon -v /path/to/file
递归恢复目录及其内容的上下文:
sudo restorecon -Rv /path/to/directory
3. 设置默认的 SELinux 上下文
SELinux 使用文件上下文规则(File Context Rules)来定义文件和目录的默认上下文。这些规则存储在 /etc/selinux/targeted/contexts/files/ 目录下的文件中。
- 查看文件的默认上下文:
sudo matchpathcon /path/to/file
- 添加自定义的默认上下文:
使用 semanage fcontext 命令可以添加或修改默认上下文规则。
sudo semanage fcontext -a -t <type> "/path/to/file(/.*)?"
例如,将 /var/www/html 目录及其内容的默认类型设置为 httpd_sys_content_t:
sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?"
- 应用新的默认上下文:
添加规则后,使用 restorecon 命令应用新的上下文:
sudo restorecon -Rv /var/www/html
- 删除自定义的默认上下文:
如果需要删除自定义的上下文规则,可以使用 semanage fcontext -d:
sudo semanage fcontext -d "/path/to/file(/.*)?"
4. 修改进程的 SELinux 上下文
进程的 SELinux 上下文通常由启动它的可执行文件的上下文决定。如果需要修改进程的上下文,可以通过以下方式:
- 修改可执行文件的上下文:
使用 chcon 或 semanage fcontext 修改可执行文件的上下文。 - 使用 runcon 启动进程:
可以使用 runcon 命令以指定的上下文启动进程:
sudo runcon -t <type> -u <user> -r <role> <command>
例如:
sudo runcon -t httpd_t -u system_u -r system_r /usr/sbin/httpd
5. 修改端口的 SELinux 上下文
SELinux 为网络端口分配了上下文,以限制哪些进程可以绑定到特定端口。
- 查看端口的上下文:
sudo semanage port -l
- 添加端口的上下文:
例如,允许 httpd_t 类型的进程绑定到端口 8080:
sudo semanage port -a -t http_port_t -p tcp 8080
- 删除端口的上下文:
sudo semanage port -d -p tcp 8080
6. 管理布尔值(Booleans)
SELinux 布尔值是一些开关,用于控制 SELinux 策略的某些行为。通过调整布尔值,可以快速修改 SELinux 的行为。
- 查看所有布尔值:
sudo getsebool -a
- 查看特定布尔值的状态:
sudo getsebool <boolean_name>
- 修改布尔值:
例如,启用 httpd_can_network_connect 布尔值:
sudo setsebool -P httpd_can_network_connect on
-P 选项表示永久生效。
7. 自定义 SELinux 策略模块
如果默认的 SELinux 策略无法满足需求,可以创建自定义策略模块。
- 生成自定义策略模块:
使用 audit2allow 工具根据日志生成自定义策略模块:
sudo grep <denied_message> /var/log/audit/audit.log | audit2allow -M mypolicy
- 安装自定义策略模块:
sudo semodule -i mypolicy.pp
六、复制和移动时的SELinux标签有何不同?
默认复制时,SELinux上下文和复制的目标目录保持一致,
默认移动时,SELinux上下文和源目录保持一致。
可以通过加参数改变





QT多线程的5种用法,通过使用线程解决UI主界面的耗时操作代码,防止界面卡死。...
U8W/U8W-Mini使用与常见问题解决
stm32使用HAL库配置串口中断收发数据(保姆级教程)
分享几个国内免费的ChatGPT镜像网址(亲测有效)
Allegro16.6差分等长设置及走线总结