Вход:  Пароль:  
FreeSource: Dokumentacija?/Postfix/TLS ...
Free Source | Каталог | Изменения | НовыеКомментарии | Пользователи | Регистрация |

Есть задача – воспользоваться почтовым сервером с работы для отправления писем из дома. Одно из решений – использование авторизации (SASL), здесь приведено второе решение – авторизация по сертификатам.


Делалось по TLS README и по сути является его вольным переводом.


Оглавление документа

Задача

Имеем дерево сертификатов:


Root Certificate


Дома прописан Home Server Certificate, на работе Work Server Certificate; на обоих машинах прописаны Root и Intermidiate сертификаты. Postfix на работе требует, чтобы машина:


Известность сертификата может определяться несколькими методами:

Давать разрешение только специально прописанным в отдельном файле (relay_clientcerts) сертификатам. Сертификаты прописываются по их fingerprint'у.
Давать разрешения всем прошедшим проверку сертификатам (их в maillog'е отмечают как trusted certificate)
Более гибкий permit_tls_clientcerts — позволяет раздавать разрешения по сертификатно: одному клиенту дать permit, а другого вообще пустить через отдельный Restriction Class?.

В нашем случае был использован первый — permit_tls_clientcerts.


NOTE: Обращаю внимание, что для permit_tls_clientcerts не требуется верификации сертификата. Другими словами, он не обязан быть Trusted. Но мы всё равно это сделаем.

Сертификаты

Перво-наперво надо с генерировать сертификаты.
Добавить позже

Месторасположение

Существует два способа проверки сертификата (и клиентом и сервером)

  1. CAfile — все сертификаты, которыми проверяется клиент, находятся в одном файле.
  2. CApath — сертификаты клиента находятся в отдельных файлах по определенному пути.

Одно но: CAfile открывается до перехода в chroot, сертификаты в CApath открываются после перехода в chroot1.
Вывод: CApath должен находится в chroot'е, когда CAfile где угодно в файловой системе, куда может залезть root.


NOTE: Для работы CApath необходимо запустить на нём c_rehash. В нашем случае:

c_rehash /var/lib/ssl/certs2

Я все сертификаты и приватный ключ расположил в системном хранилище в /var/lib/ssl, для CApath выбрал /var/postfix/spool/cert, куда примонтировал /var/lib/ssl/certs3, и в итоге получил (лишнее я убрал):
машина work1:

# ls /var/lib/ssl/certs
11877bd4.0 -> smtpd.pem
12ef4dde.0 -> CA.pem
4f77c31c.0 -> work2.pem
b12734d0.0 -> home.pem
CAintermediate.pem
CA.pem
d60438be.0 -> CAintermediate.pem
home.pem
make-dummy-cert
Makefile
work1.pem
work2.pem
# ls /var/lib/ssl/private
work1.key

# mount
/var/lib/ssl/certs on /var/spool/postfix/certs type none (rw,bind)

На домашней машине отличаться должен только /var/lib/ssl/private — там должен лежать home.key.
На всех файлах должны стоять права -rw-r--r-- 1 root root.
Циферные файлы были сгенерированы c_rehash.

Проверка

После того, как все сертификаты раскиданы по местам, проверяем на предмет наличия у нас всех сертификатов, и что сертификаты выданы с правильными параметрами:

openssl verify -purpose any -CApath /var/lib/ssl/certs /var/lib/ssl/certs/work1.pem

Настройка main.cf


smtpd_use_tls = yes
smtpd_tls_auth_only = yes
smtpd_tls_CApath = /certs
smtpd_tls_cert_file = /var/lib/ssl/certs/work1.pem
smtpd_tls_key_file = /var/lib/ssl/private/work1.key
smtpd_tls_loglevel = 2
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
smtpd_tls_session_cache_database = btree:/var/lib/postfix/tls_session_cache-server
smtpd_tls_ask_ccert = yes
smtpd_tls_ccert_verifydepth = 2

smtp_use_tls = yes
smtp_tls_cert_file = $smtpd_tls_cert_file
smtp_tls_key_file = $smtpd_tls_key_file
smtp_tls_CApath = $smtpd_tls_CApath
smtp_tls_loglevel = 1
smtp_tls_session_cache_timeout = 3600s
smtp_tls_session_cache_database = btree:/var/lib/postfix/tls_session_cache-client
smtp_tls_enforce_peername = no
smtp_tls_scert_verifydepth = 2
relay_clientcerts = hash:$config_directory/lookup/relay_clientcerts

TLS в client resticrions

smtpd_delay_reject = yes
smtpd_helo_restrictions = permit_tls_clientcerts, ...
smtpd_sender_restrictions = permit_mynetworks, permit_tls_clientcerts, ...
smtpd_recipient_restrictions = permit_tls_clientcerts, permit_auth_destination, permit_mynetworks, reject
smtpd_client_restrictions = permit_tls_clientcerts, permit_mynetworks, reject_unknown_client

CAfile

To enable a remote SMTP client to verify the Postfix SMTP server certificate, the issuing CA certificates must be made available to the client. You should include the required certificates in the server certificate file, the server certificate first, then the issuing CA(s) (bottom-up order).

Clients

To receive a remote SMTP client certificate, the Postfix SMTP server must explicitly ask for one (any contents of $smtpd_tls_CAfile are also sent to the client as a hint for choosing a certificate from a suitable CA). Unfortunately, Netscape clients will either complain if no matching client certificate is available or will offer the user client a list of certificates to choose from. Additionally some MTAs (notably some versions of qmail) are unable to complete TLS negotiation when client certificates are requested, and abort the SMTP session. So this option is “off” by default. You will however need the certificate if you want to use certificate based relaying with, for example, the permit_tls_clientcerts feature. A server that wants client certificates must first present its own certificate. While Postfix 2.3 by default offers anonymous ciphers to remote SMTP clients, these are automatically suppressed when the Postfix SMTP server is configured to ask for client certificates.


1 Как сказано в TLS README:

The $smtp_tls_CAfile contains the CA certificates of one or more trusted CAs. The file is opened (with root privileges) before Postfix enters the optional chroot jail and so need not be accessible from inside the chroot jail.
Additional trusted CAs can be specified via the $smtp_tls_CApath directory, in which case the certificates are read (with $mail_owner privileges) from the files in the directory when the information is needed. Thus, the $smtp_tls_CApath directory needs to be accessible inside the optional chroot jail.

2 /var/lib/ssl/certs указывать не обязательно, c_rehash туда смотрит по умолчанию.


3 команда монтирования:

mount -o bind /var/lib/ssl/certs /var/spool/postfix/certs

строка для сохранения в /etc/fstab:

/var/lib/ssl/certs /var/spool/postfix/certs any bind 0 0

 
Файлов нет. [Показать файлы/форму]
Комментариев нет. [Показать комментарии/форму]