1、SELINUX工作原理
Security Enhanced Linux,安全增强型linux,简称SELinux,它是一个Linux内核模块,也是Linux的一个安全子系统。
-
SELinux主要由美国国家安全局开发,2.6及以上版本的Linux内核都已经集成了SELinux模块。
-
目的:防止资源被误用,也就是说,将进程所能访问的资源范围进行限制
-
selinux针对的是进程,通过安全标签,检查进程对文件、目录、端口是否有权限,比如说,只有进程和文件的安全上下文匹配,该进程才可以访问该文件资源
没有SELINUX的情况下:
-
一个资源是否能被访问,根据某个用户是否拥有对应资源的权限(r,w,x)。
-
只要进程的运行身份有相应的权限,该进程就可以访问对应资源。
-
致命是,root用户不受任何限制,系统上任何资源都可以无限制地访问,也就是说,以root身份运行的进程,可以在系统内为所欲为。
-
此种权限管理机制,我们称为自主访问控制(DAC)
有SELINUX的情况下:
-
先通过DAC检查
-
再检查selinux规则库,规则库中定义了哪种类型的进程能访问哪种类型的资源。
-
这样,即使以root身份运行的进程,也只能访问它所需要的资源。
-
此种权限管理机制,我们称为强制访问控制(MAC)
1.1、selinux的配置文件
#selinux有3种type,3种state
cat /etc/selinux/config
3种state:
-
enforcing,强制模式,只要违反规则,就被阻止,并且记录日志
-
permissive,宽容模式,如果违反规则,只记录日志,不阻止。一般用于排错的时候。
-
disabled,关闭selinux
注意:
-
enforcing和permissive状态切换,不用重启
-
disabled与另外两种模式的切换,需要重启
-
如果系统在关闭Selinux的状态下,运行了一段时间后,再次开启selinux之后的第一次重启过程中,系统必须为磁盘中的文件重新创建安全上下文,所以会比较慢
3种type:
-
targeted,默认,针对几乎所有常见的网络服务进程进行管控。
-
minimum,以targeted为基础,仅对选定的网络服务进程进行管控。
-
mls,最严格的管制,对所有的进程都进行管控。
1.2、排错
如果配置文件关键字写错,会造成重启开不了机。
-
重启时在启动页面,选择你要启动的内核,按E,进入grub编辑页面。
-
找到linux16那一行,在最后位置,空格,加上selinux=0 或者 enforcing=0
-
然后ctrl + x启动,顺利进入系统。
-
修复错误,重启。
1.3、查看当前模式
getenforce
sestatus
1.4、切换模式
#使selinux处于permissive状态
setenforce 0
#使selinux处于enforcing状态
setenforce 1
注意:
-
上面这两种方式只会当前有效,重启就没了,并且只能在enforcing和permissive两个状态间切换
-
如果想长期有效,改配置文件:/etc/sysconfig/selinux
2、安全上下文
进程和文件都有自己的安全上下文,一般,一个进程安全上下文会对应多个文件安全上下文,只有当两者的安全上下文匹配了,进程才能访问该文件资源。
一般,我们只需要关心文件的安全上下文。根据文件创建的位置和创建文件的进程,系统有一套默认值。我们要做的,就是更改默认值。
注意:
-
移动,不会改变文件的安全上下文
-
复制,会改变文件的安全上下文
2.1、查看文件的安全上下文
SELinux会为进程和文件添加安全信息标签,这些信息将作为访问控制的依据。
#查看文件安全上下文
ls -Z /var/www/html/index.html
unconfined_u:object_r:httpd_sys_content_t:s0
-
使用冒号(:)分隔成4段,其实共有5个字段,只是最后一个“类别”字段是可选的
-
当selinux的配置文件里:SELINUXTYPE=targeted,只有第3段有效:httpd_sys_content_t
字段说明:
身份:角色:类型:灵敏度:[类别]
-
身份,SElinux用户,用于标识该资源被哪个身份所拥有,相当于权限中的用户身份。
-
unconfiged_u,表示该文件是由不受限的程序产生的,比如默认情况下,bash进程,是不受selinux控制的,所以我们自己touch的文件,身份都是unconfiged_u
-
root,表示受限的,并且以root身份运行的进程产生的文件。
system_u,表示以系统用户身份运行的进程产生的文件,大部分文件就是系统自己产生的。
-
user_u,表示以一般用户身份运行的进程产生的文件。
-
角色,主要用来标识此对象是进程、文件,还是目录。
object_r,表示这是一个目录或文件资源
system_r,表示这是一个进程,普通用户也被指定为这个角色
-
类型(最重要的部分),进程是否可以访问文件,主要就是看进程的安全上下文类型字段是否和文件的安全上下文类型字段相匹配,如果匹配则可以访问。
类型字段在文件或目录的安全上下文中被称作类型(type)
在进程的安全上下文中被称作域(domain)
-
灵敏度
灵敏度一般是用s0、s1、s2来命名,数值越大,灵敏度越高。
*我们怎么知道进程的域和文件的类型是否匹配呢?这就要查询具体的策略规则了
domain和type的对应关系,在seliux规则库里写好了,为了效率,selinux规则库被编译成二进制的。
2.2、查看进程的安全上下文
ps -eZ |grep bash
unconfined_u:unconfined_r:unconfined_t
-
发现bash不受selinux限制
#如果SELINUXTYPE=targeted时,也只有第3段有效,称为domain
#只有当进程的domain和文件或目录的安全上下相匹配的时候,进程才能去访问文件或目录
ps -efZ |grep httpd
#httpd进程会去读取/var/www/html下的页面文件
ls -Z /var/www/html/index.html
2.3、seinfo
seinfo用于查询selinux的策略提供了多少规则。
用法:
seinfo [选项]
选项:
-u:列出SELinux中所有的身份(user);
-r:列出SELinux中所有的角色(role);
-t:列出SELinux中所有的类型(type);
-b:列出所有的布尔值(也就是策略中的具体规则名称);
-x:显示更多的信息;
#查看所有类型
seinfo -t
2.4、sesearch
sesearch用来查询相关类型或布尔值的详细规则。
#安装
yum install -y setools
格式:
sesearch [选项] [规则类型] [表达式]
选项:
-h:显示帮助信息;
规则类型:
--allow,-A:显示允许的规则;
--neverallow:显示从不允许的规则;
--all:显示所有的规则;
表达式:
-s,source,主体类型:显示和指定主体的类型相关的规则(主体是访问的发起者)
-t,target,目标类型:显示和指定目标的类型相关的规则(目标是被访问者)
-b,bool,规则名:显示规则的具体内容
#查询httpd_t域,可以访问的文件类型
sesearch -A -s httpd_t | more
#查询httpd_t域和httpd_sys_content_t类型的匹配规则
esearch --all -s httpd_t -t httpd_sys_content_t | more
2.5、修改文件的安全上下文
chcon
-R,递归修改
-t,指定type
-u,指定身份
-r,指定角色
-v,如有变化,将变化结果列出来
--reference=,根据一个文件为范本,对其它文件进行修改
#参照/var/www/html,去修改index.html这个文件的安全上下文
chcon --reference=/var/www/html /var/www/html/index.html
#直接给文件指定安全上下文
chcon -t httpd_sys_content_t /var/www/index.html
#递归修改/var/www目录下的所有文件安全上下文
chcon -R -t httpd_sys_content_t /var/www/
2.6、修改默认安全上下文
selinux给系统默认文件或目录,都定义了默认的安全上下文,通过restorecon命令就可以恢复默认。所以,想真正的永久修改安全上下文,建议修改默认安全上下文。
#下次启动,重新扫描所有文件,恢复默认
touch /.autorelabel
semanage命令常用选项及含义 |
|
选项 |
含义 |
-a |
添加默认安全上下文配置。 |
-d |
删除指定的默认安全上下文。 |
-m |
修改指定的默认安全上下文。 |
-t |
设定默认安全上下文的类型 |
#所有的文件或目录都有一个默认的安全上下文,服务的目录的安全上下文默认都是正确的
#查看/home目录的默认安全上下文
semanage fcontext -l |grep /home/
#如果更改了一个文件的安全上下文件,怎么恢复到默认
#将/var/www/html目录下的所有文件,都恢复到默认
restorecon -Rv /var/www/html
怎么更改默认的安全上下文:
semanage fcontext -a -t httpd_sys_content_t /tmp/doc
#连同这个目录下面的所有文件或目录的默认安全上下文一起修改
semanage fcontext -a -t httpd_sys_content_t ‘/tmp/doc(/.*)?’
2.7、端口的安全上下文
比如:把httpd的端口改成19000,重新服务就起不来了
对于服务的熟识端口的selinux安全上下文是正确的
#可以找到80端口的安全上下文
semanage port -l |grep 80
#更改TCP19000端口的安全上下文
semanage port -a -t http_port_t 19000 -p tcp
3、SEBOOL
selinux布尔值是更改selinux策略行为的开关,用来有选择地调整策略
比如,FTP的上传功能,selinux默认是将此功能off的,所以,在开启selinux的情况下,即使FTP服务本身已经开启上传功能,但还是不能上传。
3.1、查看selinux策略到底在限制什么?
#查看httpd相关的布尔值
getsebool -a |grep httpd
httpd_anon_write --> off
httpd_enable_homedirs --> off
#查看httpd_enable_homedirs这个sebool当前的值和简要信息
semanage boolean -l |grep httpd_enable_homedirs
#查询httpd_enable_homedirs的具体定义了哪些规则。
sesearch -A -b httpd_enable_homedirs
通过输出,可以发现,这个规则主要用来控制程序是否可以访问用户家目录,规则值为off,表示不能访问
3.2、修改布尔值
#把布尔值改成on,表示启用这个规则
#-P,表示将更改永久保存
setsebool -P httpd_enable_homedirs on
#查看修改后的布尔值
getsebool httpd_enable_homedirs