SELinux 全称 Security Enhanced Linux (安全强化 Linux),是 MAC (Mandatory Access Control,强制访问控制系统)的一个实现,目的在于明确的指明某个进程可以访问哪些资源(文件、网络端口等)。
强制访问控制系统的用途在于增强系统抵御 0-Day 攻击(利用尚未公开的漏洞实现的攻击行为)的能力。所以它不是网络防火墙或 ACL 的替代品,在用途上也不重复。
举例来说,系统上的 Apache 被发现存在一个漏洞,使得某远程用户可以访问系统上的敏感文件(比如/etc/passwd
来获得系统已存在用户),而修复该安全漏洞的 Apache 更新补丁尚未释出。此时 SELinux 可以起到弥补该漏洞的缓和方案。因为 /etc/passwd 不具有 Apache 的访问标签,所以 Apache 对于 /etc/passwd
的访问会被 SELinux 阻止。
相比其他强制性访问控制系统,SELinux 有如下优势:
- 控制策略是可查询而非程序不可见的。
- 可以热更改策略而无需重启或者停止服务。
- 可以从进程初始化、继承和程序执行三个方面通过策略进行控制。
- 控制范围覆盖文件系统、目录、文件、文件启动描述符、端口、消息接口和网络接口。
selinux有三种状态
enforcing 在强制模式下的SELinux将强制执行在Linux系统上的政策,并确保用户和进程的任何未经授权的访问尝试将被拒绝。 访问拒绝也写入相关的日志文件
permissive 许可模式类似于半启用状态。 SELinux不会在允许模式下应用其策略,因此不会拒绝任何访问。 但是,任何策略违规仍然记录在审核日志中。 这是一个伟大的方式来测试SELinux之前强制它。
disabled 禁用模式是不言自明的 – 系统将不会运行增强的安全性。
获取selinux的状态
sestatus
设置selinux状态
setenforce 0 将selinux设置为permissive
setenforce 1将selinux设置为enforcing
需要说明的是如果是disabled是无法使用setenforce的,因为是禁用状态。
可以修改selinux为disabled,但是不安全
vim /etc/selinux/config
# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted
设置完需要重启才能生效
selinux策略
selinux是控制程序是否能够读取档案资源
查看安全性本文(secruity context)
ls -Z查看当前目录下的安全性本文
[root@www ~]# ls -Z -rw-------. root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfg drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 bin -rw-r--r--. root root system_u:object_r:admin_home_t:s0 install.log -rw-r--r--. root root system_u:object_r:admin_home_t:s0 install.log.syslog # 上述下划线的部分,就是安全性本文的內容!
分别是identify身份识别,role角色,type类型
常见的身份识别
root 表示root账号身份
system_u 表示系统程序方面的识别,通常就是程序
user_u 代表某个一般使用者账号相关身份
角色
object_r 代表档案或目录等档案资源
system_r 代表程序
类型
type
domain
修改安全性本文
chcon
恢复安全性本文
restorecon
主要有seinfo命令、sesearch命令、getsebool命令、setsebool命令、semanage命令。
seinfo和sesearch都是用来查询的
使用seinfo命令可以查询SELinux的策略提供多少相关规则,如果查到的相关类型或者布尔值,想要知道详细规则时,使用sesearch命令查询。
getsebool
getsebool命令是用来查询SElinux策略内各项规则的布尔值
setsebool
setsebool命令是用来修改SElinux策略内各项规则的布尔值
semanage
semanage命令是用来查询与修改SELinux默认目录的安全上下文
[root@www ~]# semanage {login|user|port|interface|fcontext|translation} -l [root@www ~]# semanage fcontext -{a|d|m} [-frst] file_spec 選項與參數: fcontext :主要用在安全性本文方面的用途, -l 為查詢的意思; -a :增加的意思,你可以增加一些目錄的預設安全性本文類型設定; -m :修改的意思; -d :刪除的意思。
sestatus用来查看当前的selinux状态
排除 SELinux 疑难
你终有一天会被 SELinux 阻止你存取所需的东西,而且要解决这个问题。SELinux 拒绝某个档案、进程或资源被存取的基要原因有数个:
- 一个被错误标签的档案。
- 一个进程在错误的 SELinux 安全性脉络下运行。
- 政策出错。某个进程要存取一个在编写政策时意料不到的档案,并产生错误信息。
- 一个入侵的企图。
头三个情况我们可以处理,而发出警报及通告正正是第四个情况的预期表现。
日志档是排除任何疑难的关键,而 SELinux 亦不例外。SELinux 预设会透过 Linux 审计系统 auditd 将日志写在 /var/log/audit/audit.log 内,而该务服预设为启用的。假若 auditd 长驻程式并未运行,信息将会被写进 /var/log/messages。SELinux 的日志都以 AVC 这个关键字作标签,让 grep 等程式可轻易地把它们从其它信息中过滤出来。
由 CentOS 5 起,你可以用 SELinux 排除疑难工具协助你分析日志档,将它们转换为供人阅读的格式。这个工具包含一个以可读格式显示信息及解决方案的图像介面、一个桌面通报图示、与及一个长驻进程,setroubleshootd,它负责查阅新的 SELinux AVC 警告并传送至通报图示。不运行 X 伺服器的用户可设置以电邮通报。SELinux 排除疑难工具是由 setroubleshoot 套件所提供的。这个工具可以从 X 视窗图像管理员的「系统」选单或从指令行启动:
sealert -b
不运行 X 伺服器的人可以透过指令行产生供人阅读的报告:
sealert -a /var/log/audit/audit.log > /path/to/mylogfile.txt
总结一下
selinux是用来对进程权限进行限制的。限制某些进程只能读取某些文件。
一般我们如果通过setenforce 0吧selinux设置为警告模式之后,程序正常运行了。那就说明是selinux在捣乱。通常的做法是直接disable禁用掉selinux,但是这样不安全。
总结下一些简单的解决方案
一般来说都是因为权限的问题,很可能是进程没有权限读取文件。
以apache为例
我们检视 Apache 的主页,/var/www/html/index.html 的 SELinux 安全性脉络来看看它们如何运作:
$ ls -Z /var/www/html/index.html -rw-r--r-- username username system_u:object_r:httpd_sys_content_t /var/www/html/index.html
/var/www/html/index.html 类别是httpd_sys_content_t
现在来看看apache进程的selinux安全性脉络
$ ps axZ | grep httpd
system_u:system_r:httpd_t 3234 ? Ss 0:00 /usr/sbin/httpd
从类别栏我们看出 Apache 在 httpd_t 这个类别区域内运行
最后,让我们看看位于我们的主目录内的一个档案的安全性脉络:
$ ls -Z /home/username/myfile.txt
-rw-r--r-- username username user_u:object_r:user_home_t /home/username/myfile.txt
它的类别是 user_home_t,这是位于每个户主目录内的档案的预设类别。
唯有相似的类别才可互相存取,因此以 httpd_t 运行的 Apache 可以读取拥有 httpd_sys_content_t 类别的 /var/www/html/index.html。由于 Apache 在 httpd_t 这个区域内运行但不属 username 这个用户,纵使 /home/username/myfile.txt 可供任何人读取,Apache 却无法存取该档案,因为它的 SELinux 安全性脉络并不是 httpd_t 类别。倘若 Apache 被人占用,又假设它仍未取得更改 SELinux 标签至另一个脉络的 root 权限,它将会无法启动 httpd_t 区域外的进程(藉此防止权限升级),或存取与 httpd_t 区域不相关的档案。
所以如果要让httpd能读取myfile.txt文件
可以使用semanage命令
semanage -a -t httpd_sys_content_t /home/username/myfile.txt
将myfile.txt的安全性文本改为httpd_sys_content_t,这样就可以了。
restorecon 这个指令可以用来还原为档案预设的安全性脉络
restorecon -v /var/www/html/index.html
一般修改安全性文本就可以解决问题了,但是如果不行的话可以查看selinux的日志,里面会提示你应该怎么做。如何查看日志上面已经提到了
cat /var/log/messages
参考自https://wiki.centos.org/zh/HowTos/SELinux