APP下载

活学活用RedHat 7 SELinux管理机制

2020-12-31河南刘京义

网络安全和信息化 2020年6期
关键词:命令端口规则

■ 河南 刘京义

利用SELin ux(即Securit y Enhanced Linux,安全性增强的Linux)这一安全管理机制,就可以让系统变得更加稳固。SELinux拥有灵活和强制性的访问控制机制,可以对访问进行彻底控制,对所有的文件,目录以及端口的访问,都是基于策略设置的,这些策略由管理员设定,普通用户无权更改。

管理SELinux的运行状态

SELinux提供了两种关闭方法,其一是临时关闭,所谓临时关闭,指的是并没有真正关闭SELinux,仅仅对非法访问进行记录。执行“setenforce 0”命令即可。其二是永久关闭,方法是执行“vi/etc/sysconfig/selinux”命令,在其中输入“SELINUX=disabled”行,之后重启系统即可。如果将其设置为“enforcing”,表示启用SELinux。执行“getenforce”命令,会显示SELinux的状态,包括“enforcing”“permissive”和“disabled”。

SELinux对于用户只赋予最小权限,用户被划分为不同的角色,不同的角色拥有不同的权限。即使对于Root用户来说,当其不在Sysadm_r角色中,同样是不能执行Sysadm_t管理操作的,即其无法拥有管理员权限。与之类似,SELinux对进程只赋予最小运行权限,这在SELinux中是非常重要的,其特点是对文件赋予名为Type的文件类型标签,对于进程赋予名为Domain的标签,这样的话,可以规定某个进程只能执行某类文件。

SELinux安全上下文结构

SELinux包括了的安全上下文(Security Conte、xt)和策略(Policy)组件,对于前者来说,由用户,角色和类型构成。对于后者来说,指的是控制规则,即允许哪些进程可以访问哪些资源。

安全上下文的格式由“user:role:type”三部分组成,其中的“user”用来提供身份识别,常见的“user”包括“user_u”(针对普通用户),“system_u”(针对系统管理员)和“unconfined_u”(针对没有做定义的用户)。

文件与目录的角色(role)通常称之为“object_r”,程序的角色通常是“system_r”。

对于用户的Role来说,不同的角色拥有不同的权限。用户可以拥有多个Role,但是在同一时间内只能扮演固定的Role。

类型(type)作用是将主体与客体划分为不同的组,组的每个主体和系统中的客体定义了一个类型,为进程运行提供最低的权限环境。

例如,执行“ls -Z test.txt”命令,可以查看指定文件的安全上下文信息。例如,返回“-rw-r--r--.root root unconfined_u:object_r:admin_home_t:s0 a.txt”,其中的“unconfined_u”表示的是预设的用户,该参数主要用来确认用户身份类型,一般搭配角色使用。

“object_r”参数表示的是角色,普通文件和目录都为该角色,“system_r”则一般为进程的角色。“admin_home_t”是SELinux中的类型信息,这里表示管理员的家目录。

对于“user_home_dir_t”类型来说,表示普通用户的家目录。执行“ls -Z -d/xxx/”命令,可以查看指定目录的安全上下文信息,这里的目录名为“xxx”。

根据SELinux的上下文信息,就可以确定标文件的目录能够被哪些进程和用户进行访问。

设置SELinux安全上下文

要想修改SELinux上下文,可以使用“chcon”和“semanage”命令进行修改,对于前者来说,虽然可以实现更改操作,但是对SELinux的规则库没有任何影响。例如,执行“chcon -t var_t/etc/hosts”命令,可以对“/etc/hosts”文件的安全上下文进行修改,将其类型由“net_conf_t”修改为“var_t”。执行“chcon -R -t samba_share_t/tmp/data”命令,可以对“/tmp/data”目录进行递归操作,将其中的所有文件的安全上下文类型修改为“samba_share_t”,这样“smb”进程就可以访问/tmp/data”目录中的所有文件了。

例如,对于Apache服务来说,在“/var/www/html/”目录下存在“test.html”这个文件,之后从“/root”目录下将“hello.html”文件移动到上述路径下,进入“/var/www/html/”,执行“ll-Z hello.html test.html”命令,可以看到这两个文件的安全上下文信息是不同的,分别为“admin_home_t”和“httpd_sys_content_t”。因为当执行文件移动操作时,其安全上下文是不变的。对于“httpd_sys_content_t”类型的文件来说,允许httpd进程对其进行访问。而对于“admin_home_t”类型的文件来说,httpd进程是无法访问的。

这样,在开启了SELinux的情况下,执行“service httpd start”命令启动Web服务后,当从浏览器输入实际路径来访问这两个文件时,可以访问“test.html”文件的内容,但是却无法访问“hello.html”的内容。执行“chcon --reference=/var/www/html//var/www/html/hello.html”命令,将“hello.html”的安全上下文类型修改为“httpd_sys_content_t”,这样就可以正常访问“hello.html”文件了。

也可以执行“chcon -t httpd_sys_content_t/var/www/html/hello.html”命令,也可以将其上下文标签修改为“httpd_sys_content_t”类型,实现同样的效果。当然,也可以执行“chcon -t -r httpd_sys_content_t/webapp/”命令,将指定目录下的所有文件的安全上下文类型修改为“httpd_sys_content_t”。如果使用CP命令,将“/root”目录下的“welcome.html”文件复制到“/var/www/html/”目录下,该文件的安全上下文会自动会改变为目标目录的类型,这样就可以顺利进行访问了。

恢复SELinux上下文信息

在设置SELinux上下文信息时,如果出现问题需要重新恢复的话,可以使用Restorecon命令来实现,该命令用来恢复档案目录的预设的安全上下文。既然要进行恢复,就需要依据预设的规则。执行“vim/etc/selinux/targeted/contexts/files/file_contexts”命令,在规则文件中显示不同文件的目录拥有的预置的安全上下文信息。在上述路径中的“file_contexts.local”文件中也包含了预设的安全上下文信息,通过查看上述两个文件,可以了解系统中保存好的规则。

例如,执行“restorecon-R/webapp/”命令,来恢复制定目录下所有文件的默认的安全信息,例如“system_u:object_r:default_t:s0”等。之所以可以恢复默认的上下文,说明使用“chcon”命令实际上无法真正更改SELinux的规则库信息,为了防止随意恢复SELinux安全上下文,可以使用semanage”命令来实现。

例如执行“semanage fcontext -a -t httpd_sys_content_"/webapp(/.*)?"”命令,就可以将目标目录(例如“/webapp”)的安全上下文类型修改为“httpd_sys_content_t”。

当然,按照这种格式,可以设置任意格式的SELinux安全上下文类型。之后执行“restorecon -vvR/webapp/”命令,就可以让上述修改动作生效,让指定目录真正拥有指定的安全规则。

灵活更改SELinux安全规则

使用上面谈到的方法,虽然可以更改SELinux安全规则,不过操作起来很麻烦。在RedHat7中,提供了一些布尔变量,可以快速启用和禁用对应的安全规则。执行“getsebool -a |wc -l”命令,显示布尔变量的数量信息。执行“getsebool -a”命令,可以显示所有的布尔变量。在对应布尔变量的右侧如果显示为“off”,表示其处于禁用状态,显示为“on”,表示处于激活状态。

当然,用户可以根据需要来灵活调整。例如,执行“getsebool -a | grep ftp”命令,可以查看和FTP相关的布尔变量。执行“setsebool ftpd_use_nfs=1”命令,激活“ftpd_use_nfs”安全规则,允许FTP使用NFS网络共享。

注意,这种修改方式只是临时生效的。执行“setsebool -P ftpd_use_nfs=1”命令,可以实现永久修改。

例如,当启用了FTP服务后,进入“/etc/vsftpd”目录,执行“vim vsftpd.conf”命令,打开vsFTP配置文件。在“anonymous=”栏中可以设置是否开启匿名用户。在“anon_upload_enable=”栏中设置是否允许匿名用户上传文件。对该配置文件进行修改,虽然可以允许匿名用户进行登录并下载文件,但是是不允许上传文件的。利用SELinux机制,可以打破这一限制。

执行“chcon -t public_content_rw_t/var/ftp/pub/”命令,修改指定FTP目录的安全上下文类型。

执行“setsebool-P allow_ftpd_anon_write=on”命令,将“allow_ftpd_anon_write”的值设置为“on”,其中的“-P”参数表示执行永久性设置,防止重启系统之后恢复其预设值。“allow_ftpd_anon_write”是针对允许匿名FTP账户是否可以写操作的项目,将其设置为“on”,可以让FTP匿名用户上传文件。

另外,在默认情况下,如果使用本地账户登录FTP服务,是可以自动切换自己的Home目录。但是当开启SELinux后,是不允许进行切换和上传文件的。执行“setsebool -P ftp_home_dir=on”命令,可以解除这一限制。

快速排查SELinux故障

在使用SELinux保护系统时,如果遇到问题的话,可以执行“sealert -a/var/log/audit/audit.log”命令,对SELinux的活动信息进行分析,就可以找到解决策略,其中的“audit.log”为SELinux的审计日志文件。当其分析完毕后,在返回信息的底部的“Raw Audit Message”栏中会显示最近有关SELinux的警告信息。例如,因为Apache的网页目录文件安全配置信息异常导致的错误等。在该分析报告中会给出具体的解决方法,例如提示用户执行“grep httpd/var/log/audit/audit.log | audit2allow-M mypol”和“semodule -i mypol”命令,就可以解决问题。

使用SELinux保护端口安全

对于端口安全来说,不仅可以使用防火墙进行控制,在RedHat7中还可以使用SeLinux,对端口打上安全标签,将端口配置信息固定下来,不允许随意绑定端口。

例如,执行“vi/etc/ssh/sshd/sshd_config”命令,将其中的“port”项的值修改为“9789”,将SSH连接端口进行了调整。

之后执行“systemctl restart sshd”命令,来重启SSH服务。虽然系统没有提示,但是该服务其实并没有启动。

执行“systemctl status sshd”命令,可以看到系统提示该服务没有正常启动。执行“tail/var/log/secure”命令,可以看到具体的错误信息,提示没有权限绑定修改后的端口。

执行“journalctl -xn status sshd”命令,也可以看到相关的错误信息。这其实就是SELinux在发挥作用,为了让上述端口修改操作顺利进行,可以执行“semanage port -a -t ssh_port_t -p tcp 9789”命令,就可以将TCP 9789定义为SSH的端口号。

之后执行“systemctl restart sshd”命令,就可以顺利启动SSH服务了。执行“semanage port -l”命令,可以查看所有的端口对应列表信息。

例如,执行“semanage port -a -t http_port_t -p tcp 81”命令,可以将TCP 81端口添加为HTTP端口。执行“semanage port--delete -p tcp 9789”命令,可以删除指定端口的定义信息。

猜你喜欢

命令端口规则
只听主人的命令
撑竿跳规则的制定
数独的规则和演变
一种端口故障的解决方案
移防命令下达后
让规则不规则
端口阻塞与优先级
TPP反腐败规则对我国的启示
这是人民的命令
初识电脑端口