我正在尝试在 Centos6.4 上安装 gitolite3。它成功了,我可以 ssh,经过一些麻烦之后,我还可以通过 http 和 httpd 读取,例如 clone。我正在重新启用 selinux 进入宽容模式,我之前为了更好地测试而禁用了它,/etc/log/audit/audit.log 中出现了以下错误。
我承认,我是 selinux 的新手,尽管我非常热衷并开始认真学习 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)
答案1
首先:恭喜你没有禁用 SELinux并尝试去理解它并正确地配置它。
过滤您在问题中发布的 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 };
然而,调试 AVC 拒绝的常用方法是使用以下ausearch(8)
命令:
# ausearch -m avc -ts recent | audit2allow
查看手册页以获取有关可以使用的开关的更多信息。
有了这些信息,您现在知道发生了什么:标有 的进程httpd_sys_script_t
(可能是 CGI 代码gitolite3
用来发布其存储库)被拒绝访问标有gitosis_var_lib_t
(repos) 的文件和目录以执行不同的操作(read
、search
、open
、...)。
现在您应该确定是否授予此访问权限。假设您想要授予访问权限。您需要创建一个自定义策略模块,描述定义要授予的访问权限的规则。这或多或少简单,取决于流程的复杂性:
# 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
需要更新version
( ),否则加载包将失败。更新将按以下方式完成:1.0
policy package
# semodule -u my_gitolite3.pp
开始使用 SELinux 时有很多东西需要学习。以下是一些有用的参考资料:
- 命令手册页
- 还要检查 的输出
apropos selinux
,gitosis_selinux
和httpd_selinux
都会引起人们的兴趣
来自 RHEL 文档
Dave Quigley 的精彩介绍性演讲: