SELinux简介
全称Security Enhanced Linux,中文Linux安全增强。传统DAC(Discretionary Access Control)自主接入控制在权限设置不当时容易造成风险,而SELinux使用了MAC(Mandatory Access Control)委任权限控制方法,针对特定的程序域特定的档案进行权限管控,使得权限自由变小,因此即便你是root账户,你在运行某些程序的时候获取到的权限也一定root,由此增强了安全性;比如你的网站目录权限设置不正确导致被服务器入侵,但是由于SELinux的存在,入侵者可以做的操作少之又少,大大减少了你的服务器被彻底攻陷的概率。
这样说起来SELinux很好才对,可是他也会造成烦恼,对SELinux不够了解根本不知道如何解决问题,所以很多人选择直接把SELinux关闭。而我,选择学习,记录一下学习内容,以便查询。
构成
SELinux默认提供一些预设的Policy,而在Policy中又有一些列的Rules。他主要有以下名词:主体(Subject)、目标(Object)、政策(Policy)、安全性文本(Security Context)。
- Subject
因为SELinux管理的就是程序,所以可以将其认为subject就是需要管理的程序进程 - Object
程序存取的目标就是档案系统,所以可以认object就是档案系统 Policy
对程序做出权限限制全靠他,其中包含一系列Rules,Policy下又包含三种策略targeted:针对网络服务限制较多,针对本机限制较少,是默认的政策;
minimum:由 target 修订而来,仅针对选择的程序来保护!
mls:完整的 SELinux 限制,限制方面较为严格。建议使用默认的 targeted 政策即
可- 安全性文本
类似于文件的rwx属性,如果这个参数设定不正确,那么你可能无法正常读取档案。比如samba共享默认的安全性文本为samba_share_t
,如果你设置为user_home_t
,那么会导致你无法进入共享的文件夹。
使用ls -Z
可以看到当前文件的安全性文本。
-rw-r--r--. fuckyou users system_u:object_r:samba_share_t:s0 mrbs-1.7.4.1.tar.gz
如上system_u:object_r:samba_share_t:s0
部分就是安全性文本,这分为三个部分,包含身份识别(Identify)、角色(Role)、类型(Type),其中Type为最重要的,他确定了一个程序能否正常读取到档案资源
Idenfify
代表类型:
- unconfined_u
代表不受限的用户,也即是该档案是由不受限制的程序所产生的 - system_u
代表系统用户,也即是系统本身产生的档案
Role
代表角色:
- object_r
代表的是文件或者目录 - system_r
代表的是程序
Type
在在默认使用targeted策略时,Identity和Role基本不影响文档的存取,能影响的只有Type位,而Type在文档与程序上的定义不同,在文档上称为Type;在程序上称为domain;domain和Type需要搭配起来,该程序才能正常进行文档存取。例如使用ps -eZ | grep smbd
可以看到smb对应的domain。
以samba为例,smb对应的domain为system_u:system_r:smbd_t:s0 13669 ? 00:00:00 smbd
;SELinux会对某些程序的domain做出预定义的规则。
规则及其SELinux type
规则查看getsebool -a
命令
例如getsebool -a | grep samba
即可看到所有samba的规则,但是规则很多,要知道具体某条规则是干嘛的,需要使用seinfo等工具。
yum -y install setools-console-*
seinfo [-trub]
--all:列出SELinux的状态、规则布尔值、身份识别、角色、类别
-u:列出SELinux的所有身份识别(user)种类
-r:列出SELinux的所有角色(role)种类
-t:列出SELinux的所有类别(Type)种类
-b:列出所有的规则种类布尔值
seinfo -u
可以查看当前所有的身份; seinfo -r
可以查看当前所有的角色。
使用semanage boolean -l | grep samba_create_home_dirs
可以查看当前规则的具体作用;
使用sesearch -A -s smbd_t 即可查看snmbd_t这个域可以存取文件的SELinux type
使用sesearch -A -b samba_create_home_dirs
可以列出这个规则中程序能够读取的文件SELinux type
规则布尔值
当使用getsebool
获取某个规则的布尔值后,如果要修改该规则的布尔值,则使用setsebool -P samba_create_home_dirs 1
。
一定要加上-P参数,才能将修改写入配置文件。
安全文本修改
通过 sesearch 来找到主体程序与文件的关系后,如果出现SELinux导致无法正常存取文档的时候,那么我们就要检查安全文本是否正确,不正确就要修改。
例如使用chcon -t samba_share_t /home/Downloads
修改/home/Downloads
目录的安全文本类型为samba_share_t
,如果该文件夹类型不为samba_share_t
,即使你将其作为samba共享文件夹,权限设置正确,你也无法进入该目录浏览文件。
-R :参数可以递归修改
-t :参数后面接安全性文本的类型字段
-u :后面接身份识别类型
-r :后面接角色识别类型
-v :如若有变化,则将变化详细结果列出来
使用restorecon
命令可以将目录及文件恢复成默认的SELinux type,但是仅限于默认type为正确的时候可用,否则即使使用此命令也无法修复SELinux造成的权限问题。
修改默认SELinux type
semanage fcontext
命令可以查询、删除、增加、修改相应的type
semanage
参数如下:
-a 增加,一些默认没有设置type目录可以自行增加
-m 修改当前type
-d 删除type
下面使用自创建并加入samba共享的目录进行演示,首先使用semanage fcontext -l | grep "^/home/Downloads"
,发现并没用输出结果,但是我们知道其默认type应该是samba_share_t
,但是使用restorecon -Rv
进行重置type的时候其类型并不匹配,于是我选择自行增加
semanage fcontext -a -t samba_share_t "/home/Downloads(/.*)?"
semanage fcontext -l | grep '^/home/Downloads'
上述命令完成后可以看到已经有一条针对/home/lonny/Downloads(/.*)?
的默认type了,当我们再次使用restorecon -Rv
命令的时候即可看到其默认恢复的type是正确的了。
SELinux排错
上面是解决SELinux导致问题的方法,但是当出现问题时,要用什么指令修改什么,这个还是需要进行排错以后才能确定,排错之前需要用到的组件有auditd
及setroubleshootd
,一定要安装否则不会有日志,安装后要重启服务器。
yum -y install setroubleshoot setroubleshoot-server
首先,通过getenforce查看SELinux的状态,通过setenforce 0
切换SELinux到Permissive模式,这个模式SELinux会执行该执行的流程,但是不会拦截行为,如果切换到这个模式,你之前出现的问题不再重现,那么肯定是SELinux导致的,这个时候在日志中应该有相关的记录,使用setenforce 1
切换回Enforcing模式。
最便捷找到问题的方法 cat /var/log/message | grep "SELinux"
,只要有日志记录就一定有输出,上面会给出导致问题的原因以及解决的方法,基本只要复制粘贴完成即可。但是要注意的是其给的命令不一定每次都是正确,比如我自行创建并添加到samba共享的目录下后面创建的子目录无法访问,排查时使用SELinux给的命令进行修复后发现还是提示没用权限进不去,后面才发现type类型不对,需要自定义默认type,然后使用restorecon -Rv
命令进行修复。
本文由 Ethan 创作,采用 知识共享署名4.0 国际许可协议进行许可。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。