SELinux的策略设置主要是通过布尔开关控制。开关的方式使得修改SELinux设置的过程还是很简单的。但首先我们要按在《基础知识篇》中所描述的,安装好所有相关的包,否则没有命令可以操作。
笔者:国际认证信息系统审计师、软考系统分析师
运行semanage命令可以查看到有什么可以修改的布尔开关:
semanage boolean -l | less
输出内容包括了开关名称、当前状态、默认值和用途简介:
SELinux boolean State Default Description
privoxy_connect_any (on , on) Allow privoxy to connect any
smartmon_3ware (off , off) Allow smartmon to 3ware
mpd_enable_homedirs (off , off) Allow mpd to enable homedirs
xdm_sysadm_login (off , off) Allow xdm to sysadm login
xen_use_nfs (off , off) Allow xen to use nfs
mozilla_read_content (off , off) Allow mozilla to read content
ssh_chroot_rw_homedirs (off , off) Allow ssh to chroot rw homedirs
mount_anyfile (on , on) Allow mount to anyfile
cron_userdomain_transition (on , on) Allow cron to userdomain transition
xdm_write_home (off , off) Allow xdm to write home
openvpn_can_network_connect (on , on) Allow openvpn to can network connect
xserver_execmem (off , off) Allow xserver to execmem
比如其中xen_use_nfs,用途是“是否允许XEN服务使用NFS网络共享”。在当前是处于关闭状态,即禁止这种访问行为,默认值也是关闭的。
要修改设置,可以通过 setsebool 命令。例如一个(存在一定危险性的)设置叫“ftpd_anon_write”,是否允许匿名FTP用户写入文件,我们先查看其当前状态:
getsebool ftpd_anon_write
ftpd_anon_write --> off
因为实际生产需要,经慎重考虑和进行了其它防范措施后,我们打开这个设置:
setsebool ftpd_anon_write on
随后再查看一次:
getsebool ftpd_anon_write
ftpd_anon_write --> on
注意:修改后的布尔开关并不是永久的,系统重启后就会恢复原来的值。如果要把设置固化,需要在设置的同时带上-P参数。例如:
setsebool -P ftpd_anon_write on
下面给出一些笔者在实际生产环境中碰到需要开启的设置,逐一介绍如下:
允许反病毒软件扫描检查系统。设置如下:
setsebool -P antivirus_can_scan_system on
这是因为等级保护测评时都要求要安装杀毒软件。Linux发行版一般都带有clamav杀毒软件,安装后会设置cronjob定期扫描系统。但如果不开启这个布尔开关,clamscan程序就无法扫描读取所有文件,然后报错。有些发行版会把这个设置名称改为 clamscan_can_scan_system ,需要注意。
注:clamav的误报是实在厉害,只能用来检查,绝对不能设置自动清除。本号会另外介绍CLAMAV在生产实际中的部署。
允许反病毒软件clamav使用jit引擎进行查杀:
setsebool -P clamd_use_jit on
因为clamscan使用jit引擎时会占用CPU资源,有可能被恶意利用。所以这个设置可以控制clamscan的行为。
允许logwatch服务通过网络发送邮件:
setsebool -P logwatch_can_network_connect_mail on
logwatch定时运行,扫描各种日志并产生摘要邮件发给root用户(或指定用户)。这个设置用于允许logwatch对本服务器之外的邮件地址发送邮件。这个做法存在一定风险性,比如错误地把信息发给了不相关的人。
允许httpd服务发送邮件:
setsebool -P httpd_can_sendmail on
httpd即apache,允许发送邮件有可能由于邮件堵塞之类问题而导致httpd的服务效能下降,也有可能错误发送邮件导致信息外泄。
允许httpd服务连接网络、连接数据库。
setsebool -P httpd_can_network_connect on
setsebool -P httpd_can_network_connect_db on
如果不开启,会导致PHP程序出现类似这样的错误:
Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2002] Permission denied'
所以只要用了PHP就必须开了。
设置SAMBA服务的共享是可读写
setsebool -P samba_export_all_rw on
设置SAMBA服务的共享是只读
setsebool -P samba_export_all_ro on
以上两个一般同时开,也就是具体的共享目录究竟是读写还是只读,交回给SAMBA自己根据配置文件去判断和控制。
以下四个设置都有一定风险,所以一般不开,仅作为说明。第一个是设置SAMBA服务默认共享用户的主目录(仿照WINDOWS的做法)
setsebool -P samba_enable_home_dirs on
设置SAMBA服务可以为用户创建主目录,如果发起访问的用户名的主目录未创建时:
setsebool -P samba_create_home_dirs=1
设置Linux可以使用远端的SAMBA共享目录作为本机用户的主目录:
setsebool -P use_samba_home_dirs=1
设置SAMBA可以把NFS共享目录作为SAMBA的共享目录:
setsebool -P samba_share_nfs=1
设置系统可以运行NIS服务:
setsebool -P nis_enabled on
NIS服务即Network Information Service,用于在网络上的系统之间共享重要信息,而这些重要信息在服务器内通常是平直的纯文本。这个选项一般在服务器运行了监控程序时需要启用。
运行httpd服务使用nfs方式访问文件:
setsebool -P httpd_use_nfs on
和允许SAMBA使用NFS共享目录同样道理,这个设置有一定风险,要严格控制,笔者仅用于实现内网YUM仓库的httpd服务。
设置GIT可以使用NFS
setsebool -P git_system_use_nfs on
基本上对NFS共享的限制的道理都是一样的,不再赘述。
最后要介绍一下如何排查服务或程序出错,是否被SELinux拦截所导致。排查方法是检查审计日志/var/log/audit/audit.log。注意审计日志本身是二进制编码而不可直读的,需要通过audit2why命令转换为可读内容,比如:
audit2why < /var/log/audit/audit.log
如果没有任何输出,那就是没有异常情况。
但如果有输出,则需要仔细观察。例如下面的输出内容(为方便阅读,做了换行):
type=AVC msg=audit(1556285271.219:351): avc: denied { getattr } for pid=15790 comm="httpd"
path="/var/www/mirrors/centos/7/centosplus/x86_64/repodata/4cb48cde2c2bbe00ffa303766009f7b41706409d75dda8673e03afdd06ea7a4d-filelists.sqlite.bz2"
dev="0:42"
ino=844424930310159
scontext=system_u:system_r:httpd_t:s0
tcontext=system_u:object_r:nfs_t:s0
tclass=file permissive=0
Was caused by:
One of the following booleans was set incorrectly.
Description:
Allow httpd to use nfs
Allow access by executing:
# setsebool -P httpd_use_nfs 1
Description:
Allow git to system use nfs
Allow access by executing:
# setsebool -P git_system_use_nfs 1这个例子,就是httpd想访问笔者设置在网络NFS共享上的YUM仓库,但被SELinux规则拦截的实际情况。
可以发现是没有允许httpd服务、git服务使用nfs共享。我们从审计日志也可以了解到,需要开启什么设置才能实现允许访问。一般地,按提示修改布尔开关就可以了。
但最关键的是,在打开开关前,要想清楚是否必须打开,打开了会有什么连带产生的不安全因素,如何防止或避免这些不安全因素。
本站微信订阅号:
本页网址二维码: