翼度科技»论坛 云主机 LINUX 查看内容

SELinux 入门 pt.2

2

主题

2

帖子

6

积分

新手上路

Rank: 1

积分
6
哈喽大家好,我是咸鱼
在《SELinux 入门 pt.1》中,咸鱼向各位小伙伴介绍了 SELinux 所使用的 MAC 模型、以及几个重要的概念(主体、目标、策略、安全上下文)
我们还讲到:

  • 对于受 SELinux 管制的进程,会先检查 SELinux 策略规则,然后再检查 DAC 规则
  • 对于不受 SELinux 管制的进程,仍然会执行 DAC 规则
也就是说对于受 SELinux 管制的进程而言,想要对文件资源进行操作,需要先经过 SELinux 策略规则的三个关卡(SELinux 模式查看——>策略规则比对——>安全上下文比对),然后再经过 DAC 规则中的 rwx 权限比对
过程如下图所示

需要注意的是,并不是所有的程序都会被 SELinux 所管制,被 SELinux 管制的进程主体被称为【受限程序主体】
举个例子,我们看一下 crond 进程和 bash 进程
  1. # 通过 ps 命令查看
  2. [root@localhost ~]# ps -eZ | grep -E 'cron|bash'
  3. system_u:system_r:crond_t:s0-s0:c0.c1023 1340 ? 00:00:00 atd
  4. unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 28094 pts/0 00:00:00 bash
  5. system_u:system_r:crond_t:s0-s0:c0.c1023 28174 ? 00:00:00 crond
复制代码
可以看到,crond 是受限的主体进程(crond_t),而 bash 因为是本机进程,因此就是不受限 unconfined_t 的类型,即 bash 可以直接进行 rwx 权限比对,而不需要进行 SELinux 策略规则比对
接下来我们来分别看一下 SELinux 策略规则比对中的三个关卡
SELinux 运行模式

受限程序主体首先来到第一关:SELinux 运行模式比对
SELinux 有三种运行模式,用于控制系统中进程和文件资源访问的安全性
这三种模式分别是:

  • Enforcing(强制)
这个是默认的模式,在这个模式下 SELinux 正常运行,会强制执行访问控制规则,限制进程和用户对系统资源的访问
如果一个进程试图执行未经授权的操作,如读取或修改受限文件,强制模式会阻止这些操作并记录相关的安全事件

  • permissive(宽松)
在宽松模式下,SELinux 会记录违反访问规则的操作,但不会阻止它们
这允许用户查看哪些操作会受到限制,但不会影响应用程序的正常运行
宽容模式通常用于识别需要修改的规则,以确保应用程序在强制模式下可以正常运行

  • disabled(禁用)
在禁用模式下,SELinux 完全被关闭,不再对进程和文件访问进行任何安全限制
如何查看当前 SELinux 的运行模式?
  1. [root@localhost ~]# getenforce
  2. Enforcing
复制代码
如果返回结果是 Enforcing,表示当前运行在强制模式;如果是 Permissive,表示运行在宽容模式;如果是 Disabled,表示 SELinux 被禁用
如何切换 SELinux 运行模式?

  • 临时切换
  1. # 更改为 enforcing 模式
  2. [root@localhost ~]# setenforce 1
  3. # 更改为 permissive 模式
  4. [root@localhost ~]# setenforce 0
复制代码
PS:临时切换系统重启后会恢复为默认模式
如果 SELinux 为 disabled 运行模式,表示 SELinux 已经关闭,是无法切换成  Enforcing 模式或 Permissive 模式的

  • 永久切换
如果要永久更改,需要修改配置文件
以 CentOS 7.x 为例
  1. [root@localhost ~]# vim /etc/selinux/config
复制代码
将 SELINUX 的值更改为 enforcing、permissive 或 disabled,保存文件然后重启系统
策略与规则

受限主体程序通过第一关之后来到第二关——策略(policy)和规则(rule)比对
可以使用 sestatus 来查看当前 SELinux 使用那些策略
  1. sestatus
  2. -v:检查位于 /etc/sestatus.conf 中的文件与进程的安全上下文
  3. -b:显示当前策略的规则(以布尔值列出)
复制代码
  1. [root@localhost ~]# sestatus
  2. SELinux status:                 enabled # selinux 是否启动
  3. SELinuxfs mount:                /sys/fs/selinux # selinux 相关文件挂载点
  4. SELinux root directory:         /etc/selinux # 根目录
  5. Loaded policy name:             targeted # 当前策略
  6. Current mode:                   permissive # 当前模式
  7. Mode from config file:          enforcing # 当前在配置文件内的模式
  8. Policy MLS status:              enabled # 是否包含 MLS 模式
  9. Policy deny_unknown status:     allowed # 是否预设抵挡未知的主体进程
  10. Max kernel policy version:      31
复制代码
如果想要查看当前策略下的规则,可以使用setatus -b 或者 getsebool 命令
  1. [root@localhost ~]# sestatus -a
  2. [root@localhost ~]# getsebool
复制代码
  1. [root@localhost ~]# getsebool -a
  2. abrt_anon_write --> off
  3. abrt_handle_event --> off
  4. abrt_upload_watch_anon_write --> on
  5. antivirus_can_scan_system --> off
  6. antivirus_use_jit --> off
  7. auditadm_exec_content --> on
  8. authlogin_nsswitch_use_ldap --> off
  9. authlogin_radius --> off
  10. authlogin_yubikey --> off
  11. awstats_purge_apache_log_files --> off
  12. boinc_execmem --> on
  13. cdrecord_read_content --> off
  14. cluster_can_network_connect --> off
  15. cluster_manage_all_files --> off
  16. cluster_use_execmem --> off
  17. cobbler_anon_write --> off
  18. ...
复制代码
我们可以看到上面的输出中有特别多的 SELinux 规则,但是每个规则中具体是怎么限制的我们却还不知道
我们可以通过 seinfo 等工具进行查看
  1. # 需要先下载
  2. [root@localhost ~]# yum install -y setools-console
复制代码
  1. # 可以看到策略是 targeted,这个策略的安全上下文类型有 4793 个,而规则(Booleans)则有 316 条
  2. [root@localhost ~]# seinfo
  3. Statistics for policy file: /sys/fs/selinux/policy
  4. Policy Version & Type: v.31 (binary, mls)
  5.    Classes:           130    Permissions:       272
  6.    Sensitivities:       1    Categories:       1024
  7.    Types:            4793    Attributes:        253
  8.    Users:               8    Roles:              14
  9.    Booleans:          316    Cond. Expr.:       362
  10.    Allow:          107834    Neverallow:          0
  11.    Auditallow:        158    Dontaudit:       10022
  12.    Type_trans:      18153    Type_change:        74
  13.    Type_member:        35    Role allow:         37
  14.    Role_trans:        414    Range_trans:      5899
  15.    Constraints:       143    Validatetrans:       0
  16.    Initial SIDs:       27    Fs_use:             32
  17.    Genfscon:          103    Portcon:           614
  18.    Netifcon:            0    Nodecon:             0
  19.    Permissives:         0    Polcap:              5
复制代码
  1. # 查看用户
  2. [root@localhost ~]# seinfo -u
  3. Users: 8
  4.    sysadm_u
  5.    system_u
  6.    xguest_u
  7.    root
  8.    guest_u
  9.    staff_u
  10.    user_u
  11.    unconfined_u
  12. # 查看角色
  13. [root@localhost ~]# seinfo -r
  14. Roles: 14
  15.    auditadm_r
  16.    dbadm_r
  17.    guest_r
  18.    staff_r
  19.    user_r
  20.    logadm_r
  21.    object_r
  22.    secadm_r
  23.    sysadm_r
  24.    system_r
  25.    webadm_r
  26.    xguest_r
  27.    nx_server_r
  28.    unconfined_r
复制代码
前面我们知道 crond 进程的类型是 crond_t,那我想知道 crond_t 这个 domain 能够读取那些 type 的文件资源
  1. # 查询 crond_d 主体
  2. [root@localhost ~]# sesearch -A -s crond_t
  3. ...
  4.    allow crond_t user_cron_spool_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ;
  5.    allow crond_t user_cron_spool_t : dir { ioctl read write getattr lock add_name remove_name search open } ;
  6.    allow crond_t unconfined_cronjob_t : process transition ;
  7.    allow crond_t openshift_domain : process transition ;
  8.    allow crond_t security_t : lnk_file { read getattr } ;
  9. ...
复制代码
allow 后面接主体进程以及文件的 SELinux 类型,比如说 crond_t 可以读取 user_cron_spool_t 类型的文件和目录
那如果想要关闭或打开某个 SELinux 规则,该怎么办
  1. # 查询到下面的规则是 off 状态,我们想打开它
  2. [root@localhost ~]# getsebool httpd_enable_homedirs
  3. httpd_enable_homedirs --> off
  4. # 启动
  5. # 一定要加上 -P ,这样才会写入配置文件
  6. [root@localhost ~]# setsebool -P httpd_enable_homedirs 1
复制代码
安全上下文

第一关考虑 SELinux 三种运行模式,第二关考虑了 SELinux 的策略规则
现在我们来到了第三关——安全上下文比对
关于安全上下的知识我在《SELinux 入门 pt.1》中已经介绍过了,今天我们着重讲下安全上下文的修改

  • chcon 手动修改
chcon 命令的基本语法如下:
  1. chcon [options] context file...
复制代码
其中,context表示要设置的安全上下文,file...表示要修改的文件或目录路径。下面是一些常用的选项和示例:

  • -R, --recursive: 递归修改指定目录下所有文件的安全上下文
  • -t, --type: 指定要设置的新类型标签
  • -u, --user: 指定要设置的新用户
  • -r, --role: 指定要设置的新角色
举几个例子
  1. # 修改文件的安全上下文类型:
  2. chcon -t httpd_sys_content_t /var/www/html/index.html
  3. # 递归修改目录及其子目录中的文件安全上下文类型:
  4. chcon -R -t httpd_sys_content_t /var/www/html/
  5. # 修改文件的安全上下文用户和角色:
  6. chcon -u system_u -r object_r /path/to/file
复制代码

  • restorecon 恢复为默认值
使用 chcon 命令修改安全上下文可能会导致某些文件和目录的访问权限问题
如果对 SELinux 的运作机制和相应的安全策略不熟悉的,可以使用 restorecon 命令恢复默认的 SELinux 上下文
基本语法如下:
  1. restorecon [-R] [-v] [file...]
  2. -R :表示递归地操作目录及其子目录
  3. -v :表示显示详细信息
  4. file... :是要进行恢复的文件或目录路径
复制代码
举个例子
  1. # 恢复单个文件的安全上下文:
  2. restorecon /var/www/html/index.html
  3. # 递归地恢复目录及其子目录的安全上下文:
  4. restorecon -R /var/www/html/
  5. # 显示详细信息:
  6. restorecon -v /var/www/html/index.html
复制代码
来源:https://www.cnblogs.com/edisonfish/p/17657750.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具