SELinux
SELinux
一、什么是SELinux?
SELinux(Security Enhanced Linux):在进行程序、文件等细部权限设置依据的一个核心模块。
1.传统的文件权限与账号关系:自主式存取控制,DAC:依据程序的拥有者与文件资源的rwx权限来决定有无存取能力。缺点:
1)root权限有被窃取的风险。
2)使用者可以取得程序来变更文件资源的权限。
2.以政策规则订定特定程序读取特定文件:委托式存取控制,MAC
MAC可以针对特定的程序与特定的文件资源进行权限控制。因此,即使你是root,在使用不同的程序时,你不一定能取得全部权限,
你的权限与该程序的设定相关。如此一来,权限控制的主体变成了程序而不是使用者。此外,程序也不能随意使用系统资源文件,因为
文件也可对程序设置可取用权限。例如,默认情况下,httpd仅能在/var/www目录下存取文件。如果httpd程序想要到其他目录去存取数据,
首先规则设置要开放,其次目标目录也要设置为httpd可读模式。
二、SELinux的运行模式
SELinux是通过MAC方式来管控程序的,它控制的主体是程序,目标是该程序能否读取的"文件资源"。
1.主体:程序
2.目标:文件资源
3.政策:由于程序与文件数量庞大,因此SELinux会依据某些服务来制定基本的存取安全政策。这些政策内还有详细的规则
来指定不同的服务开放某些资源的存取与否。CentOS7中主要的3种政策:
1)targeted:针对网络服务的限制较多,针对本机服务的限制较少。默认政策
2)minimun:由targeted修订而来,仅针对选择的程序来保护。
3)mls:完整的SELinux限制,较为严格,建议使用targeted。
4.安全性文本:主体与目标的安全性文本必须一致才能够顺利存取。
上图的重点在“主体”如何取得“目标”的资源存取权限! 由上图我们可以发现,(1) 主体程序必须要通过 SELinux 政策内的规则放行后,就可以与目标资源进行安全性本文的比对
(2) 若比对失败则无法存取目标,若比对成功则可以开始存取目标。问题是,最终能否存取目标还是与文件系统的 rwx 权限设置有关喔!如此一来,加入了 SELinux 之后,出现权限不
符的情况时,你就得要一步一步的分析可能的问题了!
查看安全性文本:
[root@VM_167_181_centos /]# ls -Z lrwxrwxrwx. root root system_u:object_r:bin_t:s0 bin -> usr/bin dr-xr-xr-x. root root system_u:object_r:boot_t:s0 boot drwxr-xr-x root root ? data drwxr-xr-x root root ? dev drwxr-xr-x. root root system_u:object_r:etc_t:s0 etc drwxr-xr-x. root root system_u:object_r:home_root_t:s0 home
安全性文本用冒号分为三个字段
Identify:role:type
1.identify:
主要有以下几种常见类型:
1)unconfined_u:
不受限的用户,也就是说,该文件来自于不受限的程序所产生的!一般来说,我们使用可登陆帐号来取得 bash 之后,
默认的 bash 环境是不受 SELinux 管制的因为 bash 并不是什么特别的网络服务!因此,在这个不受 SELinux 所限制的 bash
程序所产生的文件, 其身份识别大多就是 unconfined_u 这个“不受限”用户。
2)system_u:
系统用户,大部分是系统自己产生的文件。
2.role:
通过该字段,我们可以知道这个数据是属于程序,文件资源还是使用者。
1)object_r:文件资源
2)system_r:程序或者使用者
3.type:
默认的targeted政策中,最重要的字段。程序能否读取文件资源与type相关。而类型字段在文件与程序中的定义不同,分别是:
1)type:在文件资源上的称谓
2)domain:在主体程序上的称谓
程序与文件type字段的相关性:
身份识别 | 角色 | 该对应在 targeted 的意义 |
unconfined_u | unconfined_r | 一般可登陆使用者的程序!相对没有受限的程序 !大多数都是用户已经顺利登陆系统 (不论是网络 还是本机登陆来取得可用的 shell) 后, 所用来操作系 统的程序!如 bash, X window 相关软件等。 |
system_u | system_r | 由于为系统帐号,因此是非交谈式的系统运行程序,大 多数的系统程序均是这种类型! |
在默认的 target 政策下,其实最重要的字段是类型字段 (type) , 主体与目标之间是否具有可以读写的权限,
与程序的 domain 及文件的 type 有关!这两者的关系我们可以使用 crond 以及他的配置文件来说明!
亦即是 /usr/sbin/crond, /etc/crontab, /etc/cron.d 等文件来说明。
# 1\. 先看看 crond 这个“程序”的安全本文内容: [root@study ~]# ps -eZ | grep cron system_u:system_r:crond_t:s0-s0:c0.c1023 1338 ? 00:00:01 crond system_u:system_r:crond_t:s0-s0:c0.c1023 1340 ? 00:00:00 atd # 这个安全本文的类型名称为 crond_t 格式! # 2\. 再来瞧瞧可执行文件、配置文件等等的安全本文内容为何! [root@study ~]# ll -Zd /usr/sbin/crond /etc/crontab /etc/cron.d drwxr-xr-x. root root system_u:object_r:system_cron_spool_t:s0 /etc/cron.d -rw-r--r--. root root system_u:object_r:system_cron_spool_t:s0 /etc/crontab -rwxr-xr-x. root root system_u:object_r:crond_exec_t:s0 /usr/sbin/crond
当我们执行 /usr/sbin/crond 之后,程序的 domain 类型是 crond_t 而 crond_t 能够读取的配置文件则为 system_cron_spool_t 类型。
因此不论/etc/crontab, /etc/cron.d 以及 /var/spool/cron 都会是相关的 SELinux 类型 (/var/spool/cron为 user_cron_spool_t) 。
1. 首先,我们触发一个可执行的目标文件,那就是具有 crond_exec_t 这个类型的
/usr/sbin/crond 文件;
2. 该文件的类型会让这个文件所造成的主体程序 (Subject) 具有 crond 这个领域
(domain) , 我们的政策针对这个领域已经制定了许多规则,其中包括这个领域可以读
取的目标资源类型;
3. 由于 crond domain 被设置为可以读取 system_cron_spool_t 这个类型的目标文件
(Object) , 因此你的配置文件放到 /etc/cron.d/ 目录下,就能够被 crond 那支程序所读
取了;
4. 但最终能不能读到正确的数据,还得要看 rwx 是否符合 Linux 权限的规范!
三、SELinux三种模式的启动、关闭与观察
SELinux依据启动与否共有三种模式:
1.enfocing:强制模式,代表SELinux运行中,且已经正确地开始限制domain/type了
2.permissive:宽容模式,代表SELinux运行中,不过仅会警告信息不会实际限制
3.disable:关闭SELinux
查看模式:
[tang@VM_167_181_centos etc]$ getenforce
查看政策
[tang@VM_167_181_centos etc]$ sestatus
SELinux配置文件:/etc/selinux/config
SELinux的启动与关闭:
改变SELinux的政策与运行模式都需要重启系统,且从disable转到启动模式时要重启两次。
SELinux模式在 enforcing 与 permissive 之间切换的方法为
[root@study ~]# setenforce 1 选项与参数: 0 :转成 permissive 宽容模式; 1 :转成 Enforcing 强制模式 范例一:将 SELinux 在 Enforcing 与 permissive 之间切换与观察 [root@study ~]# setenforce 0 [root@study ~]# getenforce Permissive [root@study ~]# setenforce 1 [root@study ~]# getenforce Enforcing
注意, setenforce 无法在 Disabled 的模式下面进行模式的切换。
四、政策的规则管理
查看规则是否启动:
getsebool [-a] [规则名称]
-a:查看所有规则
[root@study ~]# sesearch [-A] [-s 主体类别] [-t 目标类别] [-b 布林值] 选项与参数: -A :列出后面数据中,允许“读取或放行”的相关数据 -t :后面还要接类别,例如 -t httpd_t -b :后面还要接SELinux的规则,例如 -b httpd_enable_ftp_server 范例一:找出 crond_t 这个主体程序能够读取的文件 SELinux type [root@study ~]# sesearch -A -s crond_t | grep spool allow crond_t system_cron_spool_t : file { ioctl read write create getattr .. allow crond_t system_cron_spool_t : dir { ioctl read getattr lock search op.. allow crond_t user_cron_spool_t : file { ioctl read write create getattr se.. allow crond_t user_cron_spool_t : dir { ioctl read write getattr lock add_n.. allow crond_t user_cron_spool_t : lnk_file { read getattr } ; # allow 后面接主体程序以及文件的 SELinux type,上面的数据是撷取出来的, # 意思是说,crond_t 可以读取 system_cron_spool_t 的文件/目录类型~等等! 范例二:找出 crond_t 是否能够读取 /etc/cron.d/checktime 这个我们自订的配置文件? [root@study ~]# ll -Z /etc/cron.d/checktime -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /etc/cron.d/checktime # 两个重点,一个是 SELinux type 为 admin_home_t,一个是文件 (file) [root@study ~]# sesearch -A -s crond_t | grep admin_home_t allow domain admin_home_t : dir { getattr search open } ; allow domain admin_home_t : lnk_file { read getattr } ; allow crond_t admin_home_t : dir { ioctl read getattr lock search open } ; allow crond_t admin_home_t : lnk_file { read getattr } ; # 仔细看!看仔细~虽然有 crond_t admin_home_t 存在,但是这是总体的信息, # 并没有针对某些规则的寻找~所以还是不确定 checktime 能否被读取。但是,基本上就是 SELinux # type 出问题~因此才会无法读取的!
[root@study ~]# semanage boolean -l | grep httpd_enable_homedirs SELinux boolean State Default Description httpd_enable_homedirs (off , off) Allow httpd to enable homedirs # httpd_enable_homedirs 的功能是允许 httpd 程序去读取使用者主文件夹的意思~ [root@study ~]# sesearch -A -b httpd_enable_homedirs 范例三:列出 httpd_enable_homedirs 这个规则当中,主体程序能够读取的文件 SELinux type Found 43 semantic av rules: allow httpd_t home_root_t : dir { ioctl read getattr lock search open } ; allow httpd_t home_root_t : lnk_file { read getattr } ; allow httpd_t user_home_type : dir { getattr search open } ; allow httpd_t user_home_type : lnk_file { read getattr } ; ....(后面省略) .... # 从上面的数据才可以理解,在这个规则中,主要是放行 httpd_t 能否读取使用者主文件夹的文件! # 所以,如果这个规则没有启动,基本上, httpd_t 这种程序就无法读取使用者主文件夹下的文件!
[root@study ~]# setsebool [-P] “规则名称” [1] 选项与参数: -P :直接将设置值写入配置文件,该设置数据未来会生效的! 范例一:查询 httpd_enable_homedirs 这个规则的状态,并且修改这个规则成为不同的布林值 [root@study ~]# getsebool httpd_enable_homedirs httpd_enable_homedirs --> off <==结果是 off ,依题意给他启动看看! [root@study ~]# setsebool -P httpd_enable_homedirs 1 # 会跑很久很久!请耐心等待! [root@study ~]# getsebool httpd_enable_homedirs httpd_enable_homedirs --> on
五、SELinux安全文本的修改
一)使用 chcon 手动修改文件的 SELinux type
[root@study ~]# chcon [-R] [-t type] [-u user] [-r role] 文件 [root@study ~]# chcon [-R] --reference=范例档 文件 选项与参数: -R :连同该目录下的次目录也同时修改; -t :后面接安全性本文的类型字段!例如 httpd_sys_content_t ; -u :后面接身份识别,例如 system_u; (不重要) -r :后面街角色,例如 system_r; (不重要) -v :若有变化成功,请将变动的结果列出来 --reference=范例档:拿某个文件当范例来修改后续接的文件的类型! 范例一:查询一下 /etc/hosts 的 SELinux type,并将该类型套用到 /etc/cron.d/checktime 上 [root@study ~]# ll -Z /etc/hosts -rw-r--r--. root root system_u:object_r:net_conf_t:s0 /etc/hosts [root@study ~]# chcon -v -t net_conf_t /etc/cron.d/checktime changing security context of ‘/etc/cron.d/checktime’ [root@study ~]# ll -Z /etc/cron.d/checktime -rw-r--r--. root root unconfined_u:object_r:net_conf_t:s0 /etc/cron.d/checktime 范例二:直接以 /etc/shadow SELinux type 套用到 /etc/cron.d/checktime 上! [root@study ~]# chcon -v --reference=/etc/shadow /etc/cron.d/checktime [root@study ~]# ll -Z /etc/shadow /etc/cron.d/checktime -rw-r--r--. root root system_u:object_r:shadow_t:s0 /etc/cron.d/checktime ----------. root root system_u:object_r:shadow_t:s0 /etc/shadow
二)使用 restorecon 让文件恢复正确的 SELinux type
[root@study ~]# restorecon [-Rv] 文件或目录 选项与参数: -R :连同次目录一起修改; -v :将过程显示到屏幕上 范例三:将 /etc/cron.d/ 下面的文件通通恢复成默认的 SELinux type! [root@study ~]# restorecon -Rv /etc/cron.d restorecon reset /etc/cron.d/checktime context system_u:object_r:shadow_t:s0-> system_u:object_r:system_cron_spool_t:s0 # 上面这两行其实是同一行喔!表示将 checktime 由 shadow_t 改为 system_cron_spool_t 范例四:重新启动 crond 看看有没有正确启动 checktime 啰!? [root@study ~]# systemctl restart crond [root@study ~]# tail /var/log/cron # 再去瞧瞧这个 /var/log/cron 的内容,应该就没有错误讯息了
三)semanage 默认目录的安全性本文查询与修改