gitolite3通过http selinux权限

我试图在Centos6.4上安装gitolite3。 它的工作原理,我可以ssh和,经过一些麻烦,我也可以通过http和httpd读取,如克隆。 我正在重新启用selinux进入宽容模式,为了更好的testing,我早先禁用了,以下错误出现在/etc/log/audit/audit.log中。

我承认,我是selinux的新手,尽pipe我非常热衷,并开始认真学习selinux的工作方式,但这个解释太多了。 有没有人可以从这些消息中扣除哪些命令我必须运行,我必须以某种方式允许在线安全的最佳做法的权限?

..如果您知道并发布了一些令人惊叹的在线selinux指南,并附上selinux的安全图表,那么我的答案也会很有用。

type=AVC msg=audit(1375647504.484:680): avc: denied { search } for pid=12882 comm="gitolite-shell" name="gitolite3" dev=sdb2 ino=264170 scontext=system_u:system_r:httpd_sys_script_t:s0 tcontext=system_u:object_r:gitosis_var_lib_t:s0 tclass=dir type=AVC msg=audit(1375647504.484:680): avc: denied { getattr } for pid=12882 comm="gitolite-shell" path="/var/lib/gitolite3/.gitolite.rc" dev=sdb2 ino=262551 scontext=system_u:system_r:httpd_sys_script_t:s0 tcontext=unconfined_u:object_r:gitosis_var_lib_t:s0 tclass=file type=SYSCALL msg=audit(1375647504.484:680): arch=c000003e syscall=4 success=yes exit=0 a0=6d4d70 a1=6ab130 a2=6ab130 a3=18 items=0 ppid=4653 pid=12882 auid=4294967295 uid=650 gid=650 euid=650 suid=650 fsuid=650 egid=650 sgid=650 fsgid=650 tty=(none) ses=4294967295 comm="gitolite-shell" exe="/usr/bin/perl" subj=system_u:system_r:httpd_sys_script_t:s0 key=(null) type=AVC msg=audit(1375647504.484:681): avc: denied { read } for pid=12882 comm="gitolite-shell" name=".gitolite.rc" dev=sdb2 ino=262551 scontext=system_u:system_r:httpd_sys_script_t:s0 tcontext=unconfined_u:object_r:gitosis_var_lib_t:s0 tclass=file type=AVC msg=audit(1375647504.484:681): avc: denied { open } for pid=12882 comm="gitolite-shell" name=".gitolite.rc" dev=sdb2 ino=262551 scontext=system_u:system_r:httpd_sys_script_t:s0 tcontext=unconfined_u:object_r:gitosis_var_lib_t:s0 tclass=file type=SYSCALL msg=audit(1375647504.484:681): arch=c000003e syscall=2 success=yes exit=5 a0=a365f0 a1=0 a2=1b6 a3=30ce11dd40 items=0 ppid=4653 pid=12882 auid=4294967295 uid=650 gid=650 euid=650 suid=650 fsuid=650 egid=650 sgid=650 fsgid=650 tty=(none) ses=4294967295 comm="gitolite-shell" exe="/usr/bin/perl" subj=system_u:system_r:httpd_sys_script_t:s0 key=(null) type=AVC msg=audit(1375647504.484:682): avc: denied { ioctl } for pid=12882 comm="gitolite-shell" path="/var/lib/gitolite3/.gitolite.rc" dev=sdb2 ino=262551 scontext=system_u:system_r:httpd_sys_script_t:s0 tcontext=unconfined_u:object_r:gitosis_var_lib_t:s0 tclass=file type=SYSCALL msg=audit(1375647504.484:682): arch=c000003e syscall=16 success=no exit=-25 a0=5 a1=5401 a2=7fff4ea63d90 a3=48 items=0 ppid=4653 pid=12882 auid=4294967295 uid=650 gid=650 euid=650 suid=650 fsuid=650 egid=650 sgid=650 fsgid=650 tty=(none) ses=4294967295 comm="gitolite-shell" exe="/usr/bin/perl" subj=system_u:system_r:httpd_sys_script_t:s0 key=(null) type=AVC msg=audit(1375647504.498:683): avc: denied { search } for pid=12882 comm="gitolite-shell" name=".gitolite" dev=sdb2 ino=264248 scontext=system_u:system_r:httpd_sys_script_t:s0 tcontext=unconfined_u:object_r:gitosis_var_lib_t:s0 tclass=dir type=SYSCALL msg=audit(1375647504.498:683): arch=c000003e syscall=4 success=yes exit=0 a0=6d4d70 a1=6ab130 a2=6ab130 a3=706d6f63 items=0 ppid=4653 pid=12882 auid=4294967295 uid=650 gid=650 euid=650 suid=650 fsuid=650 egid=650 sgid=650 fsgid=650 tty=(none) ses=4294967295 comm="gitolite-shell" exe="/usr/bin/perl" subj=system_u:system_r:httpd_sys_script_t:s0 key=(null) type=AVC msg=audit(1375647504.498:684): avc: denied { getattr } for pid=12882 comm="gitolite-shell" path="/var/lib/gitolite3/repositories/testing.git" dev=sdb2 ino=264285 scontext=system_u:system_r:httpd_sys_script_t:s0 tcontext=unconfined_u:object_r:gitosis_var_lib_t:s0 tclass=dir type=SYSCALL msg=audit(1375647504.498:684): arch=c000003e syscall=4 success=yes exit=0 a0=6d4d70 a1=6ab130 a2=6ab130 a3=31 items=0 ppid=4653 pid=12882 auid=4294967295 uid=650 gid=650 euid=650 suid=650 fsuid=650 egid=650 sgid=650 fsgid=650 tty=(none) ses=4294967295 comm="gitolite-shell" exe="/usr/bin/perl" subj=system_u:system_r:httpd_sys_script_t:s0 key=(null) type=AVC msg=audit(1375647504.521:685): avc: denied { append } for pid=12882 comm="gitolite-shell" name="gitolite-2013-08.log" dev=sdb2 ino=264307 scontext=system_u:system_r:httpd_sys_script_t:s0 tcontext=unconfined_u:object_r:gitosis_var_lib_t:s0 tclass=file type=SYSCALL msg=audit(1375647504.521:685): arch=c000003e syscall=2 success=yes exit=3 a0=a3af00 a1=441 a2=1b6 a3=30ce11dd40 items=0 ppid=4653 pid=12882 auid=4294967295 uid=650 gid=650 euid=650 suid=650 fsuid=650 egid=650 sgid=650 fsgid=650 tty=(none) ses=4294967295 comm="gitolite-shell" exe="/usr/bin/perl" subj=system_u:system_r:httpd_sys_script_t:s0 key=(null) type=AVC msg=audit(1375647504.651:686): avc: denied { read } for pid=12886 comm="git-upload-pack" name="refs" dev=sdb2 ino=264308 scontext=system_u:system_r:httpd_sys_script_t:s0 tcontext=unconfined_u:object_r:gitosis_var_lib_t:s0 tclass=dir type=AVC msg=audit(1375647504.651:686): avc: denied { open } for pid=12886 comm="git-upload-pack" name="refs" dev=sdb2 ino=264308 scontext=system_u:system_r:httpd_sys_script_t:s0 tcontext=unconfined_u:object_r:gitosis_var_lib_t:s0 tclass=dir type=SYSCALL msg=audit(1375647504.651:686): arch=c000003e syscall=2 success=yes exit=3 a0=675482 a1=90800 a2=675486 a3=0 items=0 ppid=12885 pid=12886 auid=4294967295 uid=650 gid=650 euid=650 suid=650 fsuid=650 egid=650 sgid=650 fsgid=650 tty=(none) ses=4294967295 comm="git-upload-pack" exe="/usr/libexec/git-core/git-upload-pack" subj=system_u:system_r:httpd_sys_script_t:s0 key=(null) 

首先:祝贺你不要禁用SELinux ,而是试着理解它并正确configuration它。

过滤您在问题中发布的AVC拒绝,可以更清楚地说明问题所在:

 # cat avc_denials | audit2allow #============= httpd_sys_script_t ============== allow httpd_sys_script_t gitosis_var_lib_t:dir { read search open getattr }; allow httpd_sys_script_t gitosis_var_lib_t:file { read getattr open ioctl append }; 

debuggingAVC否认的通常方法是使用ausearch(8)命令:

 # ausearch -m avc -ts recent | audit2allow 

请查看联机帮助页以获取有关您可以使用的开关的更多信息。

有了这些信息,现在您知道发生了什么事情:标记为httpd_sys_script_t的进程(可能是gitolite3用来发布其repos的CGI代码)被拒绝访问标记为gitosis_var_lib_t (repos)的文件和目录以执行不同的操作( readopen ,…)。

现在您应该确定是否授予此访问权限。 假设你想授予访问权限。 您需要创build一个自定义策略模块来描述定义您要授予的访问权限的规则。 这或多或less是简单的,取决于过程的复杂性:

 # ausearch -m avc -ts 10:40:00 | audit2allow -m my_gitolite3 > my_gitolite3.te 

这将产生一个这样的type enforcement说明:

 module my_gitolite3 1.0; require { type httpd_sys_script_t; type gitosis_var_lib_t; class dir { read search open getattr }; class file { read getattr open ioctl append }; } #============= httpd_sys_script_t ============== allow httpd_sys_script_t gitosis_var_lib_t:dir { read search open getattr }; allow httpd_sys_script_t gitosis_var_lib_t:file { read getattr open ioctl append }; 

你应该继续审查代码,以确保其正确性(在这种情况下,它很简单)。 下一步是将type enforcement代码编译成module

 # checkmodule -M -m -o my_mygitolite3.mod my_gitolite3.te 

该模块必须打包成一个policy package ,以便能够加载并随意卸载它:

 # semodule_package -o my_gitolite3.pp -m my_gitolite3.mod 

现在,您可以使用以下方式加载策略:

 # semodule -i my_gitolite3.pp 

检查它是否正确加载:

 # semodule -l | grep my_gitolite3 

然后,尝试再次触发拒绝,并查看审核日志中是否存在更多(不同的)警报。

type enforcement代码的更多版本将需要更新version1.0 ),否则加载包将失败。 更新policy package将完成:

 # semodule -u my_gitolite3.pp 

从SELinux开始学习有很多东西需要学习。 一些有用的参考:

  • 命令的manpages
  • 请检查apropos selinux的输出, gitosis_selinuxhttpd_selinux都将在这里感兴趣

从RHEL文档

  • pipe理受限服务
  • 安全增强的Linux

Dave Quigley介绍性的介绍:

  • 揭秘SELinux