所谓测不准定理是说,两个相关的物理变量,你对变量A要求越精密,那变量B的精度越差.反之,若对B要求越精密,那变量A精度就越无法测准. 安全也是这种屎一样的节奏,安全越高的东西,那么它往往越发的麻烦,反之,若你想把事情变得简单,那么安全往往会变屎.
SELinux是一个不错的权限管理系统.在公网跑的机器上,为了保证不会没事被人攻进来耍一波,还是被迫稍微用点心配置一下.
SELinux的文档搜索起来并不怎么麻烦,我按照这个和这个两个文档,摸索着配置了两下,看起来好像能用了.
一个很好用的工具是audit2allow,它可以分析/var/log/audit/audit.log这个文档(参考这个),然后得到一对.te和.pp文件,它们确定了系统对某个服务的权限.
在实际使用的过程中,有时候悲剧的发现SELinux禁止的东西太多了,而想要正常使用这个服务,我们必须要开启很一些功能.若指望audit2allow的分析,我们必须把所有的会导致被permission denied的事件都触发一下才行.
另一种方法是编辑*.te,然后尝试打包然后apply.
比如下面这个svnserve_user.te,我们编辑文件,定义我们的svnserve程序可以做的事情.(具体方法和属性参考前文的reference)
module svnserve_user 1.0; require { type user_home_dir_t; type svnserve_t; type user_home_t; type proc_t; class capability { dac_read_search dac_override }; class dir {read add_name create lock open rename setattr unlink remove_name getattr write search append rmdir}; class file {read create lock open rename setattr unlink getattr write append}; } #============= svnserve_t ============== allow svnserve_t proc_t:file {read create lock open rename setattr unlink getattr write append}; #!!!! This avc is allowed in the current policy allow svnserve_t self:capability { dac_read_search dac_override }; #!!!! This avc is allowed in the current policy #allow svnserve_t user_home_dir_t:dir search; #!!!! This avc is allowed in the current policy allow svnserve_t user_home_t:dir {read add_name create lock open rename setattr unlink remove_name getattr write search append rmdir}; #!!!! This avc is allowed in the current policy allow svnserve_t user_home_t:file {read create lock open rename setattr unlink getattr write append};
配置完毕后,我们需要编译成.pp文件才能selinux所识别.方法如下:
$ checkmodule -M -m -o svnserve_user.mod svnserve_user.te checkmodule: loading policy configuration from svnserve_user.te checkmodule: policy configuration loaded checkmodule: writing binary representation (version 17) to svnserve_user.mod $ semodule_package -o svnserve_user.pp -m svnserve_user.mod # semodule -i svnserve_user.pp
apply后,我们可以发现很多原本被denied的permission终于可以被允许了 .