Назад | Перейти на главную страницу

КАК заставить работать SElinux и postfix с помощью настраиваемого milter?

У меня есть настройка постфикса IPv4 на RHEL6 с SElinux в принудительном режиме. Все мои попытки включить opendkim с треском проваливаются, если я не выйду из принудительного режима.

Ошибки, которые я получаю, когда SElinux применяет:

Jan 25 09:57:25 <mail.warning> katniss postfix/cleanup[16571]: warning: cannot receive milters via service cleanup socket socket
Jan 25 09:57:25 <mail.crit> katniss postfix/cleanup[16571]: fatal: cleanup_milter_receive: milter receive failed
Jan 25 09:57:26 <mail.warning> katniss postfix/smtpd[16567]: warning: cannot send milters to service public/cleanup socket
Jan 25 09:57:26 <mail.warning> katniss postfix/master[16559]: warning: process /usr/libexec/postfix/cleanup pid 16571 exit status 1
Jan 25 09:57:26 <mail.warning> katniss postfix/master[16559]: warning: /usr/libexec/postfix/cleanup: bad command startup -- throttling

Что я сделал за последнее время:

setenforce permissive

(отправка почты работает)

setenforce enforcing

(отправка почты терпит неудачу с участием cleanup ошибки выше)

egrep -e 'postfix|opendkim|cleanup' /var/log/audit/audit.log | audit2allow -m postfixMine > postfixMine.te
checkmodule -M -m -o postfixMine.mod postfixMine.te 
semodule_package -m postfixMine.mod -o postfixMine.pp
semodule -i postfixMine.pp

(отправка почты все еще терпит неудачу с такими же ошибками из cleanup выше)

Итак, все работает, как ожидалось, с разрешающей настройкой SElinux и не работает с принудительной настройкой.

в постфиксе main.cf:

smtpd_milters           = inet:127.0.0.1:8891
non_smtpd_milters       = $smtpd_milters
milter_default_action   = accept
milter_protocol         = 2

некоторая информация:

# netstat -napl | grep 8891
tcp        0      0 127.0.0.1:8891              0.0.0.0:*                   LISTEN      16464/opendkim      

# ps -ef|grep opendkim
opendkim 16463     1  0 09:56 ?        00:00:00 /usr/local/sbin/opendkim -x /etc/opendkim.conf -P /var/run/opendkim/opendkim.pid
opendkim 16464 16463  0 09:56 ?        00:00:00 /usr/local/sbin/opendkim -x /etc/opendkim.conf -P /var/run/opendkim/opendkim.pid

# ls -lZ /usr/libexec/postfix/cleanup
-rwxr-xr-x. root root system_u:object_r:postfix_cleanup_exec_t:SystemLow /usr/libexec/postfix/cleanup

Прежде чем я начну тяну за волосы прочь, может кто-нибудь указать мне в правильном направлении, пожалуйста? Я не замечаю чего-то очень простого.

Я знаю назначение SElinux, но я не нашел никаких руководств, которые, казалось бы, были бы на «моем уровне» (краткими и информативными) :-), поэтому я все еще новичок, когда дело касается SElinux. Очень хочу учиться.

Я не учусь отключать SElinux.

Проблема заключалась в том, что audit2allow-сгенерированный postfixMine.te стал:

module postfixMattias 1.0;

require {
    type postfix_smtpd_t;
    type postfix_cleanup_t;
    class tcp_socket { getopt getattr };
}

#============= postfix_cleanup_t ==============
#!!!! This avc is allowed in the current policy

allow postfix_cleanup_t postfix_smtpd_t:tcp_socket { getopt getattr };

я добавил read и write классифицировать tcp_socket в это:

module postfixMine 1.0;

require {
    type postfix_smtpd_t;
    type postfix_cleanup_t;
    class tcp_socket { getopt getattr read write };
}

#============= postfix_cleanup_t ==============
#!!!! This avc is allowed in the current policy

allow postfix_cleanup_t postfix_smtpd_t:tcp_socket { getopt getattr read write };

за которыми следуют эти команды для перекомпиляции новой политики:

checkmodule -M -m -o postfixMine.mod postfixMine.te 
semodule_package -m postfixMine.mod -o postfixMine.pp
semodule -i postfixMine.pp

и вот наконец то работает!