Gitolite3 через разрешения http selinux
Я пытаюсь установить gitolite3 на Centos6.4. Это работает, я могу SSH и, после некоторых проблем, я также могу читать, такие как клон, через http и httpd. Я снова включаю 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
Проверьте man-страницу для получения дополнительной информации о переключателях, которые вы можете использовать.
Имея эту информацию, теперь вы знаете, что происходит: процесс помечен httpd_sys_script_t
возможно код CGI gitolite3
использует для публикации своих репозиториев, отказывается в доступе к файлам и каталогам, помеченным gitosis_var_lib_t
(репо) для выполнения различных операций (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
Хорошая вступительная презентация Дэйва Куигли: