selinux 了解和配置
1.获取当前SELinux运行状态
getenforce
可能返回结果有三种:Enforcing、Permissive和Disabled。Disabled代表SELinux被禁用,Permissive代表仅记录安全警告但不阻止可疑行为,Enforcing代表记录警告且阻止可疑行为。
目前常见发行版中,RHEL和Fedora默认设置为Enforcing,其余的如openSUSE等为Permissive。
2.改变SELinux运行状态
setenforce[Enforcing|Permissive|1|0]
该命令可以立刻改变SELinux运行状态,在Enforcing和Permissive之间切换,结果保持至关机。一个典型的用途是看看到底是不是SELinux导致某个服务或者程序无法运行。若是在setenforce0之后服务或者程序依然无法运行,那么就可以肯定不是SELinux导致的。
若是想要永久变更系统SELinux运行环境,可以通过更改配置文件/etc/sysconfig/selinux实现。注意当从Disabled切换到Permissive或者Enforcing模式后需要重启计算机并为整个文件系统重新创建安全标签(touch/.autorelabel&&reboot)。
3.SELinux运行策略
配置文件/etc/sysconfig/selinux还包含了SELinux运行策略的信息,通过改变变量SELINUXTYPE的值实现,该值有两种可能:targeted代表仅针对预制的几种网络服务和访问请求使用SELinux保护,strict代表所有网络服务和访问请求都要经过SELinux。
RHEL和Fedora默认设置为targeted,包含了对几乎所有常见网络服务的SELinux策略配置,已经默认安装并且可以无需修改直接使用。
若是想自己编辑SELinux策略,也提供了命令行下的策略编辑器seedit以及Eclipse下的编辑插件eclipse-slide。
4.coreutils工具的SELinux模式
常见的属于coreutils的工具如ps、ls等等,可以通过增加Z选项的方式获知SELinux方面的信息。
如psauxZ|greplldpad
system_u:system_r:initrc_t:s0root10008.90.03040668?Ss21:016:08/usr/sbin/lldpad-d
如ls-Z/usr/lib/xulrunner-2/libmozjs.so
-rwxr-xr-x.rootrootsystem_u:object_r:lib_t:s0/usr/lib/xulrunner-2/libmozjs.so
以此类推,Z选项可以应用在几乎全部coreutils工具里。
ApacheSELinux配置实例
1.让Apache可以访问位于非默认目录下的网站文件
首先,用semanagefcontext-l|grep'/var/www'获知默认/var/www目录的SELinux上下文:
/var/www(/.*)?allfilessystem_u:object_r:httpd_sys_content_t:s0
从中可以看到Apache只能访问包含httpd_sys_content_t标签的文件。
假设希望Apache使用/srv/www作为网站文件目录,那么就需要给这个目录下的文件增加httpd_sys_content_t标签,分两步实现。
首先为/srv/www这个目录下的文件添加默认标签类型:semanagefcontext-a-thttpd_sys_content_t'/srv/www(/.*)?'然后用新的标签类型标注已有文件:restorecon-Rv/srv/www之后Apache就可以使用该目录下的文件构建网站了。
其中restorecon在SELinux管理中很常见,起到恢复文件默认标签的作用。比如当从用户主目录下将某个文件复制到Apache网站目录下时,Apache默认是无法访问,因为用户主目录的下的文件标签是user_home_t。此时就需要restorecon将其恢复为可被Apache访问的httpd_sys_content_t类型:
restoreconreset/srv/www/foo.com/html/file.htmlcontextunconfined_u:object_r:user_home_t:s0->system_u:object_r:httpd_sys_content_t:s0
2.让Apache侦听非标准端口
默认情况下Apache只侦听80和443两个端口,若是直接指定其侦听888端口的话,会在servicehttpdrestart的时候报错:
Startinghttpd:(13)Permissiondenied:make_sock:couldnotbindtoaddress[::]:888
(13)Permissiondenied:make_sock:couldnotbindtoaddress0.0.0.0:888
nolisteningsocketsavailable,shuttingdown
Unabletoopenlogs
这个时候,若是在桌面环境下SELinux故障排除工具应该已经弹出来报错了。若是在终端下,可以通过查看/var/log/messages日志然后用sealert-l加编号的方式查看,或者直接使用sealert-b浏览。无论哪种方式,内容和以下会比较类似:
SELinuxispreventing/usr/sbin/httpdfromname_bindaccessonthetcp_socketport888.
*****Pluginbind_ports(92.2confidence)suggests*************************
Ifyouwanttoallow/usr/sbin/httpdtobindtonetworkport888
Thenyouneedtomodifytheporttype.
Do
#semanageport-a-tPORT_TYPE-ptcp888
`wherePORT_TYPEisoneofthefollowing:ntop_port_t,http_cache_port_t,http_port_t.`*****Plugincatchall_boolean(7.83confidence)suggests*******************
IfyouwanttoallowsystemtorunwithNIS
ThenyoumusttellSELinuxaboutthisbyenablingthe'allow_ypbind'boolean.
Do
setsebool-Pallow_ypbind1
*****Plugincatchall(1.41confidence)suggests***************************
Ifyoubelievethathttpdshouldbeallowedname_bindaccessontheport888tcp_socketbydefault.
Thenyoushouldreportthisasabug.
Youcangeneratealocalpolicymoduletoallowthisaccess.
Do
allowthisaccessfornowbyexecuting:
#grephttpd/var/log/audit/audit.log|audit2allow-Mmypol
#semodule-imypol.pp
可以看出SELinux根据三种不同情况分别给出了对应的解决方法。在这里,第一种情况是我们想要的,于是按照其建议输入:
semanageport-a-thttp_port_t-ptcp888
之后再次启动Apache服务就不会有问题了。
这里又可以见到semanage这个SELinux管理配置工具。它第一个选项代表要更改的类型,然后紧跟所要进行操作。详细内容参考Man手册
3.允许Apache访问创建私人网站
若是希望用户可以通过在~/public_html/放置文件的方式创建自己的个人网站的话,那么需要在Apache策略中允许该操作执行。使用:
setseboolhttpd_enable_homedirs1
setsebool是用来切换由布尔值控制的SELinux策略的,当前布尔值策略的状态可以通过getsebool来获知。
默认情况下setsebool的设置只保留到下一次重启之前,若是想永久生效的话,需要添加-P参数,比如:
setsebool-Phttpd_enable_homedirs1