SELinux 简介
SELinux 全称是 Secure Enhanced Linux, 是MAC (Mandatory Access Control,强制访问控制系统)的一个实现,目的在于明确的指明某个进程可以访问哪些资源(文件、网络端口等)
MAC 的工作方式:
linux 传统的权限管理称为『自主式存取控制 (Discretionary Access Control, DAC)』,基本上就是依据程序的拥有者与文件资源的rwx权限来决定有无存取的能力。为了解决这种单一的权限管理模式,SELinux 导入了委任式存取控制 (Mandatory Access Control, MAC)。
MAC 的管理方式大概分为4个模块分别是:
- 主体( sbuject ):用户或者用户运行的进程,比如/usr/sbin/httpd
- 对象 ( object ) :被主体访问的对象(资源),比如File、Directory、IP、Socket等系统资源;
- 政策 ( policy ) :定义主体读取对象的规则数据库
- 安全性上下文(security context):SELinux 的核心,分为进程安全上下文、文件安全上下文
简而言之,MAC通过既定的各种政策,将主体(也就是 process)通过安全性文本,与目标进行对比从而最终得出主体对于目标是否有使用权限的方式。
SELinux 模式
SELinux 拥有三个基本的操作模式,当中 Enforcing 是缺省的模式。此外,它还有一个 targeted 或 mls 的修饰语。这管制 SELinux 规则的应用有多广泛,当中targeted是较宽松的级别。
- Enforcing: 这个缺省模式会在系统上启用并实施 SELinux 的安全性政策,拒绝访问及记录行动
- Permissive: 在 Permissive 模式下,SELinux 会被启用但不会实施安全性政策,而只会发出警告及记录行动。Permissive 模式在排除 SELinux 的问题时很有用
- Disabled: SELinux 已被停用
安全性上下文
SELinux 系统中的进程和文件都标记了 SELinux 的上下文,这个上下文包含了许多有用的信息,包括SELinux用户(不同于Linux系统的用户)、角色(Role)、类型(Type)和级别(Security Level)等。
SELinux 上下文广泛使用在 进程、Linux用户、文件中
ls -Z [file|dir] #查看文件或目录的SELinux上下文信息
ps -eZ #查看进程上下文信息
id -Z #查看Linux系统用户相关的SELinux上下文信息
SELinux 上下文的组成:
user:role:type:level
$ ls -Z
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 .
drwxr-xr-x. root root system_u:object_r:var_t:s0 ..
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html
drwxr-xr-x. root root unconfined_u:object_r:svirt_sandbox_file_t:s0 jenkins
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 project
user:用户区域,指的是selinux环境下的用户,可用semanage login -l 查看SELinux 用户与 Linux 用户之间的映射关系
role:通过角色可以决定 SELinux 用户可以访问哪些域,而最终决定了SELinux 用户可以访问哪些对象类型。通过这种机制可以降低权限提升的风险
type:类型是类型强制(Type Enforcement)机制的一个属性,也是 TE 机制在 SELinux 中的实现,为进程定义了域,为文件定义了类型
level:控制级别,Multi-Category Security(MCS)
启用/禁用SELinux
查看SELinux是否开启
$ sestatus -v
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: enforcing
Mode from config file: enforcing
Policy version: 21
Policy from config file: targeted
如果SELinux status参数为enabled即为开启状态
关闭SELinux
1) 永久关闭,修改/etc/selinux/config文件,之后重启机器即可
SELINUX=disabled
2) 临时关闭(不用重启机器):
setenforce 0 #设置SELinux 成为permissive模式,
setenforce 1 设置SELinux 成为enforcing模式
日志分析与故障排除
默认情况下,SELinux的日志信息是由Linux审计系统auditd写在 /var/log/audit/audit.log里
autitd守护进程未启动,则写在/var/log/messages里
如果auditd.service未启动(selinux已开启的情况下),查看/var/log/message:
May 10 19:44:09 localhost kernel: audit: type=1400 audit(1525952649.863:10): avc: denied { read } for pid=615 comm="auditd"
name="ld.so.cache" dev="dm-0" ino=8488256 scontext=system_u:system_r:auditd_t:s0 tcontext=system_u:object_r:unlabeled_t:s0 tclass=file permissive=1
此时启动出错可采用如下方式解决,即:
semanage permissive -a auditd_t
例如:配置redis,修改默认端口为5000,启动时日志文件/var/log/messages出现的信息:
type=AVC msg=audit(1511937910.858:596): avc: denied { name_bind } for pid=17835
comm="redis-server" src=5000 scontext=system_u:system_r:redis_t:s0
tcontext=system_u:object_r:commplex_main_port_t:s0 tclass=tcp_socket
audit2allow -w -a 查看详细的信息
利用 audit2allow 创建自定 SELinux 政策模块
grep redis /var/log/audit/audit.log | audit2allow -M redis
或者
ausearch -m AVC | audit2allow -a -M redis(名称自定义)
5.利用 semodule 这个指令将拒绝的政策模块装入现有的 SELinux 政策内
semodule -i redis.pp
也可以使用sealert 来解决问题(需要安装yum install setroubleshoot)
查看支持的端口
semanage port -l | grep redis
例如:
[root@localhost ~]# semanage port -l | grep redis
redis_port_t tcp 6379, 16379, 26379
SELinux相关的工具
policycoreutils:提供与 SELinux 相关的命令,比如 restorecon, secon, setfiles, semodule , load_policy 和 setsebool 来操作和管理 SELinux。
policycoreutils-python:提供命令比如 semanage, audit2allow, audit2why和chcat来管理和操作SELinux。
setroubleshoot-server:翻译 SELinux 的拒绝操作体质信息,为 sealert 工具提供可以查看的、可读性好的信息。
setools/setools-console/setools-gui:这些安装包提供了与 SELinux 相关的策略分析、检索、日志审计与监控、文件上下文管理管理的相关工具。setools是元工具,setools-gui提供了 apol, seaudit 工具;setool-console 则提供了 sechecker, sediff, seinfo, sesearch, 和 findcon 等命令行工具。
mcstrans:提供对 SELinux 上文中的级别(比如 s0-s0:c0.c1023)翻译的工具。
libselinux-utils:提供 avcstat, getenforce, getsebool, matchpathcon, selinuxconlist, selinuxdefcon, selinuxenabled, 和 setenforce 工具。
参考资料