Linux基础知识 ·

管理SElinux

[隐藏]

查看 SELinux 状态

目前 SELinux 支持三种模式,分别如下:

  • enforcing:强制模式,代表 SELinux 运行中,且已经正确的开始限制 domain/type 了;
  • permissive:宽容模式:代表 SELinux 运行中,不过仅会有警告信息并不会实际限制 domain/type 的存取。这种模式可以运来作为 SELinux 的 debug 之用;
  • disabled:关闭,SELinux 并没有实际运行。

getenforce 命令可以查看 SElinux 的当前模式


sestatus 命令可以查看 SElinux 的当前状态

常用选项:

-v :检查列于 /etc/sestatus.conf 内的文件与程序的安全上下文内容;

-b :将目前策略的规则布林值列出,亦即某些规则 (rule) 是否要启动 (0/1) 之意;


SElinux配置文件
/etc/selinux/是存放所有策略文件和主要配置文件的目录。其内容如下:

启动与关闭SElinux

由于 SElinux 如今已被整合至 linux 内核,所以无论是关闭还是开启 SElinux ,或是改变其安全策略,都需要重启系统,重新加载内核才可以,而在SElinux启动状态,只可以切换其强制 (enforcing) 或宽容 (permissive) 模式。

SElinux  自2.6版本内核开始,默认已经整合入内核了,所以其之后的发行版大多都是默认开启SElinux的,如果需要关闭 SElinux 则需要在 grub 引导设置中将其关闭。在 /boot/grub/grub.cfg 文件中,内核配置中添加 selinux=0 就可以关闭 selinux 了,若是想要开启 SElinux 则只用删除 selinux=0 。

其内核加载的配置内容大致如下,若有多个内核,则会有多条配置,选择自己使用的内核来修改哦。

如果从 disable 转到启动 SELinux 的模式时, 由于系统必须要针对文件写入安全上下文的信息,因此启动过程会花费不少时间在等待重新写入 SELinux 安全上下文 (有时也称为 SELinux Label) ,而且在写完之后还得要再次的重新启动一次! 等到下次启动成功后,再使用 getenforce 或 sestatus 来观查看看有否成功的启动到 Enforcing 的模式!


如果你已经在 Enforcing 的模式,但是可能由于一些配置的问题导致 SELinux 让某些服务无法正常的运行, 此时你可以将 Enforcing 的模式改为宽容 (permissive) 的模式,让 SELinux 只会警告无法顺利连线的信息, 而不是直接抵挡主体程序的读取权限。

让 SELinux 模式在 enforcing 与 permissive 之间切换的方法为:

setenforce [0|1]

选项与参数:

0 :转成 permissive 宽容模式。

1 :转成 Enforcing 强制模式。

SELinux 运行范例

由于 CentOS  默认使用 targeted 这个策略,而这个策略主要是在管理网络服务,本机端的程序则比较不受 SELinux 的管制,那么我们就使用 WWW 服务器来说明一下 SELinux 的运行方式。

httpd 是Apache 软件的服务名称,其默认使用用户为 apache 。

先启动 httpd 服务。

使用 ps 查看 httpd 进程的 SElinux 信息。

ps -Z 这个『 -Z 』的选项可以让我们查阅程序的安全上下文!我们可以发现这整个程序的 domain 是 httpd_tt!

我们现在来做一个简单的首页,测试一下 httpd 服务是否正常运行,httpd服务默认的目录为 /var/www/html。

通过浏览器访问你的 IP 地址测试一下。

此时你的浏览器会通过 httpd 这个程序拥有的 httpd_t 这个 domain 去读取 /var/www/html/index.html 这个文件! 先来看看这个文件的权限与 SELinux 的安全上下文数据:

权限中对其他人是可读的,也就是 apache 有读取的 r 标志,而 SELinux 则是 httpd_sys_content_t 的类型 (type),也是 httpd_t 能读取!

而 httpd_t 可以读是因为 targeted 安全策略里面有默认的配置!


错误的 SELinux 安全上下文

上面演示了对于程序而言正确的安全上下文权限限制之后,再来看一下相对错误的安全上下文对程序的影响。

首先我们删除掉之前的首页文件。

然后在家目录创建一个和刚才一模一样的文件,然后使用 mv 将其移动到/var/www/html 目录当中。

但是因为是在家目录创建的,SElinux 给打上其默认安全上下文发生了变化哦。

再次查看一下我们搭建的 www ,注意后面指定访问 index.html ,否则 Apache 读取不到正确文件,就会跳转至其安装测试页面哦。

网页内容没有出现,而是提醒我们没有权限访问 index.html 文件。

我们再查看一下 index.html 的权限信息。

index.html 传统 rwx 中对于 apache 是有读权限的,但是我们在浏览器中却无法访问。那就是因为文件的 domain 为admin_home_t ,而 apache  的默认安全策略中对于管理员家目录可没有访问权限的,具体流程可以查看浅析SElinux中的流程图。

修改 SELinux 安全上下文

chcon [-R] [-t type] [-u user] [-r role] 文件

chcon [-R] --reference=范例 文件

常用选项与参数:

-R :连同该目录下的次目录也同时修改。

-t :后面接安全上下文的类型栏位!例如 httpd_sys_content_t 。

-u :后面接身份识别,例如 system_u。

-r :后面接角色,例如 system_r。

--reference=范例:拿某个文件当范例来修改后续接的文件的类型!


范例一:将刚刚的 index.html 类型改为 httpd_sys_content_t 的类型。

修改好之后通过浏览器访问,发现 index.html 又能正常访问了。

范例二:以 /etc/passwd 为依据,将 index.html 修改成该类型。


恢复默认的安全上下文

SElinux 默认定义了很多安全策略,比如我们刚开始在 /var/www/html 中新建 index.html,其默认打的安全上下文便是 httpd_sys_content_t 的类型,而在家目录中新建的文件其默认上下文又发生了变化。

因此我们就可以让 SElinux 根据其默认定义的一些策略,来恢复一些文件的默认安全上下文了。

restorecon [-Rv] 文件或目录

常用选项:

-R :连同次目录一起修改;

-v :将过程显示到萤幕上

范例三:将刚刚错误的 index.html 以默认的安全上下文改正过来。

这个过程完全没有动到 rwx 权限, 因为该权限本来就是对的!而错的部分是在于 SELinux 的安全上下文当中那个类型 (type) 的配置错误! 而配置错误的原因很可能是因为该文件由其他位置复制或移动过来所导致的!因此, 要善用 restorecon 以及 chcon 来处理这方面的问题!

 

SELinux 的安全策略与规则管理

一个主体程序能否读取到目标文件资源的重点在于 SELinux 的策略以及策略内的各项规则, 然后再通过该规则的定义去处理各目标文件的安全上下文,尤其是『类型』的部分。现在我们可以通过 sestatus 与 getenforce 去取得目前的 SELinux 状态。

查询SELinux策略

CentOS 默认使使用 targeted 安全策略,可以通过 seinfo 来查询其策略提供相关的规则。seinfo 由 setools 软件包提供。

seinfo 选项

常用选项:

-A :列出 SELinux 的状态、规则布林值、身份识别、角色、类别等所有信息

-t :列出 SELinux 的所有类别 (type) 种类

-r :列出 SELinux 的所有角色 (role) 种类

-u :列出 SELinux 的所有身份识别 (user) 种类

-b :列出所有规则的种类 (布尔值)


范例:列出 SELinux 在此策略下的统计状态。

 

 

查询SElinux策略内各项规则

sesearch [-a] [-s 主体类别] [-t 目标类别] [-b 布林值]

常用选项:

--all :列出该类别或布林值的所有相关信息。

-t :后面还要接类别。(例如 -t httpd_t)

-b :后面还要接布林值的规则。(例如 -b httpd_enable_ftp_server)


范例:找出目标文件资源类别为 httpd_sys_content_t 的有关信息

查询SElinux策略内各项规则的布尔值

getsebool [-a] [布尔值条款]

-a:列出目前系统上面的所有布尔值条款设置为开启或关闭值。


范例:列出目前系统上面的所有布尔值条款状态。

修改SElinux策略内各项规则的布尔值

setsebool [-P] 布尔值=[0|1]

-P:直接将设置值写入配置文件,该设置数据重启生效。


范例:修改 abrt_anon_write 状态。

修改SELinux默认的安全上下文

每个目录或文件都会有默认的安全上下文,因为系统的一些服务所放置文件的目录已经是确定的,有默认的安全上下文管理上会比较方便。

查询和修改默认的安全上下文使用 semanage 命令

semanage 位置参数 选项 选项参数

位置参数:

import、export、login、user、port、interface、module、node、fcontext、boolean、permissive、dontaudit

选项:

import:输出本地自定义

export:输出本地自定义

login:管理Linux用户和SELinux之间的登录映射受限用户

user:管理SELinux限制用户(角色和级别为SELinux用户)

port:管理网络端口类型定义

interface:管理网络接口类型定义

module:管理SELinux策略模块

node:管理网络节点类型定义

fcontext:管理安全上下文映射定义

boolean:管理布尔选择性地启用功能

permissive:管理进程类型强制模式

dontaudit:在策略中禁用/启用dontaudit规则

选项参数:

其每个选项又都有自己的子选项,可以使用 -h 查看每个选项的详细用法。

例如:semanage import -h


范例:查询默认安全上下文

SElinux日志管理

setroubleshoot 这个程序会将 SElinux 错误信息写入 /var/log/messages ,安装后重启生效。

例如前面我们做实验 httpd 服务时,index.html 文件读取就有过错误情况,那么我们去查看一下吧。

大意是说『SElinux 阻止了/usr/sbin /httpd 从 getattr 访问文件 /var/www/html/index.html, 想要查阅完整的数据,请运行 sealert -l ...』

所以,想要更完整的说明得要靠 sealert 配合其侦测到的错误代码来处理。

其给出了详细的错误原因与解决方案,我们就能很快的定位到错误,找到其解决方案了。

 


auditd 这个程序会将详细日志写入 /var/log/audit/audit.log ,安装后重启生效。

与 setroubleshoot 不同的是, auditd 会将许多的 SELinux 信息都记录下来,不仅仅是错误信息, 因此/var/log/audit/audit.log 非常的庞大!要直接到这文件里面去搜寻数据比较耗时费资源。不过,SELinux 有提供一个 audit2why 的命令来让我们查询错误信息的回报!

我们可以通过重定向将日志文件传输给 auditd 分析并输出反馈。

audit2why 的用法与输出结果如上,比较有趣的是那个 AVC ,AVC 是 access vector cache 的缩写, 目的是记录所有与 SELinux 有关的存取统计数据。输出的信息当中,会有谈到产生错误的问题为何,如上部分, 你会发现错误信息主要告知 type 不符,所以导致错误的发生!

不过 sealert  给出的反馈信息更易读与详细,因此我们可以使用 sealert 来分析 /var/log/audit/audit.log 日志文件。

参与评论