南昌建设工程质量监督网站,网站费用单,页面关键词优化,怎样建立自己的网站卖东西哈喽大家好#xff0c;我是咸鱼
在《SELinux 入门 pt.1》中#xff0c;咸鱼向各位小伙伴介绍了 SELinux 所使用的 MAC 模型、以及几个重要的概念#xff08;主体、目标、策略、安全上下文#xff09;
我们还讲到#xff1a;
对于受 SELinux 管制的进程#xff0c;会先…哈喽大家好我是咸鱼
在《SELinux 入门 pt.1》中咸鱼向各位小伙伴介绍了 SELinux 所使用的 MAC 模型、以及几个重要的概念主体、目标、策略、安全上下文
我们还讲到
对于受 SELinux 管制的进程会先检查 SELinux 策略规则然后再检查 DAC 规则对于不受 SELinux 管制的进程仍然会执行 DAC 规则
也就是说对于受 SELinux 管制的进程而言想要对文件资源进行操作需要先经过 SELinux 策略规则的三个关卡SELinux 模式查看——策略规则比对——安全上下文比对然后再经过 DAC 规则中的 rwx 权限比对
过程如下图所示 需要注意的是并不是所有的程序都会被 SELinux 所管制被 SELinux 管制的进程主体被称为【受限程序主体】
举个例子我们看一下 crond 进程和 bash 进程
# 通过 ps 命令查看
[rootlocalhost ~]# ps -eZ | grep -E cron|bash
system_u:system_r:crond_t:s0-s0:c0.c1023 1340 ? 00:00:00 atd
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 28094 pts/0 00:00:00 bash
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 的运行模式
[rootlocalhost ~]# getenforce
Enforcing如果返回结果是 Enforcing表示当前运行在强制模式如果是 Permissive表示运行在宽容模式如果是 Disabled表示 SELinux 被禁用
如何切换 SELinux 运行模式
临时切换
# 更改为 enforcing 模式
[rootlocalhost ~]# setenforce 1# 更改为 permissive 模式
[rootlocalhost ~]# setenforce 0PS临时切换系统重启后会恢复为默认模式
如果 SELinux 为 disabled 运行模式表示 SELinux 已经关闭是无法切换成 Enforcing 模式或 Permissive 模式的
永久切换
如果要永久更改需要修改配置文件
以 CentOS 7.x 为例
[rootlocalhost ~]# vim /etc/selinux/config将 SELINUX 的值更改为 enforcing、permissive 或 disabled保存文件然后重启系统
策略与规则
受限主体程序通过第一关之后来到第二关——策略policy和规则rule比对
可以使用 sestatus 来查看当前 SELinux 使用那些策略
sestatus
-v检查位于 /etc/sestatus.conf 中的文件与进程的安全上下文
-b显示当前策略的规则以布尔值列出[rootlocalhost ~]# sestatus
SELinux status: enabled # selinux 是否启动
SELinuxfs mount: /sys/fs/selinux # selinux 相关文件挂载点
SELinux root directory: /etc/selinux # 根目录
Loaded policy name: targeted # 当前策略
Current mode: permissive # 当前模式
Mode from config file: enforcing # 当前在配置文件内的模式
Policy MLS status: enabled # 是否包含 MLS 模式
Policy deny_unknown status: allowed # 是否预设抵挡未知的主体进程
Max kernel policy version: 31如果想要查看当前策略下的规则可以使用setatus -b 或者 getsebool 命令
[rootlocalhost ~]# sestatus -a
[rootlocalhost ~]# getsebool[rootlocalhost ~]# getsebool -a
abrt_anon_write -- off
abrt_handle_event -- off
abrt_upload_watch_anon_write -- on
antivirus_can_scan_system -- off
antivirus_use_jit -- off
auditadm_exec_content -- on
authlogin_nsswitch_use_ldap -- off
authlogin_radius -- off
authlogin_yubikey -- off
awstats_purge_apache_log_files -- off
boinc_execmem -- on
cdrecord_read_content -- off
cluster_can_network_connect -- off
cluster_manage_all_files -- off
cluster_use_execmem -- off
cobbler_anon_write -- off
...我们可以看到上面的输出中有特别多的 SELinux 规则但是每个规则中具体是怎么限制的我们却还不知道
我们可以通过 seinfo 等工具进行查看
# 需要先下载
[rootlocalhost ~]# yum install -y setools-console# 可以看到策略是 targeted这个策略的安全上下文类型有 4793 个而规则Booleans则有 316 条
[rootlocalhost ~]# seinfo Statistics for policy file: /sys/fs/selinux/policy
Policy Version Type: v.31 (binary, mls)Classes: 130 Permissions: 272Sensitivities: 1 Categories: 1024Types: 4793 Attributes: 253Users: 8 Roles: 14Booleans: 316 Cond. Expr.: 362Allow: 107834 Neverallow: 0Auditallow: 158 Dontaudit: 10022Type_trans: 18153 Type_change: 74Type_member: 35 Role allow: 37Role_trans: 414 Range_trans: 5899Constraints: 143 Validatetrans: 0Initial SIDs: 27 Fs_use: 32Genfscon: 103 Portcon: 614Netifcon: 0 Nodecon: 0Permissives: 0 Polcap: 5# 查看用户
[rootlocalhost ~]# seinfo -uUsers: 8sysadm_usystem_uxguest_urootguest_ustaff_uuser_uunconfined_u# 查看角色
[rootlocalhost ~]# seinfo -rRoles: 14auditadm_rdbadm_rguest_rstaff_ruser_rlogadm_robject_rsecadm_rsysadm_rsystem_rwebadm_rxguest_rnx_server_runconfined_r前面我们知道 crond 进程的类型是 crond_t那我想知道 crond_t 这个 domain 能够读取那些 type 的文件资源
# 查询 crond_d 主体
[rootlocalhost ~]# sesearch -A -s crond_t
...allow crond_t user_cron_spool_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ;allow crond_t user_cron_spool_t : dir { ioctl read write getattr lock add_name remove_name search open } ; allow crond_t unconfined_cronjob_t : process transition ; allow crond_t openshift_domain : process transition ; allow crond_t security_t : lnk_file { read getattr } ;
...allow 后面接主体进程以及文件的 SELinux 类型比如说 crond_t 可以读取 user_cron_spool_t 类型的文件和目录
那如果想要关闭或打开某个 SELinux 规则该怎么办
# 查询到下面的规则是 off 状态我们想打开它
[rootlocalhost ~]# getsebool httpd_enable_homedirs
httpd_enable_homedirs -- off# 启动
# 一定要加上 -P 这样才会写入配置文件
[rootlocalhost ~]# setsebool -P httpd_enable_homedirs 1安全上下文
第一关考虑 SELinux 三种运行模式第二关考虑了 SELinux 的策略规则
现在我们来到了第三关——安全上下文比对
关于安全上下的知识我在《SELinux 入门 pt.1》中已经介绍过了今天我们着重讲下安全上下文的修改
chcon 手动修改
chcon 命令的基本语法如下
chcon [options] context file...其中context表示要设置的安全上下文file...表示要修改的文件或目录路径。下面是一些常用的选项和示例
-R, --recursive 递归修改指定目录下所有文件的安全上下文-t, --type 指定要设置的新类型标签-u, --user 指定要设置的新用户-r, --role 指定要设置的新角色
举几个例子
# 修改文件的安全上下文类型
chcon -t httpd_sys_content_t /var/www/html/index.html# 递归修改目录及其子目录中的文件安全上下文类型
chcon -R -t httpd_sys_content_t /var/www/html/# 修改文件的安全上下文用户和角色
chcon -u system_u -r object_r /path/to/filerestorecon 恢复为默认值
使用 chcon 命令修改安全上下文可能会导致某些文件和目录的访问权限问题
如果对 SELinux 的运作机制和相应的安全策略不熟悉的可以使用 restorecon 命令恢复默认的 SELinux 上下文
基本语法如下
restorecon [-R] [-v] [file...]
-R 表示递归地操作目录及其子目录
-v 表示显示详细信息
file... 是要进行恢复的文件或目录路径举个例子
# 恢复单个文件的安全上下文
restorecon /var/www/html/index.html# 递归地恢复目录及其子目录的安全上下文
restorecon -R /var/www/html/# 显示详细信息
restorecon -v /var/www/html/index.html