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 默认目录的安全性本文查询与修改

 

posted @ 2018-09-21 15:56  Shadowplay  阅读(252)  评论(0编辑  收藏  举报