Fork me on GitHub

SELinux

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
ausearch

利用 audit2allow 创建自定 SELinux 政策模块

grep redis /var/log/audit/audit.log | audit2allow -M redis
或者
ausearch -m AVC | audit2allow -a -M redis(名称自定义)

ausearch-audit2allow

5.利用 semodule 这个指令将拒绝的政策模块装入现有的 SELinux 政策内

semodule -i redis.pp

也可以使用sealert 来解决问题(需要安装yum install setroubleshoot)

sealert

查看支持的端口

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 工具。

参考资料

CentOS SELinux

轻轻的我走了,正如我轻轻的来