为了克服的局限性,并增加通过标准提供的安全机制ugo/rwx
权限和访问控制列表 , 美国国家安全局 (NSA)设计了一个灵活的强制访问控制称为SELinux的 (以下简称安全 (MAC)方法增强的Linux),以便除其他事项外,以限制,的进程访问或执行对系统对象的至少允许其它操作(如文件,目录,网络端口等)可能的能力,同时仍允许购买修改该模型。
SELinux
和AppArmor安全加固Linux
另一种流行和广泛使用的MAC是AppArmor的 ,其中除了SELinux所提供的功能,包括学习模式,使系统“ 学习 ”特定应用程序的行为,并通过配置安全应用程序的使用配置文件设置限制。
在CentOS的7,SELinux 的并入内核本身和在默认强制模式(在下一节此更多)被启用,而不是openSUSE的和Ubuntu它们使用的AppArmor。
在本文中,我们将解释SELinux和AppArmor的基本要素,以及如何根据您选择的发行版使用这些工具中的一个来获得优势。
SELinux简介及如何在CentOS 7上使用它
安全增强型Linux可以以两种不同的方式运行:
- 执法 :SELinux的基于SELinux策略规则,一组控制的安全引擎指引拒绝访问。
- 宽容 :SELinux的不拒绝访问,但否认被记录为将,如果在执行模式下运行被拒绝的动作。
SELinux也可以禁用。 虽然它本身不是操作模式,但它仍然是一个选项。 然而,学习如何使用这个工具比只是忽略它更好。 记住!
要显示当前SELinux的模式,使用getenforce
。 如果你想切换的操作模式,使用setenforce 0
(将其设置为允许式 )或setenforce 1
( 强制 )。
由于这种变化将无法生存重新启动 ,你需要编辑/ etc / SELinux的/ config文件并设置SELINUX变量要么enforcing
, permissive
或disabled
,以便在重新引导来实现持久性:
如何启用和禁用SELinux模式
在一个侧面说明,如果getenforce
返回禁用,你必须编辑/ etc / SELinux的/配置与所需的操作模式并重新启动。 否则,你将无法设置(或切换)操作模式setenforce
。
其中一个典型的用途setenforce
由SELinux的模式之间切换(从执行到许可或其他方式)来解决出现异常或无法按预期工作的应用程序。 如果它的工作原理设置的SELinux后Permissive模式,你可以相信你正在寻找一个SELinux的权限问题。
我们最有可能处理SELinux的两个经典案例是:
- 更改守护程序监听的默认端口。
- 设置虚拟主机的DocumentRoot指令的/ var / www / html等之外。
让我们用下面的例子来看看这两种情况。
示例1:更改sshd守护程序的默认端口
大多数系统管理员为了保护其服务器而做的第一件事是更改SSH守护程序监听的端口,主要是阻止端口扫描程序和外部攻击者。 要做到这一点,我们使用Port指令在/ etc / SSH / sshd_config中加上新的端口号如下(我们将使用在这种情况下,端口号为9999):
Port 9999
尝试重新启动服务并检查其状态后,我们将看到它无法启动:
# systemctl restart sshd # systemctl status sshd
检查SSH服务状态
如果我们看一看/var/log/audit/audit.log,我们将看到由开始的SELinux在端口9999是防止sshd的 ,因为这是一个保留端口,JBoss的管理服务(SELinux的日志消息包含单词“ AVC“,使他们可能会从其他消息很容易识别):
# cat /var/log/audit/audit.log | grep AVC | tail -1
检查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和使用端口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类型
与前面的示例一样,您可以使用以下命令验证这是否确实是与SELinux相关的问题:
# cat /var/log/audit/audit.log | grep AVC | tail -1
检查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目录
有关SELinux的更多信息,请参阅的Fedora 22 SELinux和管理员手册 。