简介
SELinux:Security Enhanced Linux,安全强化Linux
自主访问控制 DAC
这是传统文件权限与账号关系,依据进程的拥有者与文件资源的rwx权限来决定有无存取的能力。
缺点:
- root具有最高权限
如果不小心某个进程被有心人取得,且该进程属于root权限,那么这支进程就可以在系统上进行任何资源的存取。
- 使用者可以取得进程来更改文件资源的访问权限
如果不小心将某个目录设定为777,由于对任何人的权限都是rwx,因此该目录就会被任何人随意存取。
委任式访问控制 MAC
可针对特定的进程与特定的文件资源来进行资源管控;即使你是root,在使用不同进程时,你所能取得的权限并不一定是root,需要看当时该进程设定。
MAC控制主体为进程,目标是该进程能否读取的文件资源
左图:
没有SELinux的DAC情况,root主导的Apache进程,可在三个目录中任意新建文件与修改
右图:
有SELinux的DAC情况,SELinux仅会针对Apache此进程放行部分目录
SELinux运作模式
概念说明
主体(Subject)
进程
目标(Object)
文件系统
政策(Policy)
centos7中仅有提供三个主要政策
- targeted(定向):针对网络限制较多,针对本机限制较少;预设的政策,建议用
- minimum(最小):由targeted修订而来,仅针对选择的进程来保护
- mls:完整的SELinux限制,较为严格
安全性文本(Security Context)
在政策允许后,主体与目标的安全性文本必须一致才能正常读写。先匹配政策,再对比安全性文本。
安全性文本是存储在inode内的;当某进程向读取目标文件资源时,同样需要读取inode。
#查看root家目录下文件的SELinux信息
[root@wenzi ~]#ll -Zd /root
dr-xr-x---. 2 root root system_u:object_r:admin_home_t:s0 173 M、ay 19 16:19 /root
[root@wenzi ~]#ll -Z
total 8
-rw-------. 1 root root system_u:object_r:admin_home_t:s0 1279 May 15 02:35 anaconda-ks.cfg
-rwxr-xr-x. 1 root root unconfined_u:object_r:admin_home_t:s0 2431 May 19 16:16 centos8init.sh
安全性文本主要用冒号:分隔为三个字段:
Identity:role:type 身份:角色:类型
- 身份
unconfined_u:不受限的用户,即该文件来自不受限制的进程产生的。通常使用可登入账号取得bash后,预设的bash环境不受SELinux控制,所以此bash进程产生的文件其身份大多是unconfined_u
system_u:系统用户,大部分是系统自己产生的文件
- 角色
object_r:代表的是文件或目录等文件资源
system_r:代表的是进程,但一般的使用者也会被指定为system_r
- 类型
在预设的targeted政策中,identity和role基本是不重要的,关键在于type。
在文件资源上称为类型type
在主体进程上称为领域domain
domain和type相搭配,决定主体与目标之间是否具有可以读写的权限
进程与文件SELinux type字段相关性
targeted政策下大致对应如图
身份识别 | 角色 | 在targeted意义 |
unconfined_u | unconfined_r | 一般可登入使用者的进程,受限较少的进程,如bash,X windows相关软件 |
system_u | system_r | 大多数的系统进程均是这种类型 |
最重要的字段是类型字段type,主体与目标之间是否具有可读写的权限,与进程的domain及文件的type有关
SELinux三种模式的启动、关闭与观察
enforcing:强制模式
表示SELinux运行中,且已经正确的开始限制 domain/type
permissive:宽容模式
表示SELinux运行中,会有警告讯息,但并不会实际限制 domain/type 的存取;此模式可用作SELinux的Debug之用
disabled:关闭
SELinux并没有实际运作
流程
主体进程需要经过政策规则、安全文本对比、rwx权限规范,都通过才能顺利读取文件
并非所有的进程都被SELinux管制,所以左侧是 受限的进程主体。
查看进程是否受限
当前SELinux模式为 Enforcing 政策规则为 target
[root@wenzi ~]# ps -eZ | egrep "crond|bash"
system_u:system_r:crond_t:s0-s0:c0.c1023 557 ? 00:00:00 crond
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 1055 pts/0 00:00:00 bash
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 1060 ? 00:00:00 bash
可见 crond 是受限的主体进程,需要经过流程图;bash 是不受限的类型,进判断 rwx 即可
查看当前SELinux模式
查看当前SELinux政策(Policy)
命令:sestatus [-vb]
-v:检查列于 /etc/sestatus.conf 内的文件与进程的安全性文本内容
-b:将目前政策规则布尔值列出,即哪些规则是否要启动(0/1)
修改SELinux模式
配置文件 /etc/selinux/conf ,默认如下
开启SELinux
SELINUX=enforcing 修改完必须重启
关闭SELinux
SELINUX=disabled 修改完必须重启
Enforcing模式下可在Enforcing和Permissive间切换
切换为Permissive
setenforce 0
切换为Enforcing
setenforce 1
注意:无法再disabled模式下切换
某些特殊情况下,从 disabled 切换为 Enforcing 后,部分服务无法启动,提示 /lib/xxx 里面的数据没有权限读取,所以启动失败.这大多是由于在重新写入SELinux type(Relabel)出错之故,使用 Permissive 就没有这个错误。那如何处理呢?最简单的方法就是在 Permissive的状态下,使用restorecon -Rv / 重新还原所有SELinux的类型。
SELinux政策内的规则管理
SELinux各个规则的布尔值查询
getsebool [-a] [规则名]
-a:列出目前系统上所有的SELinux规则的布尔值为开启或关闭
sestatus -b 查看
SELinux各个规则规范的主体进程能够读取的文件 SELinux type 查询
使用 seinfo 命令安装工具 yum -y install setools-console.x86_64
在 查看进程是否受限 时,知道 crond 进程的 type 是 crond_t,查询 crond_t 能读取的文件 SELinux type 有哪些?使用 sesearch 命令
修改SELinux规则的布尔值
使用 setsebool 命令
SELinux安全文本的修改
使用 restorcon 让文件恢复正确的 SELinux type
命令:restorecon [-Rv] 文件或目录
选项:
-R:连同次目录一起修改
-v:将过程显示到屏幕上
默认的安全性文本查询与修改
使用 semanage 命令
当提示没有 semanage 命令时,先查询 semanage 命令来自哪个软件包,再安装对应包
[root@wenzi ~]# yum provides semanage
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
policycoreutils-python-2.5-34.el7.x86_64 : SELinux policy core python utilities
Repo : base
Matched from:
Filename : /usr/sbin/semanage[root@wenzi ~]# yum -y install policycoreutils-python-2.5-34.el7.x86_64
范例可见 红帽认证—RHCSA_www.example.com_笔落_惊风雨的博客-CSDN博客 中 调试SELinux 题目
帮助文档:man semanage fcontext