SELinux 配置文件属性

所谓测不准定理是说,两个相关的物理变量,你对变量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终于可以被允许了 .