SELinux安全上下⽂查看⽅法(超详细)
SELinux 管理过程中,进程是否可以正确地访问⽂件资源,取决于它们的安全上下⽂。进程和⽂件都有⾃⼰的安全上下⽂,SELinux 会为进程和⽂件添加安全信息标签,⽐如 SELinux ⽤户、⾓⾊、类型、类别等,当运⾏ SELinux 后,所有这些信息都将作为访问控制的依据。
⾸先,通过⼀个实例看看如何查看⽂件和⽬录的安全上下⽂,执⾏命令如下:
[root@localhost ~]# ls -Z
#使⽤选项-Z查看⽂件和⽬录的安全上下⽂
-rw——-.root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfg
-rw-r–r–.root root system_u:object_r:admin_home_t:s0 install.log
-rw-r–r–.root root system_u:object_r:admin_home_t:s0 install.log.syslog
可以看到,查看⽂件的安全上下⽂⾮常简单,就是使⽤“ls -Z”命令。⽽在此基础上,如果想要查看⽬录的安全上下⽂,需要添加“-d”选项,代表查看⽬录本⾝,⽽⾮⽬录下的⼦⽂件。举个例⼦:
[root@localhost ~]# ls -Zd /var/www/html/
drwxr-xr-x.root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
那么,该如何查看进程的安全上下⽂呢?只需使⽤ ps 命令即可。命令如下:
[root@localhost ~]# service httpd start
#启动apache服务
[root@localhost ~]# ps auxZ | grep httpd
unconfined_u:system_r:httpd_t:s0 root 25620 0.0 0.5 11188 3304 ? Ss
03:44 0:02 /usr/sbin/httpd
…省略部分输出…
也就是说,只要进程和⽂件的安全上下⽂匹配,该进程就可以访问该⽂件资源。在上⾯的命令输出中,我们加粗的就是安全上下⽂。
安全上下⽂看起来⽐较复杂,它使⽤“:”分隔为 4 个字段,其实共有 5 个字段,只是最后⼀个“类别”字段是可选的,例如:
system_u:object_r:httpd_sys_content_t:s0:[类别] #⾝份字段:⾓⾊:类型:灵敏度:[类别]
下⾯对这 5 个字段的作⽤进⾏说明。
1) ⾝份字段(user)
⽤于标识该数据被哪个⾝份所拥有,相当于权限中的⽤户⾝份。这个字段并没有特别的作⽤,知道就好。常见的⾝份类型有以下 3 种:
1. – root:表⽰安全上下⽂的⾝份是 root。
2. – system_u:表⽰系统⽤户⾝份,其中“_u”代表 user。
3. – user_u:表⽰与⼀般⽤户账号相关的⾝份,其中“_u”代表 user。
user 字段只⽤于标识数据或进程被哪个⾝份所拥有,⼀般系统数据的 user 字段就是 system_u,⽽⽤户数据的 user 字段就是 user_u。
那么,SELinux 中到底可以识别多少⽤户⾝份字段呢?我们可以使⽤ seinfo 命令来进⾏查询。SELinux 的相关命令⼀般都是以“se”开头的,所以也较为好记。
seinfo 命令格式如下:
[root@localhost ~]# seinfo [选项] 选项:
-u: 列出SELinux中所有的⾝份(user);
-r: 列出SELinux中所有的⾓⾊(role);
-t: 列出SELinux中所有的类型(type);
-b: 列出所有的布尔值(也就是策略中的具体规则名称);
-x: 显⽰更多的信息;
seinfo 命令的功能较多,我们在这⾥只想查询 SELinux 中的⾝份,那么只需执⾏如下命令:
[root@localhost ~]# seinfo -u
Users:9
sysadm_u
system_u
xguest_u
root
guest_u
staff_u
user_u
unconfined_u
git_shell_u
就可以看到 SELinux 中能够识别的 user ⾝份共有 9 种。不过这个字段在实际使⽤中并没有太多的作⽤,了解⼀下即可。
2) ⾓⾊(role)
主要⽤来表⽰此数据是进程还是⽂件或⽬录。这个字段在实际使⽤中也不需要修改,所以了解就好。
常见的⾓⾊有以下两种:
– object_r:代表该数据是⽂件或⽬录,这⾥的“_r”代表 role。
– system_r:代表该数据是进程,这⾥的“_r”代表 role。
那么,SELinux 中到底有多少种⾓⾊呢?使⽤ seinfo 命令也可以查询,命令如下:
[root@localhost ~]# seinfo -r
Roles:12
guest_r
staff_r
user_r
git_shell_r
logadm_r
object_r
sysadm_r
system_r
webadm_r
xguest_r
nx_server_r
unconfined_r
3) 类型(type)
类型字段是安全上下⽂中最重要的字段,进程是否可以访问⽂件,主要就是看进程的安全上下⽂类型字段是否和⽂件的安全上下⽂类型字段相匹配,如果匹配则可以访问。
注意,类型字段在⽂件或⽬录的安全上下⽂中被称作类型(type),但是在进程的安全上下⽂中被称作域(domain)。也就是说,在主体(Subject)的安全上下⽂中,这个字段被称为域;在⽬标(Object)的安全上下⽂中,这个字段被称为类型。域和类型需要匹配(进程的类型要和⽂件的类型相匹配),才能正确访问。
SELinux 中到底有多少类型也是通过 seinfo 命令查询的,命令如下:
[root@localhost ~]# seinfo -t | more
Types:3488
#共有3488个类型
bluetooth_conf_t
cmirrord_exec_t
foghorn_exec_t
jacorb_port_t
sosreport_t
etc_runtime_t
…省略部分输出…
我们知道了类型的作⽤,可是我们怎么知道进程的域和⽂件的类型是否匹配呢?这就要查询具体的策略规则了,我们在后⾯再进⾏介绍。
不过,我们已知 apache 进程可以访问 /var/www/html/(此⽬录为 RPM 包安装的 apache 的默认⽹页主⽬录)⽬录中的⽹页⽂件,所以 apache 进程的域和 /var/www/html/ ⽬录的类型应该是匹配的,我们查询⼀下,命令如下:
[root@localhost ~]# ps auxZ | grep httpd
unconfined_u:system_r:httpd_t:s0 root 25620 0.0 0.5 11188 3304 ? Ss
03:44 0:02 /usr/sbin/httpd
#apache进程的域是httpd_t
[root@localhost ~]# ls -dZ /var/www/html/
drwxr-xr-x.root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
#/var/www/html/⽬录的类型是httpd_sys_content_t
apache 进程的域是 httpd_t,/var/www/html/ ⽬录的类型是 httpd_sys_content_t,这个主体的安全上下⽂类型经过策略规则的⽐对,是和⽬标的安全上下⽂类型匹配的,所以 apache 进程可以访问 /var/www/html/ ⽬录。
我们在 SELinux 中最常遇到的问题就是进程的域和⽂件的类型不匹配,所以我们⼀定要掌握如何修改类型字段。
4) 灵敏度
灵敏度⼀般是⽤ s0、s1、s2 来命名的,数字代表灵敏度的分级。数值越⼤,代表灵敏度越⾼。
5) 类别
类别字段不是必须有的,所以我们使⽤ ls 和 ps 命令查询的时候并没有看到类别字段。但是我们可以通过 seinfo 命令来查询,命令如下:
[root@localhost ~]# seinfo -u -x
#查询所有的user字段,并查看详细信息
system_u
#user字段名
default level:s0
#默认灵敏度
grep命令查看进程
range:s0 – s0:c0.c1023
#灵敏度可以识别的类别
roles:
#该user能够匹配的role(⾓⾊)
object_r
system_r
unconfined_r

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。