在这个系列中,我们已经详细探讨了至少两个访问控制方法:标准乌戈 / RWX权限( 管理用户和组-第3部分 )和访问控制列表( 配置ACL对文件系统- 7部分 )。
RHCSA考试:SELinux基础和控制文件系统访问
虽然必要的,因为第一级别的权限和访问控制机制,他们有一定的局限性由增强的Linux(SELinux 的又名简称) 的安全处理。
一个这样的限制是,用户可以通过一个阐述很差chmod命令露出一个文件或目录的安全漏洞,因此引起的访问权限的意外传播。 结果,由该用户开始的任何进程可以对用户拥有的文件满意,其中最终恶意的或以其他方式受损的软件可以实现对整个系统的根级访问。
考虑到这些限制, 美国国家安全局 (NSA)首先设计了SELinux,灵活的强制访问控制方法,以限制的进程访问或执行上的系统对象的其他操作(如文件,目录,网络端口的能力,等)到最小权限模型,其可以根据需要稍后修改。 简言之,系统的每个元素仅被给予功能所需的访问。
在RHEL 7,SELinux 的并入内核本身和在默认强制模式启用。 在这篇文章中,我们将简单介绍一下与SELinux和操作相关的基本概念。
SELinux模式
SELinux可以以三种不同的方式运行:
- 执法 :SELinux的基于SELinux策略规则,一组控制的安全引擎指引拒绝访问。
- 宽容 :SELinux的不拒绝访问,但否认被记录为将,如果在执行模式下运行被拒绝的动作。
- 禁用 (不言自明)。
该getenforce
命令显示当前SELinux的模式,而setenforce
(后面跟一个1或0),用于将模式更改为只在当前会话期间分别强制或章法 ,,。
为了实现跨越注销和重新启动的持久性,您将需要编辑/etc/selinux/config
文件并设置SELINUX变量要么强制执行 , 许可 ,或禁用 :
# getenforce # setenforce 0 # getenforce # setenforce 1 # getenforce # cat /etc/selinux/config
设置SELinux模式
通常,你会使用setenforce到SELinux的模式之间切换(强制许可,以和背面)作为第一疑难解答步骤。 如果SELinux的当前设置为强制执行 ,而你遇到了一定的问题,同样的消失,当你将其设置为许可 ,您可以确信你正在寻找一个SELinux的权限问题。
SELinux上下文
SELinux上下文包含一个访问控制环境,其中基于SELinux用户,角色和类型(以及可选的级别)进行决策:
- SELinux用户通过将其映射到SELinux用户帐户来补充常规Linux用户帐户,SELinux用户帐户又用于该会话中的进程的SELinux上下文中,以便显式定义其允许的角色和级别。
- 角色的概念作为域和SELinux用户之间的中介,它定义了可以访问哪些进程域和文件类型。 这将保护您的系统免受特权升级攻击的漏洞。
- 类型定义SELinux文件类型或SELinux进程域。 在正常情况下,阻止进程访问其他进程使用的文件,以及访问其他进程,因此只有在允许特定的SELinux策略规则时才允许访问。
让我们通过下面的例子看看所有这些都是如何工作的。
示例1:更改sshd守护程序的默认端口
在确保SSH - 8部分 ,我们解释说,改变那里的sshd监听的默认端口是第一的安全措施,以保护您的服务器免受外部攻击之一。 让我们编辑/etc/ssh/sshd_config
的文件和设置端口为9999:
Port 9999
保存更改,然后重新启动sshd:
# systemctl restart sshd # systemctl status sshd
重新启动SSH服务
正如你所看到的,sshd启动失败。 但是发生了什么事?
的快速检查/var/log/audit/audit.log
表示sshd的已被拒绝的权限启动在端口9999(SELinux的日志消息包括,使他们可能会从其他消息易于识别单词“AVC”),因为这是保留端口为JBoss的管理服务:
# cat /var/log/audit/audit.log | grep AVC | tail -1
检查SSH日志
在这一点上,你可以禁用SELinux(但不要!)如前所述,并尝试再次启动sshd的 ,它应该工作。 然而,semanage的工具可以告诉我们,我们需要什么才能改变我们能够开始我们没有问题,选择的任何端口的sshd。
跑,
# semanage port -l | grep ssh
以获取SELinux允许sshd监听的端口列表。
Semanage工具
因此,让我们在改变端口/etc/ssh/sshd_config
港9998的端口添加到ssh_port_t上下文 ,然后重新启动服务:
# semanage port -a -t ssh_port_t -p tcp 9998 # systemctl restart sshd # systemctl is-active sshd
Semanage添加端口
如您所见,此次服务已成功启动。 此示例说明了SELinux将TCP端口号控制为其自己的端口类型内部定义的事实。
示例2:允许httpd发送访问sendmail
这是SELinux管理访问另一个进程的进程的示例。 如果你要实现的mod_security并在RHEL 7与Apache mod_evasive一起服务器,您需要允许的httpd访问的sendmail,以在(D)DoS攻击之后发送邮件通知。 在下面的命令,省略了,如果你不希望改变在重新引导持久的-P标志。
# semanage boolean -1 | grep httpd_can_sendmail # setsebool -P httpd_can_sendmail 1 # semanage boolean -1 | grep httpd_can_sendmail
允许Apache发送邮件
正如你可以从上面的例子告诉,SELinux开关设置(或只是布尔值)嵌入到SELinux策略真/假规则。 你可以列出所有的布尔与semanage boolean -l
,备选地管它以过滤输出的grep。
示例3:从默认目录以外的目录提供静态网站
假设你正在使用提供不同的目录默认一个静态的网站( /var/www/html
),说/网站 (这可能是,如果你存储您的Web文件共享网络驱动器,例如的情况下,和需要/网站 )来安装它。
A)创建一个包含以下内容/网站内的index.html文件:
<html> <h2>SELinux test</h2> </html>
如果你这样做,
# ls -lZ /websites/index.html
你会看到,index.html文件已经被标上了SELinux的default_t类型,Apache不能访问:
检查SELinux文件权限
B)更改DocumentRoot指令在/etc/httpd/conf/httpd.conf
到/网站 ,不要忘了更新相应的目录块。 然后,重新启动Apache。
。C)浏览到http://<web server IP address>
,你应该得到一个503禁止HTTP响应。
。d)然后,为了给予Apache更改/网站 ,递归的标签,为httpd_sys_content_t类型只读到该目录及其内容的访问:
# semanage fcontext -a -t httpd_sys_content_t "/websites(/.*)?"
。e)最后,在应用中创建的SELinux策略):
# restorecon -R -v /websites
现在重新启动Apache和浏览到http://<web server IP address>
再次,你会看到html文件正确显示:
验证Apache页面
概要
在这篇文章中,我们已经通过了SELinux的基础了。 请注意,由于主题的广泛性,在一篇文章中不可能有完整的详细解释,但我们认为本指南中概述的原则将帮助您转到更高级的主题,如果您愿意的话。
如果我可以,我建议先从两个基本资源: NSA SELinux的页面和RHEL 7 SELinux的用户和管理员指南。
如果您有任何问题或意见,请随时与我们联系。