hello大家好😊
SELinux原理❓
概念
SELinux(Security-Enhanced Linux)是一种强化安全性的 Linux 安全模块,它采用了强制访问控制(Mandatory Access Control,MAC)机制来加强操作系统的安全性。
我们大都熟悉标准的用户、组、其他 rwx权限安全模型,这种基于用户和组的模型称为自由决定的访问控制(Discretionary Access Control,DAC)。在DAC中,资源的所有者决定谁可以访问其资源,并将访问权限授予其他用户。但是,这种控制层级较低,可能在高度定制的安全环境中不足以提供必要的保护
相比之下,SELinux 使用强制访问控制(MAC)规则,不受资源所有者的自由决定,通过策略限制进程和用户对资源的访问,提供了更高级别的系统安全性
示例
接下来我们通过一个例子看一下SELinux如何发挥作用:
假设你的系统是一个 Web 服务器,运行着一个名为 “MyWebApp” 的网站,网站的根目录是*/var/www/html/MyWebApp*。此时,SELinux 启用并运行
- 没有 SELinux 时(仅使用文件权限):
在没有 SELinux 的情况下,我们设置了合适的文件权限,使得 Apache 服务器可以读取和服务 /var/www/html/MyWebApp 目录下的文件。此时,Apache 进程对这个目录有读取权限,并且能够执行其中的脚本和服务请求。但是,如果 Apache 进程被攻击者入侵,攻击者可以读取和执行该目录下的所有文件,这可能导致系统被入侵、文件被篡改或敏感信息泄露 - 启用 SELinux 后
当启用 SELinux 后,Apache 进程会被赋予一个特定的安全上下文,表示它的用户、角色和类型。同时,/var/www/html/MyWebApp 目录及其中的文件也会被赋予特定的安全上下文。
💡 假设 Apache 进程被赋予类型上下文 httpd_t,而 /var/www/html/MyWebApp 目录被赋予类型上下文 httpd_sys_content_t。此时,即使 Apache 进程在文件权限层面上具有读取和执行目录的权限,由于 SELinux 强制访问控制(MAC)机制,只有 httpd_t 类型的进程才能访问具有 httpd_sys_content_t 上下文的目录。
❗ 如果有一个恶意进程(非 httpd_t 类型)企图读取或执行 /var/www/html/MyWebApp 目录,SELinux 会阻止该操作,即使文件权限允许。因为它不符合 SELinux 策略中规定的访问规则。
🖐同时,其他系统资源如数据库文件、用户信息等也可能被分配特定的安全上下文,并受到 SELinux 的保护。攻击者即使入侵了一个进程,由于 SELinux 的限制,他们仍然受到更严格的权限控制,不能随意访问和修改其他资源
启用/禁用 SELinux
如果需要启用或禁用 SELinux,可以编辑 /etc/selinux/config 文件,并将 SELINUX 参数设置为 enforcing(启用)或 disabled(禁用)
我们也可以用命令的方式查看和更改模式。比如要确定当前的SELinux模式,运行getenforce
命令。要将SELinux设置为其他模式,使用 setenforce
命令
配置SELinux上下文❓
SELinux上下文(SELinux Context)是什么
在运行SELinux的系统上,所有进程和文件都会有相应的标签。标签代表了与安全有关的信息,称为SELinux上下文。
SELinux 上下文的格式通常是 “user:role:type”,例如 “system_u:object_r:httpd_sys_content_t”。其中,“system_u” 表示用户标识符,“object_r” 表示角色标识符,“httpd_sys_content_t” 表示类型标识符(每个对象都被赋予一个唯一的类型标识符,通过类型标识符限制了进程和资源之间的访问)。
显示文件或目录上的SELinux上下文
我们使用 ls 命令结合 -Z 选项来显示文件或目录上的 SELinux 上下文
示例:
ls -Z example.txt #显示文件 "example.txt" 的 SELinux 上下文
ls -Zd my_directory #显示目录 "my_directory" 的 SELinux 上下文
更改文件的SELinux上下文
用于更改文件 SELinux上下文的命令包括: semanage fcontext
、restorecon
和chcon
。
chcon
chcon命令临时更改SELinux上下文。也就是说它不会将上下文更改保存到SELinux上下文数据库中,当使用restorecon命令后,chcon命令所做的更改无法保留
semanage fcontext
为文件设置SELinux上下文的首选方法是使用semanage fcontext
命令来声明文件的默认标签然后使用restorecon
命令将该上下文应用于文件
semanage fcontext命令的选项参考(部分):
选项 | 描述 |
---|---|
-a ,- -add | 添加新的规则 |
-d ,- -delete | 删除现有的文件的规则 |
-l ,- -list | 列出当前定义的文件的上下文规则 |
-t, --type=TYPE | 指定要应用的目标上下文类型 |
示例
假设我们有一个 Web 应用程序,其根目录是 /var/www/html/MyWebApp,我们想要将该目录及其子目录和文件的安全上下文设置为 httpd_sys_content_t 类型,以便 Apache Web 服务器可以访问它。
首先,使用以下命令添加上下文规则
semanage fcontext -a -t httpd_sys_content_t "/var/www/html/MyWebApp(/.*)?"
- -a 表示添加新的规则
- -t 指定了要应用的目标上下文类型
- “/var/www/html/MyWebApp(/.*)?” 是一个正则表达式,匹配 /var/www/html/MyWebApp 及其子目录和文件
然后,使用以下命令使规则生效:
restorecon -Rv /var/www/html/MyWebApp
- -R 表示递归地恢复所有文件上下文
- -v 表示显示详细信息
现在,/var/www/html/MyWebApp 及其所有子目录和文件都具有了 httpd_sys_content_t 类型的安全上下文,允许 Apache Web 服务器访问这个 Web 应用程序
❗ 注意,使用
semanage fcontext
和restorecon
命令需要具有超级用户权限(root)。在使用这些工具时,务必小心并确保了解 SELinux策略的影响。不正确的上下文设置可能导致应用程序无法访问文件,因此建议在生产环境中谨慎操作,并备份相关文件和配置
总结💯
好啦,我们现在来总结一下:
- SELinux(Security-Enhanced Linux)是一种强制访问控制(Mandatory Access Control,MAC)系统,它使用类型强制机制将每个对象(进程、文件、目录等)分配给一个唯一的安全类型;使用安全策略来定义系统中的规则和规范,指定了哪些进程、用户、角色和类型可以访问特定的资源,以及在什么条件下允许访问。通过这些 机制,SELinux 实现了高级别的安全控制,限制了未经授权的访问,提供了额外的安全层级
- 我们使用
semanage fcontext
、restorecon
和chcon
这些命令更改SELinux上下文
感谢💖
好啦,这次的分享就到这里,感谢大家看到这里🤞