Сервер в кармане, или просто о сложном!

главная - Статьи - Linux, FreeBSD

SELinux, LetsEncrypt и Postfix или как SELinux блокирует сертификаты по ссылке и как с этим бороться.

Теги: LetsEncrypt Linux SELinux

После установки сертификатов LetsEncrypt для почтового сервера srv.domain.tld на CentOS, Postfix не смог почитать файлы сертификатов, соответственно не шла отправка почты, т.к. авторизация разрешена только с tls. В логи шли сообщения об ошибке чтения.

Нельзя так просто взять и установить что-то, не отключив selinux

В /var/log/maillog:

postfix/smtpd[9582]: warning: cannot get RSA certificate from file /etc/pki/dovecot/certs/dovecot.pem: disabling TLS support
postfix/smtpd[9582]: warning: TLS library problem: 9582:error:0200100D:system library:fopen:Permission denied:bss_file.c:398:fopen('/etc/pki/dovecot/certs/dovecot.pem','r'):

В /var/log/audit/audit.log:

type=AVC msg=audit(1477403608.951:3316): avc:  denied  { read } for  pid=9311 comm="smtpd" name="dovecot.pem" dev="sda1" ino=923137 scontext=system_u:system_r:postfix_smtpd_t:s0 tcontext=unconfined_u:object_r:dovecot_cert_t:s0 tclass=lnk_file
type=SYSCALL msg=audit(1477403608.951:3316): arch=c000003e syscall=2 success=no exit=-13 a0=7fef689ae600 a1=0 a2=1b6 a3=24 items=0 ppid=9307 pid=9311 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 comm="smtpd" exe="/usr/libexec/postfix/smtpd" subj=system_u:system_r:postfix_smtpd_t:s0 key=(null)

Проблема простая - SELinux не дает доступа Postfix к каким-то "левым" директориям /etc/letsencrypt/live и /etc/letsencrypt/archive.

Можете сравнить разницу в контекстах SELinux для дефолтных и новых сертификатов командой "ls -aZ".

Добавляем нужный контекст SELinux для сертификатов LetsEncrypt:

# semanage fcontext --add -t dovecot_cert_t '/etc/letsencrypt/live/srv.domain.tld(/.*)?'
# semanage fcontext --add -t dovecot_cert_t '/etc/letsencrypt/archive/srv.domain.tld(/.*)?'

Проверяем:

# semanage fcontext -l | grep dovecot_cert_t
/etc/pki/dovecot(/.*)?                             all files          system_u:object_r:dovecot_cert_t:s0
/usr/share/ssl/certs/dovecot.pem                  regular file       system_u:object_r:dovecot_cert_t:s0
/usr/share/ssl/private/dovecot.pem                regular file       system_u:object_r:dovecot_cert_t:s0
/etc/letsencrypt/live/srv.domain.tld(/.*)?       all files          system_u:object_r:dovecot_cert_t:s0
/etc/letsencrypt/archive/srv.domain.tld(/.*)?    all files          system_u:object_r:dovecot_cert_t:s0

Применяем изменения:

# restorecon -R -v /etc/letsencrypt/live/srv.domain.tld
# restorecon -R -v /etc/letsencrypt/archive/srv.domain.tld

и проверяем, применились ли изменения:

# ls -aZ /etc/letsencrypt/live/srv.domain.tld
drwxr-xr-x. root root unconfined_u:object_r:dovecot_cert_t:s0 .
drwx------. root root unconfined_u:object_r:etc_t:s0   ..
lrwxrwxrwx. root root unconfined_u:object_r:dovecot_cert_t:s0 cert.pem -> ../../archive/srv.domain.tld/cert1.pem
lrwxrwxrwx. root root unconfined_u:object_r:dovecot_cert_t:s0 chain.pem -> ../../archive/srv.domain.tld/chain1.pem
lrwxrwxrwx. root root unconfined_u:object_r:dovecot_cert_t:s0 fullchain.pem -> ../../archive/srv.domain.tld/fullchain1.pem
lrwxrwxrwx. root root unconfined_u:object_r:dovecot_cert_t:s0 privkey.pem -> ../../archive/srv.domain.tld/privkey1.pem

Здорово, рестартуем postfix. И - ничего, опять ошибка чтения файла сертификата. Что-то ему надо еще.

SELinux блокирует не только по расположению, но и по типу файла: не дает dovecot/postfix прочитать файл сертификата, который является ссылкой (а LetsEncrypt ставит именно ссылку с расположения /etc/letsencrypt/archive и далее по цепочке, посмотрите "ls -al"), но я, к примеру, не сразу осознал, что еще не хватало для счастья. Помог стандартный вариант решения проблем с SELinux:

# sealert -a /var/log/audit/audit.log

found 1 alerts in /var/log/audit/audit.log
--------------------------------------------------------------------------------

SELinux is preventing /usr/libexec/postfix/smtpd from read access on the lnk_file dovecot.pem.
...

Создаем модуль для внесения необходимых изменений:

# grep smtpd /var/log/audit/audit.log | audit2allow -M dovecot-lnk_file

Перед тем, как просто применить изменения, посмотрим, что не нравится SELinux и что предлагается сделать:

# less dovecot-lnk_file.te

module dovecot-lnk_file 1.0;

require {
        type dovecot_cert_t;
        type postfix_smtpd_t;
        class lnk_file read;
}

#============= postfix_smtpd_t ==============
allow postfix_smtpd_t dovecot_cert_t:lnk_file read;

Не хватает прав для чтения lnk_file, что в общем-то логично, мало ли куда будет указывать ссылка, например, на /tmp/evil.sh.

# semodule -i dovecot-lnk_file.pp

А вот теперь все должно быть хорошо.

Можно

Авторизуйтесь для добавления комментариев!


    забыли пароль?    новый пользователь?