SELinux 安全加固
SELinux基本操作
- 临时关闭:setenforce 0
- 永久关闭: # cat /etc/sysconfig/selinux SELINUX=disabled,因为这个是改的配置文件,是需要重启服务器才能生效的。
在里面还有一个 permissive 模式,当设置为 permissive 时,其效果和临时关闭是一样的,没关闭但是不生效。
- 查看当前SELinux的状态: getenforce
SELinux是什么,引入原因
在没有引入SELinux之前,我们对于文件的控制是通过权限来做的。
举个例子:
假设现在在服务器上配置了一台apache服务,然后apache会将服务器上的某个文件夹(/var/www/http)对外发布出去,提供web服务,用户就可以通过网页来访问这个服务。但是某一天,一个黑客把这个apache服务攻克了,拿到了shell权限,那么这个黑客就可以访问这个shell的权限下的所有文件。
但是在引入SELinux之后,事情就不一样了。
SELinux会将服务与文件进行绑定,apache服务共享调用的是(/var/www/http)这个文件夹,那么SELinux会将这两者绑定起来。之后哪怕黑客将apache攻克了,拿到了shell权限,他能访问的也只有(/var/www/http)这个文件夹。
没有引入SELinux示意图:
引入SELinux示意图:
SELinux配置为permissive模式:
SELinux是如何保护文件的
现在假设工作的保护等级是在targeted,在这个等级里,会有很多的规则。这些规则就定义了哪些文件是什么标签,这个标签就决定了哪些进程可以访问这些文件。
现在做个测试:
先看看home目录下的文件:
使用ll -Z,就会显示SELinux的一些标签信息了:
-rw-------. root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfg
随便拿出一条,对SE Linux标签进行分解。
- system_u:
-
- 作用:表示用户身份(User)
- 意义:system_u 是系统进程或文件的默认用户身份,通常用于系统相关的文件或进程。它表示该文件或进程属于系统用户。
- object_r:
-
- 作用:表示角色(Role)
- 意义:object_r 是文件或目录的默认角色,表示该对象是一个普通的文件或目录,而不是进程或其他类型的对象。
- admin_home_t:(我们主要看的就是这部分)
-
- 作用:表示类型或域(Type/Domain)
- 意义:admin_home_t 是 SELinux 类型或域的标识符,用于定义文件或进程的安全上下文。admin_home_t 通常与管理员的主目录或配置文件相关联,表示这些文件或目录属于管理员的主目录类型。
- s0:
-
- 作用:表示安全级别(Security Level)
- 意义:s0 是 MLS(Multi-Level Security)或 MCS(Multi-Category Security)的一部分,表示文件或进程的安全级别。s0 是最低的安全级别,通常用于不需要多级安全控制的系统。
admin_home_t这块的内容,称为上下文(context),一个文件能被哪些用户和进程访问都是这个标签决定的。就如示例中的admin_home_t,表示这个文件是管理员家目录访问。
那这个标签如何修改呢?
- 使用命令chcon:立马修改标签,但是规则库不改,重启之后就不生效了(这个看系统版本,有的系统依旧还会生效)。
- 使用命令semanage:可以修改规则库,重启之后也会生效。
实践案例:
先安装一个http服务:
然后启动http服务:
如果查询发现SE Linux的标签是?,可能是SELinux 未启用,到配置文件里面去启用然后重启即可。
现在就有了,然后可以看到所属进程是httpd_sys_content_t;
然后在/var/www/html/创建一个文件:
因为要去访问这个http服务,在这之前需要关闭防火墙:
访问HTTP服务,是能正常访问的:
现在,我在root目录下新建一个文件,查看SE Linux标签,是admin的:
然后把这个文件移动到/var/www/html/,替换之前的文件
注:这里可能会出现一个问题,这个视系统而定,有的Linux系统当你将文件转移的时候,它会自动更新文件的SE Linux标签。这里就出现了这个问题。
更换个系统,和之前一样的步骤,会发现,这次文件的SE Linux标签为admin的:
然后再次进行访问,发现无法访问
这个就是SE Linux阻止的。
将SE Linux临时关闭一下,然后再访问,就能成功访问到:
修改SE Linux上下文标签
当前的文件标签依旧还是admin:
临时修改标签命令:chcon -t httpd_sys_content_t /var/www/html/index.html
在未修改之前,是无法访问的
修改之后,正常访问:
SELinux布尔变量
有没有觉得改这些标签很麻烦呢?
Redhat考虑到了这个问题,所以准备了一些布尔变量,相当于一些开关,你只需要打开相应的开关,相当于应用规则,把开关关闭,规则就不放行了。(只针对Redhat系统)
使用命令:getsebool -a ,可以列出所有的布尔变量
就拿tftp_home_dir --> off举例,这个是决定是否把用户的home目录共享出去,如果设置on,那就是允许这样操作,反之就是不允许。
修改布尔值,使用命令:setsebool tftp_home_dir=1,现在就是on了
这种方法只是临时生效,如果要永久生效,在命令中加一个-P。
例子:setsebool -P tftp_home_dir=1
在实际工作中,这个布尔实用价值不高,一般不怎么用。
SELinux故障处理杀手锏
如果遇到了故障,有一种推荐的解决问题的方法,使用命令sealert -a /var/log/audit/audit.log
/var/log/audit/audit.log是SE Linux的日志存储文件,这个命令是分析SE的日志,然后返回问题的。
在使用这个命令的时候,需要先安装:sudo yum install setroubleshoot,然后才能使用。
使用命令之后,会有所有的问题,然后会给出对应的解决办法,这个能够解决大部分问题,但是有些问题还是需要人去分析解决。