Linux桌面需要强制访问控制,RHCSA 系列(十三): 在 RHEL 7 中使用 SELinux 进行强制访问控制...

38746fbe8a1a04ebdaa6fe32d4ee383b.png

RHCSA 认证:SELinux 精要和控制文件系统的访问

尽管作为第一级别的权限和访问控制机制是必要的,但它们同样有一些局限,而这些局限则可以由安全增强 Linux(Security Enhanced Linux,简称为 SELinux)来处理。

这些局限的一种情形是:某个用户可能通过一个泛泛的 chmod 命令将文件或目录暴露出现了安全违例,从而引起访问权限的意外传播。结果,由该用户开启的任意进程可以对属于该用户的文件进行任意的操作,最终一个恶意的或有其它缺陷的软件可能会取得整个系统的 root 级别的访问权限。

考虑到这些局限性,美国国家安全局(NSA) 率先设计出了 SELinux,一种强制的访问控制方法,它根据最小权限模型去限制进程在系统对象(如文件,目录,网络接口等)上的访问或执行其他的操作的能力,而这些限制可以在之后根据需要进行修改。简单来说,系统的每一个元素只给某个功能所需要的那些权限。

在 RHEL 7 中,SELinux 被并入了内核中,且默认情况下以强制模式(Enforcing)开启。在这篇文章中,我们将简要地介绍有关 SELinux 及其相关操作的基本概念。

SELinux 的模式

SELinux 可以以三种不同的模式运行:

强制模式(Enforcing):SELinux 基于其策略规则来拒绝访问,这些规则是用以控制安全引擎的一系列准则;

宽容模式(Permissive):SELinux 不会拒绝访问,但对于那些如果运行在强制模式下会被拒绝访问的行为进行记录;

关闭(Disabled) (不言自明,即 SELinux 没有实际运行).

使用 getenforce 命令可以展示 SELinux 当前所处的模式,而 setenforce 命令(后面跟上一个 1 或 0) 则被用来将当前模式切换到强制模式(Enforcing)或宽容模式(Permissive),但只对当前的会话有效。

为了使得在登出和重启后上面的设置还能保持作用,你需要编辑 /etc/selinux/config 文件并将 SELINUX 变量的值设为 enforcing,permissive,disabled 中之一:

#getenforce

#setenforce0

#getenforce

#setenforce1

#getenforce

#cat/etc/selinux/config

c008e3269b567ab6e89d8c762d6d8d3e.png

设置 SELinux 模式

通常情况下,你应该使用 setenforce 来在 SELinux 模式间进行切换(从强制模式到宽容模式,或反之),以此来作为你排错的第一步。假如 SELinux 当前被设置为强制模式,而你遇到了某些问题,但当你把 SELinux 切换为宽容模式后问题不再出现了,则你可以确信你遇到了一个 SELinux 权限方面的问题。

SELinux 上下文

一个 SELinux 上下文(Context)由一个访问控制环境所组成,在这个环境中,决定的做出将基于 SELinux 的用户,角色和类型(和可选的级别):

一个 SELinux 用户是通过将一个常规的 Linux 用户账户映射到一个 SELinux 用户账户来实现的,反过来,在一个会话中,这个 SELinux 用户账户在 SELinux 上下文中被进程所使用,以便能够明确定义它们所允许的角色和级别。

角色的概念是作为域和处于该域中的 SELinux 用户之间的媒介,它定义了 SELinux 可以访问到哪个进程域和哪些文件类型。这将保护您的系统免受提权漏洞的攻击。

类型则定义了一个 SELinux 文件类型或一个 SELinux 进程域。在正常情况下,进程将会被禁止访问其他进程正使用的文件,并禁止对其他进程进行访问。这样只有当一个特定的 SELinux 策略规则允许它访问时,才能够进行访问。

下面就让我们看看这些概念是如何在下面的例子中起作用的。

例 1:改变 sshd 守护进程的默认端口

在 RHCSA 系列(八): 加固 SSH,设定主机名及启用网络服务 中,我们解释了更改 sshd 所监听的默认端口是加固你的服务器免受外部攻击的首要安全措施。下面,就让我们编辑 /etc/ssh/sshd_config 文件并将端口设置为 9999:

Port9999

保存更改并重启 sshd:

#systemctlrestartsshd

#systemctlstatussshd

0fca5c9588eded294a1e5002b16c007a.png

重启 SSH 服务

正如你看到的那样, sshd 启动失败,但为什么会这样呢?

快速检查 /var/log/audit/audit.log 文件会发现 sshd 已经被拒绝在端口 9999 上开启(SELinux 的日志信息包含单词 "AVC",所以这类信息可以被轻易地与其他信息相区分),因为这个端口是 JBoss 管理服务的保留端口:

#cat/var/log/audit/audit.log|grepAVC|tail-1

725a83d9eb5936c4f3077b02ce8dbe5a.png

查看 SSH 日志

在这种情况下,你可以像先前解释的那样禁用 SELinux(但请不要这样做!),并尝试重启 sshd,且这种方法能够起效。但是, semanage 应用可以告诉我们在哪些端口上可以开启 sshd 而不会出现任何问题。

运行:

#semanage port-l|grepssh

便可以得到一个 SELinux 允许 sshd 在哪些端口上监听的列表:

74aca588a7a23ee06a2c966d50466bc9.png

Semanage 工具

所以让我们在 /etc/ssh/sshd_config 中将端口更改为 9998 端口,增加这个端口到 sshportt 的上下文,然后重启 sshd 服务:

#semanage port-a-tssh_port_t-p tcp9998

#systemctlrestartsshd

#systemctlis-activesshd

5a8760470f673edf0effcbd15cf5e702.png

semanage 添加端口

如你所见,这次 sshd 服务被成功地开启了。这个例子告诉我们一个事实:SELinux 用它自己的端口类型的内部定义来控制 TCP 端口号。

例 2:允许 httpd 访问 sendmail

这是一个 SELinux 管理一个进程来访问另一个进程的例子。假如在你的 RHEL 7 服务器上,你要为 Apache 配置 mod_security 和 mod_evasive,你需要允许 httpd 访问 sendmail,以便在遭受到 (D)DoS 攻击时能够用邮件来提醒你。在下面的命令中,如果你不想使得更改在重启后仍然生效,请去掉 -P 选项。

#semanage boolean-1|grephttpd_can_sendmail

#setsebool-P httpd_can_sendmail1

#semanage boolean-1|grephttpd_can_sendmail

24e65aeff29a86ca0df6571d59b950be.png

允许 Apache 发送邮件

从上面的例子中,你可以知道 SELinux 布尔设定(或者只是布尔值)分别对应于 true 或 false,被嵌入到了 SELinux 策略中。你可以使用 semanage boolean -l 来列出所有的布尔值,也可以管道至 grep 命令以便筛选输出的结果。

例 3:在一个特定目录而非默认目录下提供一个静态站点服务

假设你正使用一个不同于默认目录(/var/www/html)的目录来提供一个静态站点服务,例如 /websites 目录(这种情形会出现在当你把你的网络文件存储在一个共享网络设备上,并需要将它挂载在 /websites 目录时)。

a). 在 /websites 下创建一个 index.html 文件并包含如下的内容:

SELinux test

假如你执行

#ls-lZ/websites/index.html

你将会看到这个 index.html 已经被标记上了 default_t SELinux 类型,而 Apache 不能访问这类文件:

5af9f4833b4a8bb29304ab1c612d9552.png

检查 SELinux 文件的权限

b). 将 /etc/httpd/conf/httpd.conf 中的 DocumentRoot 改为 /websites,并不要忘了 更新相应的 Directory 块。然后重启 Apache。

c). 浏览 http://,则你应该会得到一个 503 Forbidden 的 HTTP 响应。

d). 接下来,递归地改变 /websites 的标志,将它的标志变为 httpd_sys_content_t 类型,以便赋予 Apache 对这些目录和其内容的只读访问权限:

#semanage fcontext-a-thttpd_sys_content_t"/websites(/.*)?"

e). 最后,应用在 d) 中创建的 SELinux 策略:

#restorecon-R-v/websites

现在重启 Apache 并再次浏览到 http://,则你可以看到被正确展现出来的 html 文件:

b17262b41a4cd3c89f1f1ea0ebadba5f.png

确认 Apache 页面

总结

在本文中,我们详细地介绍了 SELinux 的基础知识。请注意,由于这个主题的广泛性,在单篇文章中做出一个完全详尽的解释是不可能的,但我们相信,在这个指南中列出的基本原则将会对你进一步了解更高级的话题有所帮助,假如你想了解的话。

假如你有任何的问题或评论,请不要犹豫,让我们知晓吧。

本文由 LCTT 原创翻译,Linux中国 荣誉推出

0b1331709591d260c1c78e86d0c51c18.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458936.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用canvas实现擦玻璃效果

体验效果:http://hovertree.com/texiao/html5/25/效果图&#xff1a;代码如下&#xff1a; <!DOCTYPE html> <html> <head lang"zh"> <meta name"viewport" content"initial-scale1.0, maximum-scale1.0, user-scalableno, widt…

[转]opencv学习资料

转自&#xff1a;http://blog.csdn.net/poem_qianmo/article/details/20537737 1&#xff1a;Mat imread(const string& filename, intflags1 ); eg: Mat image0imread("dota.jpg",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);//载入最真实的图像 ge1i…

jQuery动态设置样式List item

前段时间&#xff0c;Insus.NET有修改一个功能《激活当前视图菜单高亮呈现》http://www.cnblogs.com/insus/p/5287093.html 今天Insus.NET想改用另外一个方法来实现&#xff0c;使用jQuery。在ASP.NET MVC 环境实现&#xff1a; 代码&#xff1a; <ul><li><a hr…

linux telnet 权限,允许telnet 通过root用户进行访问

允许telnet 通过root用户进行访问RHEL6:[rootclovem ~]# yum install telnet-server -y //安装telnet服务端[rootclovem ~]# cat /etc/xinetd.d/telnet //开启telnet的托管服务# default: on# description: The telnet server serves telnet sessions; it uses \#unencrypt…

TOUGHRADIUS 项目介绍

2019独角兽企业重金招聘Python工程师标准>>> TOUGHRADIUS 项目介绍 ToughRADIUS是一个开源的Radius服务软件&#xff0c;采用于 Apache License 2.0 许可协议发布&#xff0c;从创立之日起&#xff0c;他的宗旨就是服务于中小微ISP&#xff0c;让运营变得更简单。 T…

转:Jmeter 用户思考时间(User think time),定时器,和代理服务器(proxy server)...

在负载测试中需要考虑的的一个重要要素是思考时间&#xff08;think time&#xff09;&#xff0c; 也就是在两次成功的访问请求之间的暂停时间。 有多种情形挥发导致延迟的发生&#xff1a; 用户需要时间阅读文字内容&#xff0c;或者填表&#xff0c;或者查找正确的链接等。未…

linux sql语句传参数,Linux/Unixshell参数传递到SQL脚本

在数据库运维的过程中&#xff0c;Shell 脚本在很大程度上为运维提供了极大的便利性。而shell 脚本参数作为变量传递给SQL以及SQL脚本也是DB在数据库运维的过程中&#xff0c;Shell 脚本在很大程度上为运维提供了极大的便利性。而shell 脚本参数作为变量传递给SQL以及SQL脚本也…

Myeclipse5.5获取注册码

2019独角兽企业重金招聘Python工程师标准>>> import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class MyEclipseGen {private static final String LL "Decompiling this copyrighted software is a vi…

对互联网中常见地图的坐标系探讨

文章版权由作者李晓晖和博客园共有&#xff0c;若转载请于明显处标明出处&#xff1a;http://www.cnblogs.com/naaoveGIS/。 1.背景 目前项目中使用百度地图、高德地图、谷歌中国地图、天地图的需求越来越多&#xff0c;这里我跟大家一起对各地图使用的坐标系做一个简单的探讨。…

讯飞输入法有没有Linux,Debian testing 安装讯飞输入法 - Linux系统与应用 - LinuxApp - 水木社区...

突然发现Deepin发行版带有讯飞输入法&#xff0c;于是折腾了一会&#xff0c;安装好了这个输入法&#xff0c;现把安装过程分享如下&#xff1a;软件包的依赖&#xff1a;Package: iflyimeVersion: 0.9.962Section: develPriority: optionalArchitecture: amd64Depends: libboo…

HTTP必知必会

2019独角兽企业重金招聘Python工程师标准>>> HTTP消息HTTP请求消息HTTP响应消息消息首行请求行响应行消息头部请求头请求头消息正文请求正文响应正文Web服务器把接收到的HTTP请求消息封装成request对象&#xff0c;作为service的参数传入service函数&#xff0c;ser…

更新10_linux,时隔十年,QQ更新了Linux版本

昨天1024程序员节&#xff0c;QQ悄悄地更新了QQ for Linux&#xff0c;也许是给各位一个惊喜吧。官网及其的简陋。和一个Word文档似的。十年一更&#xff0c;有网友称&#xff0c;瞬间回到QQ2006&#xff0c;确实界面功能有些落后&#xff0c;相信QQ可以跟上潮流的&#xff0c;…

C语言里if语句变量作为判断条件,C语言教学(九-上)if else判断语句

原标题&#xff1a;C语言教学(九-上)if else判断语句今天讲if else判断语句&#xff0c;简单理解就是进行条件判断&#xff0c;如果条件达到则执行if 里或else里的语句。先来看if。if的写法和for差不多,就是不用括号里的两个分号&#xff0c;if (条件) { }&#xff0c;if加括号…

二维数组联通子数组和最大

题目要求&#xff1a; 返回一个二维整数数组中最大联通子数组的和。输入一个二维整形数组&#xff0c;数组里有正数也有负数。文件输出。思路:和之前的动态规划相识&#xff0c;把二维数组转换为一维数组&#xff0c;先求每一个列的子数组和最大&#xff0c;最后在用正数就加&a…

Win10 IIS本地部署网站运行时图片和样式不正常?

后期会在博客首发更新&#xff1a;http://dnt.dkill.net 异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 启用关闭win功能&#xff0c;开启一下静态内容 收工~

设置IIS会话过期时间

打开默认网站----双击ASP--展开会话属性---更改超时时间-转载于:https://www.cnblogs.com/genesis/p/4816128.html

WWDC 2013 Session笔记 - iOS7中弹簧式列表的制作

这是我的WWDC2013系列笔记中的一篇&#xff0c;完整的笔记列表请参看这篇总览。本文仅作为个人记录使用&#xff0c;也欢迎在许可协议范围内转载或使用&#xff0c;但是还烦请保留原文链接&#xff0c;谢谢您的理解合作。如果您觉得本站对您能有帮助&#xff0c;您可以使用RSS或…

H5学习之旅-H5列表(8)

列表的基本语法 ol&#xff1a;有序列表 ul&#xff1a;无序列表 li&#xff1a;列表项 dl&#xff1a;列表 dt&#xff1a;列表项 dd&#xff1a;列表描述 常用列表 1.无序列表&#xff1a;使用标签 ul&#xff0c;li 属性&#xff1a;disc&#xff08;默认实心圆&#xff09;…

c语言中用文件处理数据,C语言文件处理 -C语言从文件中读写格式化数据

从图 1 所示的文件 fin.txt 中读取学生姓名、身高和体重&#xff0c;计算并显示它们的平均值&#xff0c;并且将显示结果保存到文件 fout.txt 中。图 1&#xff1a;输入输出文件示例C语言代码清单 1&#xff1a;读取学生姓名、身高和体重&#xff0c;计算并显示它们的平均值#in…

三星+android+7.0+自动纠正单词,升级党必看!三星S/Note系列更新Android 7.0指南

上周&#xff0c;雷科技(微信ID&#xff1a;leitech)曾为大家提供了一份Android 7.0升级预测名单。现在为了增加针对性&#xff0c;这次笔者就以三星最热门的两大旗舰S和Note系列为例&#xff0c;给大家提供一个全方面的更新指南。截至目前&#xff0c;三星S系列和Note系列的正…