SELinux
概念
SELinux(Security Enhanced Linux):Linux安全强化
SELinux是在进行进程和文件等详细权限配置时依据的一个内核模块;且由于启动网络服务的也是进程,所以SELinux能够控制网络服务能否使用系统资源
DAC(Discretionary Access Control):自主访问控制
1)依据进程的属主/属组与文件资源的rwx权限决定有无使用的权限
2)缺陷:root具有最高权限,且系统存在很多进程都由root主导导致可通过获取进程进行权限的非法提升
MAC(Mandatory Access Control):强制访问控制
1)针对特定的进程与特定的文件资源进行权限配置
2)SELinux本质就是通过MAC管理和配置进程权限
所以该进程可在三个目录下操作任何文档
//MAC由于有SELinux的权限设置(类似框架)
则apache进程仅能操作预先配置的目录(不能穿透框架操作没配置的)
运行模式
SELinux通过指定策略中的多个规则和安全上下文对比的结果决定主体是否具有操作目标资源的权限
主体(Subject):进程(SELinux主要管理为进程,而不是用户)
策略(Policy):通过多个详细规则(rule)来指定不同的服务是否具有某些目标操作的权限
Policy | 含义 |
---|---|
targeted | 主要针对网络服务,本机限制较少 (默认策略) |
minimum | 仅针对选择的进程进行限制 (由targeted自定义而来) |
mls | 完整的SELinux限制 (限制最严格) |
1)主体进程必须通过SELinux策略内的规则放行;
2)才可与目标资源进行安全上下文的对比;
//最终能否读写目标还与文件系统的rwx权限等设置有关
安全上下文(Security context):SELinux的“rwx”权限配置
//安全上下文存放于每个文档的inode中
查看用户安全上下文的命令:id -Z
查看进程安全上下文的命令:ps -Z
字段 | 含义 |
---|---|
用户类型 | 指定该资源属于的用户类型 root:root用户 user_u:普通用户 system_u:系统用户 uncondfined_u:不受限用户 |
资源类型 | 指定该资源的类型 object_r:代表该资源是文档(最常见) system_r:代表该资源是进程 unconfined_r:代表不受限的资源 |
数据类型 | 根据策略判断进程能否读写指定的文档 |
灵敏度 | 指定访问限制层级 0-15级(默认s0),数值越低限制越低 |
种类 | 指定划分不同种类 c0-c1023代表共有1024个种类 |
2)数据类型是安全上下文中最重要的字段,主体能否访问资源就取决于:进程安全上下文的数据类型字段是否和文档安全上下文的数据类型字段相匹配
3)数据类型在主体和目标的定义不相同:在主体中被称为域(domain),在目标中被称为类型(type)
4)一个选项只能有一个灵敏度,但能有多个种类(且种类为可选字段)
用户类型 | 资源类型 | 对应的策略意义 |
---|---|---|
unconfined_u | unconfined_r | 普通登录用户的进程,且不受限。大多都是用户已顺利登录系统(不论是网络还是本机登录来获取可用的Shell)后,所用来操作系统的进程,如:Bash、X Windows等。 |
system_u | system_r | 系统账户,因此是非交互式的系统运行进程,大多数系统进程均为该类型 |
1)触发一个具有“crond_exec_t”数据类型的可执行目标文件,产生一个进程;
2)该文件的数据类型会使该进程具有“crond”的域;
3)再根据主机上已有策略制定的众多规则,规定能够读写的数据类型的资源;
4)由于crond进程的域(domain)被设置为可读写“system_cron_spool_t”数据类型的资源,且/etc/cron.d的数据类型为system_cron_spool_t;
5)因此只要相关配置文件存放到/etc/cron.d/目录下,crond进程都可读写;
启动/关闭
模式 | 含义 |
---|---|
Disabled | 关闭模式 SELinux没有运行 |
Permissive | 宽容模式 SELinux运行,但仅会有警告信息(不会限制进程) |
Enforcing | 强制模式 SELinux运行,正常限制domain/type |
但出错时仅会报错,并不会限制进程
getenforce命令:查看当前SELinux模式
指令格式:getenforce
sestatus命令:查看当前SELinux的策略
指令格式:sestatus 选项
选项 | 含义 |
---|---|
-v | 同时列出/etc/sestatus.conf内文件与进程的安全上下文 |
-b | 同时列出当前策略规则的布尔值 |
SELinux在运行中可在Enforcing和Permissive模式中互相切换(但不能关闭)
setenforce命令:切换SELinux模式
指令格式:setenforce 选项
选项 | 含义 |
---|---|
0 | 切换成Permissive(宽容模式) |
1 | 切换成Enforcing(强制模式) |
2)若由Disabled切换成Enforcing后开始报错(/lib/xxx里的数据没有权限读取)可切换到Permissive后使用“restorecon
-RV /”重新还原所有SELinux类型
//这是由于重新写入SELinux类型(Relabel)出错的原因
配置SELinux
getsebool命令:查看当前主机上策略的规则是否启动
指令格式:getsebool 选项
选项 | 含义 |
---|---|
-a | 列出当前主机上所有SELinux规则的布尔值状态 |
setsebool命令:修改SELinux规则的布尔值
指令格式:setsebool 选项 规则名 布尔值
选项 | 含义 |
---|---|
-P | 直接将设置值写入配置文件 |
seinfo命令:查看主机上SELinux配置
指令格式:seinfo 选项
选项 | 含义 |
---|---|
-b | 列出SELinux策略所有规则种类 |
-u | 列出SELinux所有用户类型种类 |
-r | 列出SELinux所有资源类型种类 |
-t | 列出SELinux所有数据类型种类 |
sesearch命令:查看SELinux
指令格式:sesearch 选项
选项 | 含义 |
---|---|
-A | 显示allow的数据 |
-s | 指定进程的域 |
-t | 指定数据类型 |
-b | 指定规则 |
进程可读写后面紧跟的SELinux数据类型
chcon命令:修改文档的SELinux安全上下文
指令格式1:chcon 选项 文档
选项 | 含义 |
---|---|
-R | 递归设置(同时设置该目录下的子目录) |
-u | 指定用户类型 |
-r | 指定资源类型 |
-t | 指定数据类型 |
-v | 若修改成功,将修改成果列出 |
指令格式2:chchon -R --reference=源文档 目标文档
1)根据源文档的安全上下文修改目标文档的安全上下文
restorecon命令:使文档的SELinux数据类型恢复默认模式
指令格式:restorecon 选项 文档路径
选项 | 含义 |
---|---|
-R | 递归恢复(连同子目录一同恢复) |
-v | 显示恢复过程 |
semanage命令:查询/修改文档默认SELinux安全上下文
指令格式1:semanage fcontext -l //列出所有安全上下文
1)semanage多种用法:login、user、port、interface、translation和fcontext
//其中fcontext作用于SELinux安全上下文
指令格式2:semanage fcontext 操作 选项 文档
操作 | 含义 |
---|---|
-a | 添加指定的默认安全上下文配置 |
-m | 修改指定的默认安全上下文配置 |
-d | 删除指定的默认安全上下文配置 |
选项 | 含义 |
---|---|
-s | 指定用户类型 |
-r | 指定资源类型 |
-t | 指定数据类型 |
日志文件协助
auditd服务:使SELinux的审核信息写入/var/log/audit/audit.log中
setroubleshootd服务:将SELinux报错信息和解决方法写入到/var/log/messages
1)本质上就是setroubleshootd服务将/var/log/audit/audit.log文件内的信息“翻译”成较高可读性的信息后,再存入/var/log/messages文件
2)setroubleshootd服务运行需要setroubleshoot和setroubleshoot-server软件
//由于auditd和setroubleshootd服务记录是同样的信息
所以在Centos 6以后,setroubleshootd服务就整合到auditd服务中
Centos 7中setroubleshootd运行流程:
1)先由auditd服务调用audispd服务;
2)再有audispd服务启动sedispatch程序;
3)sedispatch程序将原本的auditd信息“翻译”成setroubleshoot信息,并保存
sealert命令:根据setroubleshootd服务提供的信息诊断SELinux
指令格式:sealert -l 标识符