SSL (уровень защищённых сокетов) и его потомок TLS (безопасность транспортного уровня) наиболее широко используемые протоколы для шифрования данных, которыми обмениваются сервер и клиент. Эти протоколы часто используют сертификаты X.509 для асимметричной криптографии.
STARTTTLS — это другой метод обезопасить обмен простым текстом. Этот протокол также шифрует данные с SSL или TLS, но с тем же портом что и протоколы простого текста, вместо использования отдельных портов для SSL/TLS-зашифрованной коммуникации. Например, IMAP через STARTTLS использует тот же порт что и IMAP (143), в то время как IMAPS (IMAP через SSL) использует отдельный порт 993.
Предыдущая инструкция описывала, как настроить почтовый сервер на основе Postfix и Dovecot, но аспект безопасности не попал в неё. В этом уроке мы продемонстрируем как усилить безопасность почтового сервера посредством настройки шифрования, основанного на TLS/SSL.
Необходимые сертификаты TLS/SSL могут быть самоподписанными, подписанными бесплатной службой сертификации (вроде CAcert) или подписаны коммерческой службой (вроде VeriSign), а также могут быть созданы утилитами вроде OpenSSL. В данном мануале мы собираемся использовать самоподписанный сертификат.
Включение TLS шифрования для Postfix
Самоподписанный сертификат может быть создан следующей командой.
# openssl req -new -x509 -days 365 -nodes -out /etc/ssl/certs/postfixcert.pem -keyout /etc/ssl/private/postfixkey.pem
Вышеприведённая команда затребует новый сертификат, тип которого X.509, и который будет валидным на протяжении 365 дней. Необязательный параметр -nodes определяет, что частный ключ не должен быть зашифрованным. Созданный файл сертификат будет сохранён как postfixcert.pem, а файл ключа как postfixkey.pem .
При создании сертификата будут запрошены данные:
Country Name (2 letter code) [AU]:TH State or Province Name (full name) [Some-State]:Chonburi Locality Name (eg, city) []:Pattaya Organization Name (eg, company) [Internet Widgits Pty Ltd]:codeby.net Organizational Unit Name (eg, section) []:Example.tst Common Name (e.g. server FQDN or YOUR name) []:mail.example.tst Email Address []:alex@example.tst
Можно всё красиво и правильно ввести, но правда жизни такова, что эти данные ни на что не влияют. Их не смотрят ни люди, ни программы. Вместо ввода данных можно просто каждый раз нажимать [Enter].
Теперь, когда сертификаты готовы, необходимы внести нужные настройки в файл конфигурации postfix.
root@mail:~# vim /etc/postfix/main.cf
### STARTTLS включён ### smtpd_tls_security_level = may smtpd_tls_received_header = yes smtpd_tls_auth_only = yes ### loglevel 3 может быть использован для решения проблем ### smtpd_tls_loglevel = 1 ### путь до сертификата и ключевого файла smtpd_tls_cert_file = /etc/ssl/certs/postfixcert.pem smtpd_tls_key_file = /etc/ssl/private/postfixkey.pem smtpd_use_tls=yes
Перезапускаем postfix для включения TLS.
root@mail:~# service postfix restart
Уже сейчас postfix готов для шифрования данных при передачи их с/на сервер. Дополнительные подробности о поддержке Postfix TLS можно найти в официальном README.
Включение SSL шифрования для Dovecot
Настройка dovecot для шифрования схожа с postfix.
Вначале делаем самоподписанный сертификат с помощью openssl:
# openssl req -new -x509 -days 365 -nodes -out /etc/ssl/certs/dovecotcert.pem -keyout /etc/ssl/private/dovecotkey.pem
Эта команда затребует создание нового сертификата X.509, действительного 365 дней. -nodes это опция, которая говорит, что частный ключ не должен быть зашифрован. Файл сертификата будет сохранён как dovecotcert.pem, а файл ключа будет иметь имя dovecotkey.pem.
Заполняем данные для сертификата (можно писать что угодно, либо просто оставлять строки пустыми):
Country Name (2 letter code) [AU]:TH State or Province Name (full name) [Some-State]:Chonburi Locality Name (eg, city) []:Pattaya Organization Name (eg, company) [Internet Widgits Pty Ltd]:codeby.net Organizational Unit Name (eg, section) []:Example.tst Common Name (e.g. server FQDN or YOUR name) []:mail.example.tst Email Address []:alex@example.tst
Далее, прописываем пути к сертификатам в настройках dovecot.
root@mail:~# vim /etc/dovecot/conf.d/10-ssl.conf
ssl = no меняем на ssl = yes И добавляем следующие строки: ssl_cert = </etc/ssl/certs/dovecotcert.pem ssl_key = </etc/ssl/private/dovecotkey.pem
Наконец, перезапускаем dovecot для включения SSL с новыми сертификатами.
root@mail:~# service dovecot restart
Проверяем открытые порты, теперь должен быть полный набор.
root@mail:/etc/dovecot/conf.d# netstat -nat tcp 0 0 0 0.0.0.0:110 0.0.0.0:* LISTEN tcp 0 0 0 0.0.0.0:143 0.0.0.0:* LISTEN tcp 0 0 0 0.0.0.0:993 0.0.0.0:* LISTEN tcp 0 0 0 0.0.0.0:995 0.0.0.0:* LISTEN
Настройка почтового клиента Mozilla Thunderbird
Для тестирования использовалась программа Mozilla Thunderbird. Программа хорошая, но встроенный мастер настройки учётной записи не предлагает принять новые самоподписанные сертификаты. Т.е. можно столкнуться с неприятной ситуацией, когда на самом деле почтовый сервер настроен и работает правильно, а мастер настройки учётной записи Mozilla Thunderbird постоянно пишет, что пароль неправильный.
Я делал следующим образом: выбирал аутентификацию без шифрования. После создания учётной записи переходил в её настройки и выбирал аутентификацию с шифрованием. После этого, при отправке/получении почты Mozilla Thunderbird делал запрос на принятие сертификатов. После принятия всех сертификатов всё отлично работает, в том числе и злосчастный мастер настройки учётных записией.
После описанных манипуляций почтовая программа Mozilla Thunderbird определила следующие настройки для моего сервера:
Решение проблем
Для начала, убедитесь, что все необходимые порты разрешены в файерволе.
Второе, попробуйте telnet подключиться к почтовому серверу. Это должно получиться. Ниже приведено несколько примеров.
Соединение к IMAPS
$ telnet mail.example.tst 993 Trying mail.example.tst... Connected to mail.example.tst. Escape character is '^]'. exit exit Connection closed by foreign host.
Соединение к POP3S
$ telnet mail.example.tst 995 Trying mail.example.tst... Connected to mail.example.tst. Escape character is '^]'. exit exit Connection closed by foreign host.
Соединение к SMTP
$ telnet mail.example.tst 25 Trying mail.example.tst... Connected to mail.example.tst. Escape character is '^]'. 220 mail.example.tst ESMTP Postfix (Debian/GNU) ### Команды ### ehlo mail.example.tst 250-mail.example.tst 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-STARTTLS 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN