您现在的位置是:首页 >技术交流 >重生之我要当云原生大师(十七)管理SELinux安全性网站首页技术交流

重生之我要当云原生大师(十七)管理SELinux安全性

小刘爱喇石( ˝ᗢ̈˝ ) 2026-03-18 12:01:04
简介重生之我要当云原生大师(十七)管理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 模式需要额外的步骤:

  1. 编辑 /etc/selinux/config 文件,将 SELINUX 设置为 enforcing 或 permissive。
  2. 在系统根目录下创建空文件 .autorelabel:

sudo touch /.autorelabel

  1. 重启系统:sudo reboot
  2. 系统重启后,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上下文和源目录保持一致。

可以通过加参数改变

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。