Linux SELinux 工作原理及日志管理详解
SELinux(Security Enhanced Linux)
系统资源都是通过进程来读取更改的,为了保证系统资源的安全,传统的Linux使用用户、文件权限的概念来限制资源的访问,通过对比进程的发起用户和文件权限以此来保证系统资源的安全,这是一种自由访问控制方式(DAC);但是随着系统资源安全性要求提高,出现了在Linux下的一种安全强化机制(SELinux),该机制为进程和文件加入了除权限之外更多的限制来增强访问条件,这种方式为强制访问控制(MAC)。这两种方式最直观的对比就是,采用传统DAC,root可以访问任何文件,而在MAC下,就算是root,也只能访问设定允许的文件。
目录
SELinux的工作原理
工作模式和工作类型
安全上下文
SELinux日志管理
一、SELinux的工作原理
先说下SELinux下的几个基本的概念
主体 # SELinux管理的主体为进程
目标 # SELinux通过管理进程,来限制进程访问的目标,指文件
工作模式 # 决定SELinux机制的启动与否
enforcing ===>强制模式,SELinux已经启动
permissive===>宽容模式,SELinux已经启动,但不会禁止,只是会提出警告信息
disabled ===>关闭模式,关闭SELinux
工作类型(SELinux type) # 表示SELinux具体的安全性策略
strict ===>每个进程都受限制(仅在CentOS5)
targeted===>默认类型为targeted,主要限制网络服务
minimum ===>简化版的targetd,限制部分网络服务(centos7)
mls ===>多级安全限制,较为严格
安全上下文(security context)
这个是我们主要修改的地方,进程必须和文件的安全上下文对应(不是必须一样)才能对其进行访问。
ls -Z 文件名 # 查看文件的安全上下文
ps -eZ # 查看进程的安全上下文
sestatus # 查看SELinux的具体的工作状态
工作原理如下图:
二、工作模式和工作类型
2.1 工作模式
getenforce可以查看当前SELinux的工作模式;setenforce可以修改SELinux的工作模式,不过仅能在permissive和enforcing之间切换。
[root@CentOS6 ~]# setenforce 0|1 分别代表permissive、enforcing
使用命令修改工作模式只在当前有效,想要开机生效,而且如果想要在disabled和其他两种模式之间切换,只有修改配置文件参数然后重启,该配置文件是/etc/selinux/config,另外也可以通过/etc/sysconfig/selinux文件修改,其实该文件是/etc/selinux/config的软链接文件
notice:SELinux从disabled切换到其他模式的时候,系统的重启会花费很长的时间,因为需要为每个受管制的进程和文件写入安全上下文,我的小伙伴以为是配置过程中出错然后直接恢复快照了。
2.2 工作类型
SELinux下存在不同的规则,SELinux根据不同的工作类型对这些规则打开或关闭(on|off<布尔值1|0>),然后通过规则的开启与关闭具体地限制不同进程对文件的读取。
getsebool -a 或者 sestatus -b # 查看当前工作类型下各个规则的开启与否
setsebool -P 规则名称 [0|1] # 修改当前工作类型下指定规则的开启关闭,-P表示同时修改文件使永久生效
三、安全上下文
3.1 security context介绍
安全上下文存在于进程与文件中,context随进程一起存入内存中,文件的context存放在其对应的inode中,因此进程在访问文件时,要先读取inode,再判断是否能够访问该文件。
ls -Z # 显示文件的安全上下文
ps -eZ # 显示所有进程的安全上下文
context可以有5个字段,以:为分割符,分别代表的含义如下
user | role | type | sensitivity | category |
身份识别 unconfined_u不受限的用户或文件 system_u受限的进程或文件 | 文件、进程、用户 object_r文件 system_r进程和用户 | 数据类型,重要 何种类型进程访问何种文件 | 安全级别 s0最低 只要在msl下才有意义 | 划分的不同分类,当它不存在了
|
context查询工具seinfo、sesearch
seinfo -u # 查询所有的user字段的种类
seinfo -r # 查询所有的role字段的种类
seinfo -t # 查询所有的type字段的种类
sesearch -A 可以查询什么类型进程可以读取什么type类型的文件
sesearch -A -s 进程type # 查询type类型的进程能够读取的文件type
sesearch -A -b 规则(规则的boolean值,所以为-b选项,理解为bool规则)
# 查询指定规则下放行的进程能够读取的文件type
3.2 当前context和期望context
系统中的每个文件都会有context,我们使用ls -Z查询出来的我们看到的context就是当前context;那期望context又是什么呢,系统会把每个文件的默认context记录下来并保存,这样系统记录下来的就是期望context。semanage命令可以管理每个文件的期望context,也叫期望标签。
semanage fcontext -l # 查看所有的期望SELinux标签
semanage fcontext -a -t type 目标目录 # 添加期望SELinux标签
semanage fcontext -m -t type 目标目录 # 修改期望SELinux标签
semanage fcontext -d -t type 目标目录 # 删除期望SELinux标签
修改规范:
3.3 修改当前context
使用chcon命令手动修改security context,格式chcon 选项 目标文件
chcon # 手动修改文件的context,-R选项可以递归修改目录,-v选项可以显示context的修改前后的结果
chcon -t # 修改文件的context的type字段
chcon -u # 修改文件的context的user字段
chcon -r # 修改role字段
chcon -l # 修改安全级别
chcon -h # 针对软链接文件的修改,不加-h则会修改软链接对应的原文件
chcon --reference=file # 以file的context为模板修改
使用restorecon命令修改context为期望context,格式restorecon 选项 目标文件,
restorecon -R # 递归修改目录
restorecon -v # 显示修改的过程
3.3 semanage修改进程访问的端口号
虽然听起来是修改端口号的,但是到底还是修改安全上下文的,我们用semanage工具,命令为semanage port
查询某个服务的context type字段
语法:semanage port -l |grep 服务名
添加某个端口为指定服务的访问端口
语法:semanage port -a -t type -p 协议 端口号(不要与常用端口重复)
例如添加ssh服务的端口号,默认为22
四、SELinux日志管理
SELinux阻止的进程的日志记录存放在/var/log/audit/audit.log文件中,但是该文件中的内容用户阅读体验很差,可以去cat /var/log/audit/audit.log看看,因此系统为我们提供了sealert工具,帮助我们整理该日志文件,sealert工具处理日志文件的时候需要花费一点时间,请耐心等待。
另外SELinux的日志功能需要auditd.service服务的开启。
结合案例(apache SELinux配置)来了解sealert工具:
2./usr/sbin/httpd命令会开启进程去读取/var/www/html/目录下以.html结尾的文件,现在在家目录下创建文件~/index.html,随意编写内容,之后把新创建的文件移动至/var/www/html/下。
3.我们通过浏览器,在地址栏输入本机IP,查看成功与否,当出现如下界面的时候表示访问失败。
4.我们在配置服务的时候确定了没有问题,这时候我们要想到可能是SELinux阻止了我们访问。我们通过命令
sealert -a /var/log/audit/audit.log
查看SELinux日志,我们找到httpd的关键字,阅读内容,下图中的内容是我们主要关注的部分,其他则是/var/log/audit/audit.log的内容,我们可以忽略。最后我们优先考虑改动最小的解决方案,即修改SELinux标签。
5.执行命令restorecon -v /var/www/html/index.html,就是修改该文件为httpd能够访问的默认标签
6.再用浏览器访问查看结果,这次成功。