为课程学生准备的文章翻译
SELinux或SecurityEnhancedLinux是美国国家安全局(NSA)为防止恶意入侵而开发的增强访问控制机制。 它在现有的自主(或选择性)模型(英文Discretionary Access Control,DAC)之上实现了强制(或强制)访问控制模型(英文Mandatory Access Control,MAC),即读、写、执行的权限。
SELinux 有三种模式:
- 强制执行 — 基于策略规则的访问拒绝。
- 允许的 — 记录违反政策的行为,这在强制模式下是被禁止的。
- 残疾人 — 完全禁用 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