Linux资源的SELinux context详解

Linux操作系统中的每个资源(如进程、文件描述符、文件、网络等),也被称为SELinux对象,都拥有一个特别的security label,也被称为SELinux label,或SELinux context,以表示该对象能够执行的permissions和operations。这是一个标识符,从Linux系统的细节中抽象出,只聚焦于系统资源的安全属性。通过使用SELinux context,就可以在SELinux策略的中,一致而正确地引用一个系统资源。

1. SELinux context的组成

SELinux context就是一个冒号分隔的字符串,包含4个部分:

user:role:type:range

1) range是可选的,也被称为MLS/MCS security range,或者MLS/MCS security level。

2) 对于安全策略而言,一个SELinux user就是一个标识符。SELinux user是从Linux user映射而来,名称有所变化,带上后缀_u。两者之间的最大不同是,Linux user可以通过su/sudo改变权限,而SELinux user永远不能,除非系统重启。

查看全部SELinux users(需要安装setools-console软件包),可以执行如下命令:

[root@myhost ~]# seinfo -u

Users: 8
   sysadm_u
   system_u
   xguest_u
   root
   guest_u
   staff_u
   user_u
   unconfined_u

查看Linux/SELinu user之间的映射关系(需要安装policycoreutils-python软件包),可以执行如下命令:

[root@myhost ~]# semanage login -l

Login Name           SELinux User         MLS/MCS Range        Service

__default__          unconfined_u         s0-s0:c0.c1023       *
root                 unconfined_u         s0-s0:c0.c1023       *
system_u             system_u             s0-s0:c0.c1023       *

说明,Linux非root用户默认被映射为SELinux unconfined_u,即不受限制;Linux root默认被映射为SELinux unconfined_u,即不受限制;system_u是个特殊的SELinux用户标识符,专用于系统进程和系统对象,永远不要将其与Linux用户关联。

3) 一个SELinux user可能拥有多个roles,这里的role是由SELinux的策略定义的,与Linux系统用户管理部分的role无关。SELinux  role的名称都以_r后缀。另外,任何一个系统资源都默认拥有一个名为object_r的role。

查看全部SELinux roles(需要安装setools-console软件包),可以执行如下命令:

[root@myhost ~]# seinfo -r

Roles: 14
   auditadm_r
   dbadm_r
   guest_r
   staff_r
   user_r
   logadm_r
   object_r
   secadm_r
   sysadm_r
   system_r
   webadm_r
   xguest_r
   nx_server_r
   unconfined_r

4) SELinux type用于定义一个进程所属的domain、或一个文件的类型。在SELinux的策略中,大多数的规则都是基于SELinux type定义的。这是SELinux策略检查的关键参数。如通过entrypoint,实现不同type之间的互相访问。

SELinux type的命名以_t结尾。示例如下:

  • Web server(如Apache、 Nginx、 Tomcat)的type为httpd_t
  • Web server的端口的type为http_port_t
  • Web server的docroot目录/var/www/html/的type为httpd_sys_content_t
  • /tmp或/var/tmp目录的type为tmp_t
  • MySQL的type为mysqld_db_t

查看全部SELinux types(需要安装setools-console软件包),可以执行如下命令,types太多,这里就不给出结果了:

seinfo -t

常见Linux内核资源的SELinux type如下:

  • kernel_t
  • init_t
  • fs_t
  • unconfined_service_t
  • unconfined_t

2. SELinux context的典型操作

1) 查看一个文件temp.log的SELinux context
        SELinux context存储于文件系统的扩展属性。
        [root@serobidvmm02 bidvmm]# ls -Z temp.log
        -rw-r--r--. root root unconfined_u:object_r:user_home_t:s0 temp.log
        或
        getfattr -n security.selinux temp.log

2) 查看一个进程(特别是服务的daemon进程)的SELinux context
        从RHEL/CentOS 6.6开始,Nginx的SELinux context的label为httpd_t,查看Ngnix服务的SELinux context:
            ps auZ | grep nginx
            ps -e --context | grep nginx
            ps -eZ | grep nginx
        httpd_t的SELinux context,允许Ngnix监听常见的Web服务器端口,允许Nginx访问/etc/nginx目录下的配置文件,允许访问标准的docroot路径/usr/share/nginx。但是不允许代理请求到upstream,不允许通过sockets与其他进程通信。

3) 查看当前shell的SELinux context
        id -Z

4)改变一个文件的SELinux context
        chcon -t user_home_t /tmp/myfile
            说明:将文件/tmp/myfile的SELinux type修改为user_home_t

5)持久改变一个文件的SELinux context
        semanage fcontext -a -t user_home_t /var/cache/myfile
        restorecon /var/cache/myfile
            说明:将文件/tmp/myfile的SELinux user修改为system_u;将文件/tmp/myfile的SELinux type修改为user_home_t

6)改变当前shell的SELinux context(需要密码)
        newrole -r system_r -t unconfined_t
            说明:将当前shell的的SELinux role修改为system_r,SELinux type修改为user_home_t

7) 启动应用/bin/bash,临时改变其SELinux context
        runcon system_u:system_r:crond_t:s0:c0.c255 /bin/bash

8) 重置文件的SELinux context
        restorecon /var/cache/myfile

9) 查找所有策略规则,其中source type=httpd_t,boolean=httpd_can_network_relay
        sesearch -A -s httpd_t -b httpd_can_network_relay

10) 查看http_port_t类型的端口
        semanage port -l | grep http_port_t

11) 查看8080端口的SELinux type
        semanage port -l | grep 8080

12) 设置端口8088为http_port_t类型
        semanage port -a -t http_port_t -p tcp 8088

参考链接:

https://github.com/SELinuxProject/selinux/wiki/Tools

https://wiki.centos.org/HowTos/SELinux

你可能感兴趣的:(Linux)