Всем привет! Есть vds-ка: CentOS 7 / SELinux / dovecot / httpd / postfix / postfixadmin.
Postfixadmin при логине пытается запустить /usr/bin/doveadm для проверки пароля. Если SELinux выключен, все работает. Если включен, то возникают проблемы.Вот часть лога /var/log/audit/audit.log:
type=AVC msg=audit(1461137622.601:691): avc: denied { read } for pid=7329 comm="doveadm" name="dovecot.conf" dev="sda1" ino=919678 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:dovecot_etc_t:s0 tclass=file
type=SYSCALL msg=audit(1461137622.601:691): arch=c000003e syscall=21 success=no exit=-13 a0=7fabb674a800 a1=4 a2=7fabb6742050 a3=6 items=0 ppid=7300 pid=7329 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="doveadm" exe="/usr/bin/doveadm" subj=system_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(1461137622.601:692): avc: denied { getattr } for pid=7329 comm="doveadm" path="/etc/dovecot/dovecot.conf" dev="sda1" ino=919678 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:dovecot_etc_t:s0 tclass=file
type=SYSCALL msg=audit(1461137622.601:692): arch=c000003e syscall=4 success=no exit=-13 a0=7fabb674a800 a1=7ffef3e54ac0 a2=7ffef3e54ac0 a3=19 items=0 ppid=7300 pid=7329 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="doveadm" exe="/usr/bin/doveadm" subj=system_u:system_r:httpd_t:s0 key=(null)
# ls -aZ /usr/bin/doveadm
-rwxr-xr-x. root root system_u:object_r:bin_t:s0 /usr/bin/doveadmСамо собой, httpd не дают выполнять bin_t.
# semanage fcontext -a -t httpd_exec_t "/usr/bin/doveadm"
не то, т.к. контекст бинарника "/usr/bin/doveadm" менять не надо (по идее) - он же все-таки не из httpd.# grep dove /var/log/audit/audit.log | audit2allow -M httpd_dovecot
предлагает
allow httpd_t dovecot_etc_t:dir read;
allow httpd_t dovecot_etc_t:file { read getattr open };странно - ни слова про doveadm...
Ну да ладно, я все же загрузил этот модуль, не помогло. Выгрузил нафиг.
Как я в итоге сформулировал задачу: надо ДОБАВИТЬ право httpd_t выполнить "/usr/bin/doveadm". Но вот забуксовал. Или задачу не так ставлю? Можете посоветовать, что делать?
Добавлю: меня сбивает с толку факт, что в логе /var/log/audit/audit.log указан стартовый контекст (scontext=system_u:system_r:httpd_t:s0), в конфиге postfixadmin указан файл /usr/bin/doveadm, а audit2allow предлагает решение: дать httpd_t доступ на чтение директории конфигов dovecot. А где, собственно, указание httpd_t дать доступ к bin_t (/usr/bin/doveadm)?
> Добавлю: меня сбивает с толку факт, что в логе /var/log/audit/audit.log указан стартовый
> контекст (scontext=system_u:system_r:httpd_t:s0), в конфиге postfixadmin указан файл
> /usr/bin/doveadm, а audit2allow предлагает решение: дать httpd_t доступ на чтение директории
> конфигов dovecot. А где, собственно, указание httpd_t дать доступ к bin_t
> (/usr/bin/doveadm)?если разжевать лог это выглядит так:
postfixadmin веб приложение, которое работает под httpd(Apache2 сервер) где в веб приложении(в контексте httpd сервера) вызывается административная утилита /usr/bin/doveadm где данная утилита обращается к своему конфигурационному файлу /etc/dovecot/dovecot.conf для выполнения задачи#ps axZ | grep httpd (отобразит текущие SELinux правила/контексты httpd процесса)
вывод:
1- отключить SELinux (что не ахти) или переключить на Permissive или Enforcing
2- подружиться с SELinux (то что советуется в audit логах) при помощи TE(Type Enforcement) файла(писать самому или же использовать audit2allow утилиту)Решение:
#grep httpd_t /var/log/audit/audit.log | audit2allow -m doveadmlocal > doveadmlocal.te
#cat doveadm.te будет содержать типа такого:module doveadm 1.0;
require {
type dovecot_etc_t;
type httpd_t;
class file { read getattr open };
class dir read;
}
#============= httpd_t ==============
allow httpd_t dovecot_etc_t:file { read getattr open };
allow httpd_t dovecot_etc_t:dir read;дальше этот файл TE скомпилировать в модуль и включить в список модулей SELinux, будет где-то в этой папке /etc/selinux/targeted/modules/active/modules/:
#checkmodule -M -m -o doveadmlocal.mod doveadmlocal.te
#semodule_package -o doveadmlocal.pp -m doveadmlocal.mod
#semodule -i doveadmlocal.pp
Литература: https://wiki.centos.org/HowTos/SELinux
> если разжевать лог это выглядит так:
> postfixadmin веб приложение, которое работает под httpd(Apache2 сервер) где в веб приложении(в
> контексте httpd сервера) вызывается административная утилита /usr/bin/doveadm где данная
> утилита обращается к своему конфигурационному файлу /etc/dovecot/dovecot.conf для выполнения
> задачиЗачем его разжёвывать? Я не говорил, что мне непонятна суть.
Мне непонятно вот что: для dovecot файл doveadm в самом деле "утилита". Но она, эта утилита, чужая для httpd. Почему стоит вопрос так, что надо утилите дать права на чтение конфига ее "хозяина" dovecot, когда по идее должен стоять вопрос как вообще httpd допущен к запуску /usr/bin/doveadm, которая bin_t. Мне это не совсем ясно.
> #ps axZ | grep httpd (отобразит текущие SELinux правила/контексты httpd процесса)
system_u:system_r:httpd_t:s0 2253 ? Ss 0:02 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0 2255 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0 2256 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0 2257 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0 2258 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0 2259 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0 2281 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 3741 pts/0 S+ 0:00 grep --color=auto httpd> вывод:
> 1- отключить SELinux (что не ахти) или переключить на Permissive или Enforcing
> 2- подружиться с SELinux (то что советуется в audit логах) при помощи
> TE(Type Enforcement) файла(писать самому или же использовать audit2allow утилиту)Еще больше непонятно. Я же не предлагаю отключать. В вашей терминологии я с ним "дружусь" :)
>[оверквотинг удален]
> class dir read;
> }
> #============= httpd_t ==============
> allow httpd_t dovecot_etc_t:file { read getattr open };
> allow httpd_t dovecot_etc_t:dir read;
> дальше этот файл TE скомпилировать в модуль и включить в список модулей
> SELinux, будет где-то в этой папке /etc/selinux/targeted/modules/active/modules/:
> #checkmodule -M -m -o doveadmlocal.mod doveadmlocal.te
> #semodule_package -o doveadmlocal.pp -m doveadmlocal.mod
> #semodule -i doveadmlocal.ppТам все уже скомпилировано, сразу после выполнения:
grep httpd_t /var/log/audit/audit.log | audit2allow -M doveadmlocalи только и ждет того, чтобы подгрузили. Во-первых, я уже писал, что после этого все равно ничего не пошло, а во-вторых, я читал на нескольких форумах, что на эту утилиту полагаться всецело не надо, типа, поймите сначала, что она предлагает, а потом уже думайте. Поэтому у меня и возник вопрос о том, а почему проблема между doveadm и конфигом dovecot, а не между httpd и doveadm. Ответить на этот вопрос я не смог (к тому же стал думать, что дело в domain transitions и окончательно сбился с мыслей) и спросил здесь.
> Литература: https://wiki.centos.org/HowTos/SELinux
Спасибо! Мне больше нравится эта: https://access.redhat.com/documentation/en-US/Red_Hat_Enterp...
> Зачем его разжёвывать? Я не говорил, что мне непонятна суть.было разжевано для того, чтобы понять всю цепочку лога в audit и куда дальше копать :)
> Мне непонятно вот что: для dovecot файл doveadm в самом деле "утилита".
> Но она, эта утилита, чужая для httpd. Почему стоит вопрос так,
> что надо утилите дать права на чтение конфига ее "хозяина" dovecot,
> когда по идее должен стоять вопрос как вообще httpd допущен к
> запуску /usr/bin/doveadm, которая bin_t. Мне это не совсем ясно.\из selinuxproject.org:
----------------------------------
# Using the type statement to declare a type of bin_t, where
# bin_t is used to identify a file as an ordinary program type.type bin_t;
----------------------------------> Еще больше непонятно. Я же не предлагаю отключать. В вашей терминологии я
> с ним "дружусь" :)ну и вам никто явно не говорил отключать, показали пути решения, выбирать барину :)
> #============= httpd_t ==============
> allow httpd_t dovecot_etc_t:file { read getattr open };
> allow httpd_t dovecot_etc_t:dir read;После того, как вы прислали мне то, от чего я ушел в самом начале, подумалось, что если двое так считают, то все же имеет смысл попробовать еще разок:
grep dove /var/log/audit/audit.log | audit2allow -M doveconf-module
semodule -i doveconf-module.ppВзял из истории команд те же самые, загрузил модуль и, тысяча чертей, пошло. Спасибо за отклик, помогли. А то я в дебри ушел бы сто процентов, т.к. считал предыдущие шаги ошибочными.
> Взял из истории команд те же самые, загрузил модуль и, тысяча чертей,
> пошло. Спасибо за отклик, помогли. А то я в дебри ушел
> бы сто процентов, т.к. считал предыдущие шаги ошибочными.:)