长久以来,每当遇到授权问题或者新安装的主机,我的第一反应是通setenforce 0命令禁用SELinux,来减少产生的权限问题,但是这并不是一个良好的习惯。这篇文章尝试对SELinux的基本概念和用法进行简单介绍,并且提供一些更深入的资料。
Linux下默认的接入控制是DAC,其特点是资源的拥有者可以对他进行任何操(读、写、执行)。当一个进程准备操作资源时,Linux内核会比较进程和资源的UID和GID,如果权限允许,就可以进行相应的操作。此种方式往往会带来一些问题,如果一个进程是以root的身份运行,也就意味着他能够对系统的任何资源进行操作,而且不被限制。 假如我们的软件存在漏洞呢?这个往往是一个灾难性的问题。因此,就引出了另外的一种安全接入控制机制MAC,Linux下的一种现实是SELinux,也就是我们将要讨论的内容。
SELinux 属于MAC的具体实现,增强了Linux系统的安全性。MAC机制的特点在于,资源的拥有者,并不能决定谁可以接入到资源。具体决定是否可以接入到资源,是基于安全策略。而安全策略则是有一系列的接入规则组成,并仅有特定权限的用户有权限操作安全策略。
一个简单的例子,则是一个程序如果要写入某个目录下的文件,在写入之前,一个特定的系统代码,将会依据进程的Context和资源的Context查询安全策略,并且根据安全策略决定是否允许写入文件
SELinux的软件设计架构是参照Flask,Flask是一种灵活的操作系统安全架构,并且在Fluke research operating system中得到了实现。Flask的主要特点是把安全策略执行代码和安全策略决策代码,划分成了两个组件。安全策略决策代码在Flask架构中称作Security Server。除了这两个组件以外,另外一个组VectorCache(AVC), 主要提供策略决策结果的缓存,以此提高Security Server的性能。其具体执行流程为,安全策略执行代码通过AVC查询Security Server的安全策略决策结果,并将其缓存以备下次使用。
前面两部分介绍了MAC机制和Flask架构,最终SELinux的实现是依赖于Linux提供的Linux Security Module框架简称为LSM。其实LSM的名字并不是特别准确,因为他并不是Linux模块,而是一些列的hook,同样也不提供任何的安全机制。LSM的的重要目标是提供对linux接入控制模块的支持。
LSM 在内核数据结构中增加了安全字段,并且在重要的内核代码(系统调用)中增加了hook。可以在hook中注册回调函数对安全字段进行管理,以及执行接入控制。
SELinux,Security-Enhanced Linux:是由美国NSA国家安全局提供的一套基于内核的增强 的强制安全保护机制,针对用户、进程、文档标记安全属性并实现保护性限制。
SELinux安全体系直接集成在Linux内核中,包括三种运行模式:
disabled:彻底禁用,内核在启动时不加载SELinux安全体系
enforcing:强制启用,内核加载SELinux安全体系,并强制执行保护策略
permissive:宽松模式,内核加载SELinux安全体系,只记录不执行
执行getenforce可以查看当前所处的模式。
在disabled模式与enforcing、permissive模式之间切换时,需要重新启动Linux系统;而在 enforcing模式与permissive模式之间切换时,并不需要重启,可以直接执行
setenforce 1|0 操 作 ######1 强制 0 宽松
为selinux在运行模式建立固定配置----》修改配置文件/etc/selinux/config
SELINUX=disabled #宽松模式
例子: 现在在server1部署一个httpd服务 ,httpd要读取页面/var/www/html/index.html
我们首先关闭Selinux ,答案是可以访问
[root@server1 ~]# systemctl start httpd
[root@server1 ~]# echo redhat >> index.html
[root@server1 ~]# mv index.html /var/www/html/
mv: overwrite '/var/www/html/index.html'? y
[root@server1 ~]# curl http://localhost
redhat
[root@server1 ~]#
开启:selinux
[root@server1 ~]# setenforce 1
[root@server1 ~]# curl http://localhost -I
HTTP/1.1 403 Forbidden 权限拒绝
Date: Sat, 31 Aug 2019 06:53:23 GMT
Server: Apache/2.4.37 (Red Hat Enterprise Linux)
Last-Modified: Wed, 06 Feb 2019 14:46:32 GMT
ETag: "f91-5813acaad6200"
Accept-Ranges: bytes
Content-Length: 3985
Content-Type: text/html; charset=UTF-8
閱讀更多 新盟教育向前老師 的文章