今天我们来看一下Linux系统下一个神秘的安全管理SELinux。
SELinux安全的基本概念
Security Enhanced Linux (SELinux)是一个额外的系统安全层。SELinux的主要目标是防止已遭遇泄露的系统服务访问用户数据。大多数Linux管理员都熟悉标准的用户/组/其他权限安全模型。这种基于用户和组的模型称为自由决定的访问控制。SELinux提供另一层安全,他基于对象并由更加复杂的规则控制,称为强制访问控制。
SELinux是用于确定那个进程可以访问那些文件、目录和端口的一组安全规则。每个文件、进程和端口都具有特别的安全标签,称为SELinux上下文。上下文是一个名称,SELinux策略使用它来确定某个进程能否访问文件、目录或端口。除非显式规则授予访问权限,否则,在默认情况下,策略不允许任何交互。如果没有允许规则,则不允许访问。
SELinux标签具有多种上下文:用户、角色、类型和敏感度。目标策略(即 Red Hat Enterprise Linux 中启用的默认策略)会根据第三个上下文(即类型上下文)来制定自己的规则。类型上下文名称通常以 _t 为结尾。服务器的类型上下文是 httpd_t 。通常位于 /var/www/html 中的文件和目录的类型上下文是 httpd_sys_content_t 。通常位于 /tmp 和 /var/tmp 中的文件和目录的类型上下文是 tmp_t 。Web服务器端口的类型上下文是 http_port_t 。
SELinux模拟练习
练习环境:RHEL7.0
1、如果不知道你的SELinux有没有启动的话,你可以用下面这条命令查看:
[root@server0 ~]# getenforce
Enforcing
Enforcing的意思是当前状态是开启的
下面我们来看看如何更改SELinux模式:
[root@server0 ~]# vim /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
SELinux模式分为三种:Enforcing、Permissive 和 Disabled。Disabled 代表 SELinux 被禁用,Permissive 代表仅记录安全警告但不阻止可疑行为,Enforcing 代表记录警告且阻止可疑行为。
改变 SELinux 运行状态
setenforce [ Enforcing | Permissive | 1 | 0 ]
该命令可以立刻改变 SELinux 运行状态,在 Enforcing 和 Permissive 之间切换,结果保持至关机。一个典型的用途是看看到底是不是 SELinux 导致某个服务或者程序无法运行。若是在 setenforce 0 之后服务或者程序依然无法运行,那么就可以肯定不是 SELinux 导致的。
若是想要永久变更系统 SELinux 运行环境,可以通过更改配置文件 /etc/sysconfig/selinux 实现。注意当从 Disabled 切换到 Permissive 或者 Enforcing 模式后需要重启计算机并为整个文件系统重新创建安全标签(touch /.autorelabel && reboot)。
2、下面我们来做一个小例子:
当我们将SELinux设置为“强制”模式后,我们把httpd.conf里的根目录更改以后,会发现,网页无法打开。
这里我们将http的根目录改为如下:
[root@server0 ~]# vim /etc/httpd/conf/httpd.conf
...
DocumentRoot "/html"
...
...
<Directory "/html">
然后再在根下创建html文件夹
[root@server0 ~]# mkdir /html
[root@server0 ~]# echo "linuxidc" > /html/index.html
创建完之后我们来看一下咱们创建文件的上下文
显示SELinux上下文的选项(通常是-Z)。例如,ps、ls、cp和mkdir全都使用 -Z 选项来显示或设置SELinux上下文。
更改完目录后我们重启httpd服务然后后打开网页,您将会得到一个错误消息,提示您不具有访问该文件的权限。
打开网页我们这里使用elinks命令,如果没有可以通过yum来安装。
[root@server0 ~]# elinks
为什么会显示没有权限呢?咱们接着往下看。
3、首先咱们来看看/var/www/html目录标准的上下文是什么。
[root@server0 ~]# ll -Z /var/www/html
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html
然后再看看咱们刚才新创建目录的上下文是什么。
[root@server0 html]# ll -Z
-rw-r--r--. root root system_u:object_r:default_t:s0 index.html
这里我们看到/var/www/html(源目录)的上下文是httpd_sys_content_t,而咱们之前创建(目标目录)的index.html文件的上下文是default_t。
由于源上下文和目标上下文的类型不同,httpd进程无法对default_t类的文件及目录的读取,所以会显示没有权限,这里我们需要把/html目录的上下文修改成httpd能够读取的类型。
httpd能够读取什么样的类型呢,从上边我们可以看到httpd 能读取的类型是 httpd_sys_content_t的类型。
知道了这个类型,我们就把/html这个目录改成这个类型。
4、更改文件的SELinux上下文
更改SELinux的上下文可以使用两个命令:chcon和restorecon。
chcon 命令是将文件的上下文更改成已指定为该命令参数的上下文。
chcon 命令:修改对象(文件)的安全上下文。比如:用户:角色:类型:安全级别。 语法:
Chcon [OPTIONS…] CONTEXT FILES…..
Chcon [OPTIONS…] –reference=PEF_FILES FILES…
选项:
CONTEXT 为要设置的安全上下文
FILES 对象(文件)
--reference 参照的对象
PEF_FILES 参照文件上下文
FILES 应用参照文件上下文为我的上下文。
OPTIONS 如下:
-f 强迫执行
-R 递归地修改对象的安全上下文
-r ROLE 修改安全上下文角色的配置
-t TYPE 修改安全上下文类型的配置
-u USER 修改安全上下文用户的配置
-v 显示冗长的信息
-l, --range=RANGE 修改安全上下文中的安全级别
restorecon 命令是更改文件或目录的SELinux上下文的首选方法。不同于 chcon,在使用此命令时,不会明确指定上下文。它使用SELinux策略中的规则来确定应该是那种文件上下文。
restorecon命令用来恢复SELinux文件属性即恢复文件默认的安全上下文。
语法
restorecon [-iFnrRv] [-e excludedir ] [-o filename ] [-f filename | pathname...]
选项
-i:忽略不存在的文件。
-f:infilename 文件 infilename 中记录要处理的文件。
-e:directory 排除目录。
-R/-r:递归处理目录。
-n:不改变文件标签。
-o/outfilename:保存文件列表到 outfilename,在文件不正确情况下。
-v:将过程显示到屏幕上。
-F:强制恢复文件安全语境。
下面给大家演示一下:
注意:最好不要使用chcon来更改文件的SELinux上下文。如果在系统启动时重新标记了其文件系统,文件上下文将会还原为默认上下文。
上面图中大家可以看到,我用chcon -t把/html文件夹的类型上下文更改成httpd正确的上下文,chcon只更改了上下文,但没有更改文件夹的规则。当我在用restorecon来恢复默认上下文的规则的时候/html文件夹的上下文又更改回来了。上面这个例子说明你用chcon相当于临时更改,当你重新刷新标签,你的上下文又会变为原来默认的上下文。如果你想不管怎么刷新标签上下文都不变的话,你就需要重新定义SELinux默认上下文的规则了。
5、定义 SELinux默认文件上下文规则
semanage fcontext 命令可用于显示或修改,restorecon命令用来设置默认文件上下文的规则。它使用扩展正则表达式来指定路径和文件名。fcontext规则中最常用的扩展正则表达式是 (/.*)? 意思是:“(可选)匹配 / 后跟任意数量的字符”。他将会匹配在表达式前面列出的目录并递归的匹配该目录中的所有内容。
semanage命令是用来查询与修改SELinux默认目录的安全上下文。
语法:
semanage {login|user|port|interface|fcontext|translation} -l
semanage fcontext -{a|d|m} [-frst] file_spec
选项:
-l:查询。 fcontext:主要用在安全上下文方面。
-a:增加,你可以增加一些目录的默认安全上下文类型设置。
-m:修改。
-d:删除。
下面咱们就用semanage fcontext命令来更改一下/html目录默认的安全上下文。
上面这幅图我们先查看了一下/html目录的上下文,然后用semanage来更改默认向下文的规则,最后用restorecon命令恢复默认上下文规则,现在/html目录的上下文规则就改好了,接下来咱们来测试一下网页是否能够打开了。
同样还是用elinks 来打开咱们的网页
现在咱们可以看到页面不在提示没有权限,而是出现了咱们之前用echo输入进去的linuxidc的字段。
CentOS系统如何快速关闭SELinux