(一)了解SELinux是如何工作的
SELinux(Security-Enhanced Linux)是美国国家安全局(NSA)对于强制访问控制的实现,是Linux历史上最杰出的新安全子系统。NSA是在Linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件。SELinux默认安装在Fedora和Red Hat Enterprise Linux上,也可以作为其他发行版上容易安装的包得到。SELinux是2.6版本的Linux内核中提供的强制访问控制(MAC)系统。对于目前可用的Linux安全模块来说,SELinux是功能最全面,而且测试最充分的,它是在20年的MAC研究基础上建立的。SELinux在类型强制服务器中合并了多级安全性或一种可选的多类策略,并采用了基于角色的访问控制概念。
大部分使用SELinux的人使用的都是SELinux就绪的发行版,例如Fedora、Red Hat Enterprise Linux(RHEL)、Debian或CentOS。它们都是在内核中启用SELinux的,并且提供一个可定制的安全策略,还提供很多用户层的库和工具,它们都可以使用SELinux的功能。
SELinux是一种基于“域-类型”模型的强制访问控制(MAC)安全系统,它由NSA编写并设计成内核模块包含到内核中,相应的某些安全相关的应用也被打了SELinux的补丁,最后还有一个相应的安全策略。任何程序对其资源享有完全的控制权。假设某个程序打算把含有潜在重要信息的文件扔到/tmp目录下,那么在DAC情况下没人能阻止他。SELinux提供了比传统的UNIX权限更好的访问控制。
传统的文件控制方式是通过设置权限来实现的,例如一个文件我们设置的权限是777,那么这个文件任何人都可以读取、修改并删除,文件操作完全由权限来控制,这种方式称为DAC(主动访问控制)。而SELinux则是通过通过标签的方式来进行访问控制,例如a进程访问一个文件aa,它的标签是aa-fa,另一个b进程访问文件是bb,它的标签是bb-fb,同时bb文件的权限是777,如果此时a进程想要访问bb文件,即使权限全部是可读可写可执行,但是由于标签不相同,所以也仍然是无法访问的。所以SELinux就是特定标记的进程,只能访问特定标记的资源,就是上下文的概念。
(二)了解SELinux的上下文
(2.1)我们先在vms002主机上将http服务安装起来,并设置开机自动启动。
(2.2)由于SELinux服务还没有开启,所以可以设置开启的状态。
(2.3)使用# ps axZ | grep httpd命令可以查看httpd服务及其上下文的信息。
(2.4)因为我们知道/var/www/html/目录的的上下文是httpd_sys_content_t,如果我们在根下面创建一个/www目录,并设置192.168.26.102/www指向根下面创建的/www目录。
(2.5)接着我们在/etc/httpd/conf/目录下的httpd.conf配置文件中设置/www目录的Directory参数信息。
(2.6)我们发现/www目录的上下文是default_t,并不是和/var/www/html/目录的上下文httpd_sys_content_t一致。我们使用如下的命令修改上下文。
# chcon -R -t httpd_sys_content_t /www
(2.7)由于上下文是一致的,此时发现访问http://192.168.26.102/www/ 这个目录可以正常的进行显示。
(2.8)如果我们想恢复出厂默认值,则可以使用# restorecon -R /www/命令。
(2.9)如果我们想直接引用/var/www/html/目录的上下文,则可以使用reference参数。
(2.10)如果我们有时候具体的上下文记得不是很清楚,可以使用万能上下文来进行设置。
(2.11)如果我们想查询当前系统中所有上下文的信息,可以使用# semanage fcontext -l进行查询。
(2.12)例如像/var/www/html(/.*)?的正则表达式表示的就是/var/www/html目录及其下面的所有文件或者目录都可以进行匹配的。
(2.13)如果我们需要修改对应目录默认的上下文信息,可以使用# semanage fcontext -a -t public_content_t '/www(/.*)?'命令,这样当使用# restorecon -R /www/命令恢复出厂默认值的时候,就会显示semanage命令设置的信息。
(2.14)如果我们想要删除默认的上下文设置,则可以使用# semanage fcontext -d -t public_content_t "/www(/.*)?
(三)了解SELinux的几种模式
(3.1)查看SELinux模式类型的命令是getenforce。
(3.2)enforcing----->强制模式,必须要满足SELinux的条件,不满足的话,则阻止访问且警报。
permissive----->允许模式,可以不满足SELinux的条件,不满足也可以访问,但是有警报。所以有时候我们访问不了服务器的时候,想想是不是SELinux导致的,可以临时关闭SELinux,就是切换到了permissive模式。
(3.3)由于setenforce命令只是临时切换,当我们重启机器之后就不在生效了,如果希望服务器重启后也生效,则可以在/etc/selinux/config配置文件中进行设置。记住:如果是设置成disable禁止的话,修改完之后必须要重启才能生效。
(3.4)由于/etc/sysconfig/selinux目录下的配置文件是指向/etc/selinux/config配置文件的软连接,所以也可以对这个文件进行修改。
(四)了解SELinux的布尔值
一个服务有很多功能,比如是否允许写,是否允许匿名写等等。是否开启这个功能,完全由配置文件来决定,但是如果SELinux功能启用后,那么决定服务是否启动的一个条件是SELinux也要允许服务启动。
(4.1)我们首先在vms002主机上安装vsftpd服务。
(4.2)接着在vms001主机上安装lftp和ftp的客户端软件。
(4.3)首先我们在vms001主机上通过客户端软件登录vms002主机的ftp服务器,并准备将本地的books.txt文件上传到ftp服务器。但是系统显示“put: Access failed: 550 Permission denied. (books.txt)”报错。
(4.4)首先检查配置文件/etc/vsftpd/vsftpd.conf中的匿名用户权限是否都有开启。
(4.5)开启匿名用户的权限后,发现仍然没有上传文件的权限,系统显示“put: Access failed: 553 Could not create file. (books.txt)”
(4.6)创建一个/var/ftp/xx目录,并且设置目录的属主和属组为ftp用户,此时在vms001主机的客户端上进入xx目录后,尝试上传文件,发现仍然有“put: Access failed: 553 Could not create file. (books.txt)”报错信息。
(4.7)我们查询到在vms002主机上关于ftp布尔值的参数ftpd_anon_write和ftpd_full_access均为off,在/etc/vsftpd/目录下的vsftpd.conf的配置文件中已经有注释提示布尔值设置问题。
(4.8)接着我们将ftpd_anon_write和ftpd_full_access参数设置为on
(4.9)如果我们希望设置的布尔值在系统重启后也能继续生效,可以加上-P的参数。
(4.10)总结:如果我们搭建了某个服务,从客户端上开始往服务器上传输文件,但是没法传输上去,应该从以下3条来检查:1.检查配置文件是否允许写;2.检查文件系统是否有权限;3.检查SELinux的权限设置情况,一般SELinux涉及的就是上下文和布尔值量方面。
(4.11)我们除了使用命令行来进行SELinux的设置,也可以使用图形化的界面方式来设置SELinux。
(4.12)SELinux对端口也是有设置上下文的。
(4.13)我们在httpd.conf配置文件中添加一个监听的端口808,此时将httpd服务重启后发现服务是无法正常启动的。
(4.14)此时我们可以查找模板文件在/etc/ssh/sshd_config文件中查看。
(4.15)给httpd服务设置808端口的上下文,此时httpd服务就可以正常的重启了。