SELinux 初学者指南

SELinux 初学者指南

为课程学生准备的文章翻译 《Linux 安全》

SELinux或SecurityEnhancedLinux是美国国家安全局(NSA)为防止恶意入侵而开发的增强访问控制机制。 它在现有的自主(或选择性)模型(英文Discretionary Access Control,DAC)之上实现了强制(或强制)访问控制模型(英文Mandatory Access Control,MAC),即读、写、执行的权限。

SELinux 有三种模式:

  1. 强制执行 — 基于策略规则的访问拒绝。
  2. 允许的 — 记录违反政策的行为,这在强制模式下是被禁止的。
  3. 残疾人 — 完全禁用 SELinux。

默认情况下,设置位于 /etc/selinux/config

更改 SELinux 模式

要找出当前模式,请运行

$ getenforce

要将模式更改为宽容,请运行以下命令

$ setenforce 0

或者,更改模式 宽容强制执行, 执行

$ setenforce 1

如果需要完全禁用SELinux,那么只能通过配置文件来完成

$ vi /etc/selinux/config

要禁用,请更改 SELINUX 参数,如下所示:

SELINUX=disabled

设置 SELinux

每个文件和进程都标有 SELinux 上下文,其中包含用户、角色、类型等附加信息。 如果这是您第一次启用 SELinux,您首先需要配置上下文和标签。 分配标签和上下文的过程称为标记。 要开始标记,在配置文件中我们将模式更改为 宽容.

$ vi /etc/selinux/config
SELINUX=permissive

设置模式后 宽容,在根目录中创建一个空的隐藏文件,名称为 autorelabel

$ touch /.autorelabel

并重新启动计算机

$ init 6

注意:我们使用的模式 宽容 用于标记,因为使用该模式 强制执行 可能会导致系统在重新启动时崩溃。

如果下载卡在某些文件上,请不要担心,标记需要一段时间。 标记完成并且系统启动后,您可以转到配置文件并设置模式 强制执行并且还运行:

$ setenforce 1

您现在已成功在计算机上启用 SELinux。

监控日志

您可能在标记过程中或系统运行时遇到了一些错误。 要检查您的 SELinux 是否正常工作以及它是否没有阻止对任何端口、应用程序等的访问,您需要查看日志。 SELinux 日志位于 /var/log/audit/audit.log,但您不需要阅读整篇文章来查找错误。 您可以使用audit2why实用程序来查找错误。 运行以下命令:

$ audit2why < /var/log/audit/audit.log

结果,您将收到错误列表。 如果日志中没有错误,则不会显示任何消息。

配置 SELinux 策略

SELinux 策略是一组管理 SELinux 安全机制的规则。 策略定义了针对特定环境的一组规则。 现在我们将学习如何配置策略以允许访问禁止的服务。

1.逻辑值(开关)

开关(布尔值)允许您在运行时更改策略的部分内容,而无需创建新策略。 它们允许您无需重新启动或重新编译 SELinux 策略即可进行更改。

例子
假设我们想通过 FTP 读/写共享用户的主目录,并且我们已经共享了它,但是当我们尝试访问时,我们看不到任何内容。 这是因为 SELinux 策略阻止 FTP 服务器读取和写入用户的主目录。 我们需要更改策略,以便 FTP 服务器可以访问主目录。 让我们看看是否有任何开关可以这样做

$ semanage boolean -l

此命令将列出可用开关及其当前状态(打开或关闭)和说明。 您可以通过添加 grep 来查找仅限 ftp 的结果来优化搜索:

$ semanage boolean -l | grep ftp

你会发现以下内容

ftp_home_dir        -> off       Allow ftp to read & write file in user home directory

该开关已禁用,因此我们将启用它 setsebool $ setsebool ftp_home_dir on

现在我们的 ftp 守护进程将能够访问用户的主目录。
注意:您还可以通过执行以下操作来获取没有说明的可用开关列表 getsebool -a

2. 标签和上下文

这是实施 SELinux 策略的最常见方式。 每个文件、文件夹、进程和端口都标有 SELinux 上下文:

  • 对于文件和文件夹,标签作为扩展属性存储在文件系统上,可以使用以下命令查看:
    $ ls -Z /etc/httpd
  • 对于进程和端口,标签由内核管理,您可以按如下方式查看这些标签:

过程

$ ps –auxZ | grep httpd

порт

$ netstat -anpZ | grep httpd

例子
现在让我们看一个示例以更好地理解标签和上下文。 假设我们有一个 Web 服务器,而不是目录 /var/www/html/ использует /home/dan/html/。 SELinux 会认为这违反了政策,您将无法查看您的网页。 这是因为我们尚未设置与 HTML 文件关联的安全上下文。 要查看默认安全上下文,请使用以下命令:

$ ls –lz /var/www/html
 -rw-r—r—. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/

在这里我们得到了 httpd_sys_content_t 作为 html 文件的上下文。 我们需要为当前目录设置此安全上下文,当前目录具有以下上下文:

-rw-r—r—. dan dan system_u:object_r:user_home_t:s0 /home/dan/html/

检查文件或目录的安全上下文的替代命令:

$ semanage fcontext -l | grep '/var/www'

一旦找到正确的安全上下文,我们还将使用 semanage 来更改上下文。 要更改 /home/dan/html 的上下文,请运行以下命令:

$ semanage fcontext -a -t httpd_sys_content_t ‘/home/dan/html(/.*)?’
$ semanage fcontext -l | grep ‘/home/dan/html’
/home/dan/html(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
$ restorecon -Rv /home/dan/html

使用 semanage 更改上下文后,restorecon 命令将加载文件和目录的默认上下文。 我们的网络服务器现在可以从该文件夹中读取文件 /home/dan/html因为该文件夹的安全上下文已更改为 httpd_sys_content_t.

3.制定地方政策

在某些情况下,上述方法可能对您没有用,并且您会在audit.log 中收到错误(avc/denial)。 发生这种情况时,您需要创建本地策略。 您可以使用audit2why 找到所有错误,如上所述。

您可以创建本地策略来解决错误。 例如,我们收到与 httpd (apache) 或 smbd (samba) 相关的错误,我们 grep 错误并为它们创建策略:

apache
$ grep httpd_t /var/log/audit/audit.log | audit2allow -M http_policy
samba
$ grep smbd_t /var/log/audit/audit.log | audit2allow -M smb_policy

这是 http_policy и smb_policy 是我们创建的本地策略的名称。 现在我们需要将这些创建的本地策略加载到当前的 SELinux 策略中。 这可以按如下方式完成:

$ semodule –I http_policy.pp
$ semodule –I smb_policy.pp

我们的本地策略已下载,我们不应再在audit.log 中收到任何avc 或denail。

这是我试图帮助您了解 SELinux 的尝试。 我希望读完这篇文章后您会对 SELinux 感到更加得心应手。

来源: habr.com

添加评论