SELinux

1.SELinux简介

1.SELinux是NSA研发的,是为了结束DAC(自主访问控制,任何程序对其资源享有完全的控制权,每个用户或进程可以随意修改自己的文件的权限,将其他权限授予给任何其他人而具有任意的访问机制.标准Linux访问控制、所有/组+权限标记(例如rwx)通常被称为自主访问控制(简称DAC)。)而设置的,后来就有了MAC(强制访问控制,一个进程能否访问某个资源,取决于运行这个进程的用户权限以及访问的资源的属主属组等属性)控制机制,但是如果管理员把一个资源属性的其他设置为rwx,那怎么办呢?于是后来有了沙箱(sandbox)的机制,对于进程只赋予最小的权限,比如运行httpd的用户apache,在普通情况下,apache作为一个普通的用户,他能访问大多数资源,如/etc等,但是apache作为一个专门控制httpd的服务,我们把他的活动范围控制在/var/www,只给他最小的权限,而这个范围就是沙箱.

2.selinux核心概念

在Linux中,大多数的操作可以总结成主谓宾,SELinux也不例外,他把大多数操作总结成主谓宾,

Subjects:(主)processes...

Object:(宾) Directory...

actions:(谓)Append...

SELinux中通主语能对哪些宾语进行操作,靠的是标签来限定的,SELinux中有5中标签,而RedHat中只有三种,分别是用户(User identity),角色(Role),类型(Type)

使用 ls -Z查看,在RedHat中,只需关心第三个,类型(Type),它是用来限定主语和宾语在同一个沙箱中的,只有主语和宾语在同一个类型中,主语才能对宾语操作

SELinux

访问决策:一个主句能对谓语进行什么样的操作是由SELinux的策略库决定的,每个主语对宾语执行执行都会检查该策略库,逐条从上往下检测,如果能被检测到,则可以执行该操作,这也叫访问决策的过程.

如:主语httpd只能访问类型为httpd_t的文件类型,那每次httpd访问文件的时候都会先去策略库中查找,符合了httpd访问的类型,SELinux才允许httpd访问资源,所以文件的类型只要是httpd_t的,都能被httpd访问.

事务决策:也叫标签决策,对于新创建的文件的默认标签.

有时候主语(进程)对一个文件的操作依赖于另一个文件,那主语就会临时切换到与另一个文件类型相同的类型中去,或者主语本身的类型就包含了另外一个文件的类型.

查看SELinux:/etc/selinux/conf

SELinux

enforcing:启用

permissivs:警告

disabled:关闭

targeted:仅对目标进程进行保护

mls:对大多数进程进行安全保护

2.在实际的执行过程中,SELinux不仅可以限制httpd能访问哪些资源,还可以通过策略库中的策略对httpd的功能进行开启和关闭的限制,如:cgi等.这个开关通常叫做sebool.

3.常用命令

3-1.chcon:改变标签(打标)

   -R:递归

[root@lidefu c]# chcon -R --reference=/var/www/a.com/index.html /tmp/a/b/c/test     #注意,如果这三级目录中没有test文件的话,修改不成功
[root@lidefu c]# ls -lZ /tmp/a/b/c/test
-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 /tmp/a/b/c/test
[root@lidefu c]# ls -lZ /tmp/a/b/c
-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 tes

   --reference=FILE:以FILE的标签为参照类型

[root@lidefu tmp]# touch test    #新建一个测试文件
[root@lidefu tmp]#ls -lZ        #查看他的SELinux信息
-rw-r--r--. root root unconfined_u:object_r:user_tmp_t:s0 test
[root@lidefu tmp]# chcon --reference=/var/www/a.com/index.html /tmp/test
[root@lidefu tmp]# ls -lZ
-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 test    #类型已经改变
[root@lidefu tmp]# ls -lZ /var/www/a.com/index.html
-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/a.com/index.html    #类型和被改变的上一条一致

   -t TYPE:修改为指定类型


   -u:user

   -r:role

3-2.恢复默认标签:restorecon

[root@lidefu tmp]# restorecon test     #看来要有默认标签才可以改
restorecon:  Warning no default label for /tmp/test


[root@lidefu /]# mkdir data
[root@lidefu /]# cd data/
[root@lidefu data]# touch test
[root@lidefu data]# ls -Z    #以上都是创建目录和文件
-rw-r--r--. root root unconfined_u:object_r:default_t:s0 test    #默认为default_t
[root@lidefu data]# chcon -R --reference=/var/www/a.com/index.html /data/test test
[root@lidefu data]# ls -lZ
-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 test    #修改类型
[root@lidefu data]# restorecon test     #恢复默认类型
[root@lidefu data]# ls -lZ
-rw-r--r--. root root system_u:object_r:default_t:s0   test    #已经恢复

3-3.获取受SELinux控制的程序的特性:getsebool

getsebool -a | grep httpd        #查看httpd功能启用和禁用情况
allow_httpd_anon_write --> off
allow_httpd_mod_auth_ntlm_winbind --> off
allow_httpd_mod_auth_pam --> off
allow_httpd_sys_script_anon_write --> off
...

3-4.开启受SELniux控制的程序的特性:setsebool

   开启上面的allow_httpd_anon_write

[root@lidefu data]# setsebool allow_httpd_anon_write=1    #开启此特性
[root@lidefu data]# getsebool -a |grep httpd        #查看是否开启
allow_httpd_anon_write --> on                        #成功开启
注意:setsebool开启特性如果不加p选项只是临时开启,想要永久开启,需要加上p,如:setsebool -p  allow_httpd_anon_write=1

3-4.获取SELinux的开关情况:getenforce

[root@lidefu ~]# getenforce    #获取当前系统的SELinux情况
Permissive

3-5.临时设置SELinux开关,注:从Enforcing和Permissive改成Disable都需要修改配置文件并重启

[root@lidefu ~]# setenforce 1    #设置SELinux为强制启用状态
[root@lidefu ~]# getenforce      #查看
Enforcing

3-6:查看文件的SELnux属性

[root@lidefu www]# ls -ldZ html/    #可以看到在html目录下创建的任何文件类型都和html目录的类型一致
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html/
[root@lidefu www]# ls -ldZ html/passwd/test
-rwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html/passwd/test

3-7.查看进程的SELinux属性

]# ps auxZ
LABEL                           USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
system_u:system_r:init_t:s0     root         1  0.0  0.2   2900  1436 ?        Ss   01:52   0:01 /sbin/init
system_u:system_r:kernel_t:s0   root         2  0.0  0.0      0     0 ?        S    01:52   0:00 [kthreadd]
system_u:system_r:kernel_t:s0   root         3  0.0  0.0      0     0 ?        S    01:52   0:00 [migration/0]
...


本文出自 “烟不离手” 博客,请务必保留此出处http://lidefu.blog.51cto.com/3429777/1386960

SELinux,布布扣,bubuko.com

SELinux

上一篇:iOS开发之全局变量


下一篇:Linux基础之until语法