главная - Статьи - Linux, FreeBSD
SELinux, LetsEncrypt и Postfix или как SELinux блокирует сертификаты по ссылке и как с этим бороться.
Теги: SELinux Linux LetsEncrypt
После установки сертификатов LetsEncrypt для почтового сервера srv.domain.tld на CentOS, Postfix не смог почитать файлы сертификатов, соответственно не шла отправка почты, т.к. авторизация разрешена только с tls. В логи шли сообщения об ошибке чтения.
В /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
А вот теперь все должно быть хорошо.
Авторизуйтесь для добавления комментариев!