本文共 3580 字,大约阅读时间需要 11 分钟。
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 -uUsers: 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 -lLogin 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 -rRoles: 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结尾。示例如下:
查看全部SELinux types(需要安装setools-console软件包),可以执行如下命令,types太多,这里就不给出结果了:
seinfo -t
常见Linux内核资源的SELinux type如下:
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.log2) 查看一个进程(特别是服务的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 -Z4)改变一个文件的SELinux context
chcon -t user_home_t /tmp/myfile 说明:将文件/tmp/myfile的SELinux type修改为user_home_t5)持久改变一个文件的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_t6)改变当前shell的SELinux context(需要密码)
newrole -r system_r -t unconfined_t 说明:将当前shell的的SELinux role修改为system_r,SELinux type修改为user_home_t7) 启动应用/bin/bash,临时改变其SELinux context
runcon system_u:system_r:crond_t:s0:c0.c255 /bin/bash8) 重置文件的SELinux context
restorecon /var/cache/myfile9) 查找所有策略规则,其中source type=httpd_t,boolean=httpd_can_network_relay
sesearch -A -s httpd_t -b httpd_can_network_relay10) 查看http_port_t类型的端口
semanage port -l | grep http_port_t11) 查看8080端口的SELinux type
semanage port -l | grep 808012) 设置端口8088为http_port_t类型
semanage port -a -t http_port_t -p tcp 8088参考链接:
转载地址:http://vhlai.baihongyu.com/