跳转至

SElinux

运行状态

SELinux 有三个运行状态,分别是disabled, permissive 和 enforcing

1
2
3
4
5
6
7
Disable: 禁用SELinux,不会给任何新资源打Label,如果重新启用的话,将会给资源重新打上Lable,过程会比较缓慢。
Permissive:如果违反安全策略,并不会真正的执行拒绝操作,替代的方式是记录一条log信息。临时启用 -> setenforce 0
Enforcing: 默认模式,SELinux的正常状态,会实际禁用违反策略的操作   临时启用 -> setenforce 1
-------
getenforce 查看当前的运行状态  
setenforce 0 命令禁用SELinux
sestatus  可以查看完整的状态信息

运行时间改变策略

SELinux Booleans Booleans允许在运行时修改SELinux安全策略。

列出所有的Booleans选项

1
2
3
4
5
semanage boolean -l
SELinux boolean                State  Default Description

smartmon_3ware                 (off  ,  off)  Determine whether smartmon can...
mpd_enable_homedirs            (off  ,  off)  Determine whether mpd can traverse...
临时修改httpd_can_network_connect_db状态为开启

setsebool httpd_can_network_connect_db on

Linux下默认的接入控制是DAC

其特点是资源的拥有者可以对他进行任何操作(读、写、执行)。
当一个进程准备操作资源时,Linux内核会比较进程和资源的UID和GID,如果权限允许,就可以进行相应的操作。此种方式往往会带来一些问题,如果一个进程是以root的身份运行,也就意味着他能够对系统的任何资源进行操作,而且不被限制。
假如我们的软件存在漏洞呢?这个往往是一个灾难性的问题。因此,就引出了另外的一种安全接入控制机制MAC,Linux下的一种现实是SELinux.

Mandatory Access Control (MAC)

SELinux 属于MAC的具体实现,增强了Linux系统的安全性。MAC机制的特点在于,资源的拥有者,并不能决定谁可以接入到资源。具体决定是否可以接入到资源,是基于安全策略。而安全策略则是有一系列的接入规则组成,并仅有特定权限的用户有权限操作安全策略。

SELinux的实现是依赖于Linux提供的Linux Security Module框架简称为LSM。 他并不是Linux模块,而是一些列的hook,不提供任何的安全机制。LSM的的重要目标是提供对linux接入控制模块的支持。 LSM 在内核数据结构中增加了安全字段,并且在重要的内核代码(系统调用)中增加了hook。可以在hook中注册回调函数对安全字段进行管理,以及执行接入控制。

SELinux

Security Enhanced Linux(SELinux) 为Linux 提供了一种增强的安全机制,其本质就是回答了一个“Subject是否可以对Object做Action?”的问题,例如 Web服务可以写入到用户目录下面的文件吗?其中Web服务就是Subject而文件就是Object,写入对应的就是Action。

依照上面的例子,我们引入了几个概念,分别是Subject、Object、Action、以及例子没有体现出来的Context:

1
2
3
4
5
Subject: 在SELinux里指的就是进程,也就是操作的主体。
Object: 操作的目标对象,例如 文件
Action: 对Object做的动作,例如 读取、写入或者执行等等
Context: Subject和Object都有属于自己的Context,也可以称作为Label。Context有几个部分组成,分别是SELinux User、SELinux Role、SELinux Type、SELinux 
Level,每个部分的具体含义
用户程序执行的系统调用(例如读取文件),都要被SELinux依据安全策略进行检查。

如果安全策略允许操作,则继续,否则将会抛出错误信息给应用程序。SELinux决策的同时还需要Subject和Object的Context信息,确定所属的User、Role和Type等信息,以此查询对应的安全策略进行决策。SELinux同样也使用了AVC机制用于缓存决策结果,以此来提高性能。