SELinux小记
in Linux with 0 comment
SELinux小记
in Linux with 0 comment

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)。

-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

代表类型:

Role

代表角色:

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导致问题的方法,但是当出现问题时,要用什么指令修改什么,这个还是需要进行排错以后才能确定,排错之前需要用到的组件有auditdsetroubleshootd,一定要安装否则不会有日志,安装后要重启服务器。

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命令进行修复。

The article has been posted for too long and comments have been automatically closed.