在Linux中使用SELinux或AppArmor实施强制访问控制

在本文中,我们将解释SELinux和AppArmor的基本知识,以及如何根据您的Linux发行版使用这些工具中的一个来获得您的好处。

为了克服的局限性,并增加通过标准提供的安全机制ugo/rwx权限和访问控制列表美国国家安全局 (NSA)设计了一个灵活的强制访问控制称为SELinux的 (以下简称安全 (MAC)方法增强的Linux),以便除其他事项外,以限制,的进程访问或执行对系统对象的至少允许其它操作(如文件,目录,网络端口等)可能的能力,同时仍允许购买修改该模型。

SELinux和AppArmor安全加固Linux

SELinux
和AppArmor安全加固Linux

另一种流行和广泛使用的MAC是AppArmor的 ,其中除了SELinux所提供的功能,包括学习模式,使系统“ 学习 ”特定应用程序的行为,并通过配置安全应用程序的使用配置文件设置限制。

CentOS的7,SELinux 并入内核本身和在默认强制模式(在下一节此更多)被启用,而不是openSUSE的Ubuntu它们使用的AppArmor。

在本文中,我们将解释SELinux和AppArmor的基本要素,以及如何根据您选择的发行版使用这些工具中的一个来获得优势。

SELinux简介及如何在CentOS 7上使用它

安全增强型Linux可以以两种不同的方式运行:

  1. 执法 :SELinux的基于SELinux策略规则,一组控制的安全引擎指引拒绝访问。
  2. 宽容 :SELinux的不拒绝访问,但否认被记录为将,如果在执行模式下运行被拒绝的动作。

SELinux也可以禁用。 虽然它本身不是操作模式,但它仍然是一个选项。 然而,学习如何使用这个工具比只是忽略它更好。 记住!

要显示当前SELinux的模式,使用getenforce 如果你想切换的操作模式,使用setenforce 0 (将其设置为允许式 )或setenforce 1强制 )。

由于这种变化将无法生存重新启动 ,你需要编辑/ etc / SELinux的/ config文件并设置SELINUX变量要么enforcingpermissivedisabled ,以便在重新引导来实现持久性:

如何启用和禁用SELinux模式

如何启用和禁用SELinux模式

在一个侧面说明,如果getenforce返回禁用,你必须编辑/ etc / SELinux的/配置与所需的操作模式并重新启动。 否则,你将无法设置(或切换)操作模式setenforce

其中一个典型的用途setenforce由SELinux的模式之间切换(从执行许可或其他方式)来解决出现异常或无法按预期工作的应用程序。 如果它的工作原理设置的SELinux后Permissive模式,你可以相信你正在寻找一个SELinux的权限问题。

我们最有可能处理SELinux的两个经典案例是:

  1. 更改守护程序监听的默认端口。
  2. 设置虚拟主机的DocumentRoot指令的/ var / www / html等之外。

让我们用下面的例子来看看这两种情况。

示例1:更改sshd守护程序的默认端口

大多数系统管理员为了保护其服务器而做的第一件事是更改SSH守护程序监听的端口,主要是阻止端口扫描程序和外部攻击者。 要做到这一点,我们使用Port指令在/ etc / SSH / sshd_config中加上新的端口号如下(我们将使用在这种情况下,端口号为9999):

Port 9999

尝试重新启动服务并检查其状态后,我们将看到它无法启动:

# systemctl restart sshd
# systemctl status sshd
检查SSH服务状态

检查SSH服务状态

如果我们看一看/var/log/audit/audit.log,我们将看到由开始的SELinux在端口9999是防止sshd的 ,因为这是一个保留端口,JBoss管理服务(SELinux的日志消息包含单词“ AVC“,使他们可能会从其他消息很容易识别):

# cat /var/log/audit/audit.log | grep AVC | tail -1
检查Linux审核日志

检查Linux审核日志

此时,大多数人可能会禁用SELinux,但我们不会。 我们将看到,SELinux有一种方法,sshd在不同的端口上监听,一起和谐地生活。 请确保你已经安装了policycoreutils-Python包,然后运行:

# yum install policycoreutils-python

查看SELinux允许sshd监听的端口列表。 在下图中我们也可以看出,端口9999是保留给其他服务,因此,我们不能用它来运行暂时另一个服务:

# semanage port -l | grep ssh

当然,我们可以为SSH选择另一个端口,但是如果我们确定我们不需要为任何JBoss相关服务使用这个特定的机器,我们可以修改现有的SELinux规则,并将该端口分配给SSH:

# semanage port -m -t ssh_port_t -p tcp 9999

在这之后,我们就可以使用第一semanage的命令检查该端口是否被正确分配,或-lC选项(简称单定制):

# semanage port -lC
# semanage port -l | grep ssh
将端口分配给SSH

将端口分配给SSH

现在,我们可以重新启动SSH和使用端口9999连接到服务。 请注意,此更改将在重新启动后生存。

示例2:为虚拟主机在/ var / www / html之外选择一个DocumentRoot

如果你需要建立一个Apache虚拟主机使用的目录不是在/ var / www / html等作为的DocumentRoot(比如,例如,/ websrv /网站/加布里埃尔/的public_html):

DocumentRoot “/websrv/sites/gabriel/public_html”

Apache会拒绝,因为index.html的已标记了的SELinux的default_t类型,Apache不能访问服务内容:

# wget http://localhost/index.html
# ls -lZ /websrv/sites/gabriel/public_html/index.html
标记为default_t SELinux类型

标记为default_t SELinux类型

与前面的示例一样,您可以使用以下命令验证这是否确实是与SELinux相关的问题:

# cat /var/log/audit/audit.log | grep AVC | tail -1
检查SELinux问题的日志

检查SELinux问题的日志

要更改/ websrv /网站/加布里埃尔标签/的public_html递归到httpd_sys_content_t ,做到:

# semanage fcontext -a -t httpd_sys_content_t "/websrv/sites/gabriel/public_html(/.*)?"

上述命令将授予Apache对该目录及其内容的只读访问权限。

最后,要应用策略(并使标签更改立即生效),请执行以下操作:

# restorecon -R -v /websrv/sites/gabriel/public_html

现在你应该可以访问该目录:

# wget http://localhost/index.html
访问Apache目录

访问Apache目录

有关SELinux的更多信息,请参阅的Fedora 22 SELinux和管理员手册