- SELinux( Security Enhanced Linux )安全强化Linux
SELinux( Security-Enhanced Linux ) 是美国国家安全局(NSA)对于强制访问控制的实现,NSA是在Linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件
NSA 当初开发 SELinux 的目的是因为很多企业界发现,通常系统出现问题的原因大部分都在于“内部员工的资源误用”所导致的,实际由外部发动的攻击反而没有这么严重。所谓“员工资源误用”举例来说,如果有个对系统了解还是不太深入的系统管理员为了自己设置的方便,将网页所在目录 /var/www/html/ 的权限设置为 drwxrwxrwx 时,会出现什么问题?
我们知道所有的系统资源都是通过程序来进行存取的,那么 /var/www/html/ 如果设置 777,代表所有程序均可对该目录存取,万一你真的有启动 WWW 服务器软件,那么该软件所触发的程序将可以写入该目录,而该程序却是对整个 Internet 提供服务的!只要“有心人“接触到这支程序,而且该程序刚好又有提供使用者进行写入的功能,那么外部的人很可能就会对你的系统写入不安全的信息。为此就需要一个东西来限制,杜绝这些失误的发生。
SELinux 是在进行程序、文件等细部权限设置依据的一个核心模块!,是加载在内核上的。通俗的讲,SELinux 的存在就是为了细化文件和程序的权限让系统更加的安全。
下面就来具体介绍一下 SELinux 的一些基本策略与管理
SELinux是系统内核级别
的插件,他的开关需要编辑配置文件,与别的服务或程序不同的是,在编辑完插件后,是无法通过重启服务来实现配置,必须通过系统的重新启动来实现 SELinux 的开启或者关闭
编辑配置文件:/etc/sysconfig/selinux
[root@localhost ~]# vim /etc/sysconfig/selinux #SELinux的开关
重新开或者关都得重启,因为selinux为内核级别的插件
内容如下:
# This file controls the state of SELinux on the system.
该文件控制系统上的SELinux状态。
# SELINUX= can take one of these three values:
SELinux 取值可以以下三个值中的一个:
# enforcing - SELinux security policy is enforced.
enforcing - SELinux 安全策略被执行
# permissive - SELinux prints warnings instead of enforcing.
permissive - SELinux 输出警告而不是强制执行
# disabled - No SELinux policy is loaded.
disbaled - 没有SELinux策略加载
SELINUX=enforcing #此行表示设定 SELinux 状态,
#enforcing 表示开启并执行
#permissive 表示开启但是只警告不会强制执行
#disabled 表示关闭SELinux
具体文件内容如下:
在 shell 下执行 getenforce 来查看SELinux所处的状态
[root@localhost ~]# getenforce #获取当前的SELinux模式。
Enforcing #SELinux 开启并执行
Permissive #SELinux 开启但只警告不会强制执行
Disbaled #SELinux 未开启
SELinux 开启状态下的 Permissive ;Enforcing 是可以通过指令进行切换的,但是重启机器后,将会恢复,想要永久性的修改,还是要编辑 /etc/sysconfig/selinux 来进行永久性修改
[root@localhost ~]# setenforce 0 #修改SELinux正在运行的模式为 0
setenforce 1 | 0 #修改SELinux正在运行的模式
1:Enforcing #强制
0:Permissive #警告:会收到到警告(警告在/var/log/audit/audit.log 中)
修改后通过 getenforce 来进行查看
可以通过 ftp 服务来进行对 SELinux 级别的理解(SELinux限制了ftp服务权限)
示例一:
在 ftp 服务端:
1.执行 setenforce 1 将SELinux级别设置为强制
2.执行 touch /mnt/testfile 建立新文件作为实验对象
3.执行 mv /mnt/testfile /var/ftp/ 将文件移动到/var/ftp/ftp服务默认访问目录下
`注:`移动是一个重命名的过程不改变文件权限
在客户端进行查看
可以发现设定为 Enforcing 是无法看到 testfile 文件的
示例二:
在 ftp 服务端:
1.执行 setenforce 0 将 SELinux 级别设置为警告
2.执行 getenforce 查看 SELinux 级别
在客户端进行查看:
可以发现设定为 Permissive 是可以看到 testfile 文件的
这就是 SELinux 对系统服务限制的一个体现,而与这 testfile 能否通过 ftp 服务被看到相关的是安全上下文,下面会介绍。
在SELinux开启的情况下,若是文件对应的安全上下文与目录不匹配,是无法通过 ftp 服务进行访问的
对于安全上下文的具体解释,可移步 SELinux 安全上下文 进行了解
可通过以下方式查看安全上下文
[root@localhost ~]# ls -Z
-Z #显示安全上下文。只显示模式下,用户,组、安全上下文和文件名。
......(我是用来省略的)......
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Desktop
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Documents
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Downloads
......(我是用来省略的)......
显示的内容中 admin_home_t 这一项就是他们的安全上下文
可通过 semanage SELinux策略管理工具 来进行安全上下文的查看
semanage fcontext #SELinux策略中管理文件上下文工具。
[root@localhost ~]# semanage fcontext -l #可看到已设定的,内核上的所有安全上下文
[root@localhost ~]# semanage fcontext -l | grep /var/ftp #查看 ftp 的安全上下文类型
可以通过 chcon 指令来临时修改 SELinux 安全上下文
[root@localhost ~]# chcon #更改文件SELinux安全上下文
#临时修改上下文,重启SELinux后就会恢复以前的安全上下文
[root@localhost ~]# chcon -t public_content_t /mnt/file #修改/mnt/test的安全上下文
#为 public_content_t
-t #后面接安全性本文的类型字段
示例如下:
由上可知 /var/ftp 的安全上下文类型为 public_content_t 可以将 /mnt/file 的安全上下文更改的与 /var/ftp 一致,然后将 /mnt/file 移动到 /var/ftp 下通过 ftp 服务看是否可以看到file文件
修改 /mnt/file 的安全上下文为 public_content_t
将 /mnt/file 移动到 /var/ftp 下 ,在 ftp 客户端进行验证
修改安全上下文之前:
修改安全上下文之后:
可以通过 SELinux 策略管理工具来永久修改安全上下文
在 "/" 目录下新建 test 目录并修改其安全上下文
[root@localhost ~]# semanage fcontext -a -t public_content_t '/test(/.*)?'
#永久修改文件安全上下文
-a #添加
-t #类型
(/.*)? #正则表达式
/test(/.*)? == /test/* ==/test/*/*/*
[root@localhost ~]# semanage fcontext -l | grep /test #查看 /test 的安全上下文
执行如下:
修改安全上下文后,如果不进行同步,系统是无法识别的,需要进行手动同步
[root@localhost ~]# restorecon -FvvR /test/
restorecon #恢复文件(s)默认的 SELinux 安全上下文。
#即同步修改过的安全上下文,若不同不,系统不会识别
-F #强制重置上下文以匹配可定制文件的 file_context ,以及默认的文件上下文,更改用户、角色、范围部分和类型
-v #显示文件标签的更改,将过程显示到屏幕上
-R #递归地更改文件和目录文件标签
示例如下:
将 ftp 服务,匿名用户的默认登录目录为 /test 目录,在 /test/ 下建立testfile文件, /test 的安全上下文已修改为与 /var/ftp 相同,若不同步,直接通过 ftp 服务登录是无法看到testfile文件的。
编辑 /etc/vsftpd/vsftpd.conf ,修改匿名用户 ftp 服务登录目录:
编辑完配置文件后,重启服务,新建文件
在客户端验证(同步前)
手动同步安全上下文
在客户端验证(同步后)
linux 中的 sebool(布尔值)会影响服务,进程功能会给系统进程加上sebool(布尔值),就像加上开关,禁止系统认为权限过大的操作。使系统更加安全
可通过指令来对 sebool 进行设置
[root@localhost ~]# getsebool -a #显示所有 SELinux 布尔值
-a :列出目前系统上面的所有 SELinux 规则的布林值为打开或关闭值
[root@localhost ~]# getsebool -a | grep ftp #显示 ftp 相关的布尔值
ftp_home_dir --> off #当开放这个布尔变量时认证用户可以读写自己的主目录中的文件。
ftpd_connect_db --> off #当开放这个布尔变量时允许 vsftpd 连接数据库
ftpd_full_access --> off # 开启完全访问控制
ftpd_use_cifs --> off #此布尔变量启用,可以让你的 FTP 服务器使用 Samba 文件系统
ftpd_use_nfs --> off #此布尔变量启用,可以让你的 FTP 服务器使用 NFS 文件系统
ftpd_use_passive_mode --> off
可通过 setsebool 来进行修改 fftp_home_dir –> off 为 on 从而允许认证用户可以读写自己的主目录中的文件
[root@localhost ~]# setsebool -P ftp_home_dir on
#将 ftp_home_dir 开启
-P :直接将设置值写入配置文件,该设置数据未来会生效
示例如下:
开启服务后,以本地用户身份登录 ftp 服务,从而对比开启前是否可以对注目录进行行读写
开启 ftp_home_dir 之前,在客户端验证
在服务端开启 ftp_home_dir
开启 ftp_home_dir 之后,在客户端验证
SELinux 可以影响系统资源,以端口为例
- 端口
电脑运行的系统程序,其实就像一个闭合的圆圈,但是电脑是为人服务的,他需要接受一些指令,并且要按照指令调整系统功能来工作,于是系统程序设计者,就把这个圆圈截成好多段,这些线段接口就叫端口(通俗讲是断口,就是中断),系统运行到这些端口时,一看端口是否打开或关闭,如果关闭,就是绳子接通了,系统往下运行,如果端口是打开的,系统就得到命令,有外部数据输入,接受外部数据并执行。- 系统里,程序默认使用端口 2^0~2^10;
能够开启的端口的个数是 2^32 / 2^64(32位或64位操作系统);
查看系统各服务端口及协议类型:cat /etc/services。
可通过 semanage SELinux 策略管理工具对端口进行管理(以 httpd 服务为例)
安装httpd服务:
[root@localhost ~]# yum install httpd.x86_64 -y
编辑配置文件,修改默认端口:
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
编辑第42行将端口改为9527:
42 Listen 9527
43
44 #
重启服务:
[root@localhost ~]# systemctl restart httpd
Job for httpd.service failed. See 'systemctl status httpd.service' and
'journalctl -xn' for details. #报错,无法重启
设置 SELinux 为0后进行重启:
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl restart httpd
重启成功,表示与 SELinux 设置有关
执行如下:
安装 httpd 后编辑配置文件,修改端口
重启服务,出现错误
修改 SELinux 值后,重启成功
再修改回 SELinux 的值,通过 semanage 进行端口修改:
[root@localhost ~]# setenforce 1 #设置 SELinux 为强制执行
[root@localhost ~]# semanage port -a -t http_port_t -p tcp 9527
#将 9527 端口加入到 http 端口中
semanage port # SELinux 策略管理端口映射工具。
-a #添加
-t #目标的 SELinux 类型
-p #指定端口的协议(tcp|udp)或internet协议。
[root@localhost ~]# semanage port -l | grep http
semanage port -l | grep http #查看和http服务有关的端口
设置完成后,重启 httpd 服务,成功
执行命令touch /.autorelabel ,在 ‘/’ 下创建一个.autorelabel文件,有这个文件存在,系统在重启时就会对整个文件系统进行 relabeling,
若是 SELinux 出错,建立 /.autorelabel 文件重启系统后selinux恢复
可以通过 setroubleshoot-server 来解决系统由于 SELinux 出现的问题,但通过此程序解决SELinux 出现的问题时是存在安全隐患的。
示例如下:
在 /mnt/ 下建 trouble 文件,将文件移动到 lftp 访问的根目录 /var/ftp/ 下,由于安全上下文,用户是不可以查看到 trouble 文件的;
可以通过查看日志,通过setroubleshoot-server 软件来解决这个问题
服务端:
[root@localhost ~]# touch /mnt/trouble #创建文件进行测试
[root@localhost ~]# mv /mnt/trouble /var/ftp/ #移动文件到指定目录下
客户端:
[root@client ~]# lftp 172.25.151.150 #通过 ftp 服务连接服务端
lftp 172.25.151.150:~> ls #无法观察到 trouble 文件
-rw-r--r-- 1 0 0 0 May 14 08:49 file
drwxr-xr-x 2 0 0 6 Mar 07 2014 pub
服务端:
cat /var/log/messages #查看系统日志,寻求解决方法
--------------------------------------------------
......(省略日志以上内容)......
Then execute:
restorecon -v '$FIX_TARGET_PATH' #执行 restorecon -v '需要修复的目标的路径'
***** Plugin catchall (7.64 confidence) suggests **************************
If you believe that vsftpd should be allowed getattr access on the file by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# grep vsftpd /var/log/audit/audit.log | audit2allow -M mypol
# semodule -i mypol.pp
-------------------------------------------------
以上为日志内容
其中 :
restorecon -v '$FIX_TARGET_PATH' #执行 restorecon -v '需要修复的目标的路径'
#为解决上述问题的方法
/var/log/audit/audit.log #ftp服务的程序日志
执行 restorecon -v /var/ftp/* 后,可以在客户端观察到 trouble 文件
[root@localhost ~]# restorecon -v /var/ftp/*
执行如下:
建立文件,移动到指定目录下并清空日志
在客户端观察
在服务端查看系统日志
执行日志中的命令,以让 trouble 文件可被客户端发现
在客户端观察
注:
若是没有 setroubleshoot-server ,在移动文件后,通过客户端访问后是不会在 /var/log/messages 内生成对应的报错日志的。