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

Заставить Postfix использовать TLS для подключения к MySQL?

Эта проблема

Я не могу понять, как заставить Postfix использовать TLS-соединение с MySQL. я жестяная банка вручную подключитесь с сервера Postfix к серверу MySQL с TLS в качестве пользователя postfix, чтобы ничего не нарушалось с аутентификацией MySQL. Проблема очевидна: Postfix не запрашивает TLS для соединения MySQL.

Версии:

Как я сюда попал

Я искал во всем Интернете, включая различные сайты StackExchange, ответ на этот вопрос. Я много раз читал документацию по Postfix и MySQL. Лучший ответ, который я нашел, - это тот, который я отвергаю как излишне сложный: "Настройте туннель SSH между серверами Postfix и MySQL, а затем подключитесь через него."Должен быть способ указать Postfix использовать шифрование TLS (SSL) с клиентом MySQL.

Прежде чем мы рассмотрим установку, позвольте мне сделать следующее: Настройка моего почтового сервера отлично работает без MySQL TLS. Я успешно использую TLS для SMTPS и IMAPS, и это ничего общего с моим вопросом. Почта безопасно транспортируется как в мою сеть, так и из нее, за исключением того, что соединения MySQL между Postfix и сервером MySQL не зашифрованы. За исключением открытой ссылки Postfix-MySQL, с моей почтовой инфраструктурой нет никаких проблем.

Однако из-за изменения требований безопасности я должен обновить существующую инфраструктуру, чтобы зашифровать все соединения MySQL. Настроить TLS для соединений MySQL было легко. Ручные тесты показывают, что клиенты MySQL могут успешно подключаться по зашифрованной TLS ссылке со всех разрешенных хостов.. Итак, настройка MySQL TLS также надежна и работает для всего кроме Postfix.

Что я пробовал

Соответствующая конфигурация на сервере Postfix:

/etc/postfix/main.cf

Уменьшено до одного из нескольких соединений, чтобы материал был максимально конкретным.

virtual_alias_maps = proxy:mysql:/etc/postfix/lookup_aliases.cf
proxy_read_maps = $virtual_alias_maps
/etc/postfix/lookup_aliases.cf

Учетные данные и имена хостов запутаны.

hosts = mysql-server.domain.tld
user = postfix
password = *****
dbname = mail
option_file = /etc/my.cnf.d/client.cnf
option_group = client
tls_verify_cert = yes
query = SELECT goto FROM alias WHERE address = '%s' AND active = '1'
/etc/my.cnf

Этот файл остался нетронутым. Я включаю его только для того, чтобы показать, что следующий файл конфигурации правильно включен в конфигурацию клиента MySQL.

!includedir /etc/my.cnf.d
/etc/my.cnf.d/client.cnf
[client]
ssl = true

Успешно - ВРУЧНУЮ - Выход MySQL TLS-соединения с сервера Postfix в качестве пользователя postfix

В частности, обратите внимание, что TLS успешно используется:

# hostname -f
mail.domain.tld

# sudo -u postfix mysql -h mysql-server.domain.tld -u postfix -p mail
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 72
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [mail]> \s
--------------
mysql  Ver 15.1 Distrib 5.5.56-MariaDB, for Linux (x86_64) using readline 5.1

Connection id:     72
Current database:  mail
Current user:      postfix@mail.domain.tld
SSL:           Cipher in use is DHE-RSA-AES256-GCM-SHA384
Current pager:     stdout
Using outfile:     ''
Using delimiter:   ;
Server:            MariaDB
Server version:        5.5.56-MariaDB MariaDB Server
Protocol version:  10
Connection:        mysql-server.domain.tld via TCP/IP
Server characterset:   latin1
Db     characterset:   utf8
Client characterset:   utf8
Conn.  characterset:   utf8
TCP port:      3306
Uptime:            1 hour 27 min 23 sec

Threads: 1  Questions: 271  Slow queries: 0  Opens: 13  Flush tables: 2  Open tables: 39  Queries per second avg: 0.051
--------------

MariaDB [mail]> \q
Bye

Соответствующая конфигурация на сервере MySQL:

MySQL Grants

Обратите внимание, что ТРЕБУЕТСЯ TLS (SSL), но в остальном разрешения относительно слабые, пока я не устраню эту проблему с подключением TLS:

MariaDB [(none)]> SHOW GRANTS FOR 'postfix'@'10.0.101.%';
+-----------------------------------------------------------------------------------------------------+
| Grants for postfix@10.0.101.%                                                                       |
+-----------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'postfix'@'10.0.101.%' IDENTIFIED BY PASSWORD '*SOMEPASSWORDHASH' REQUIRE SSL |
| GRANT SELECT ON `mail`.* TO 'postfix'@'10.0.101.%'                                                  |
+-----------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

Журналы

Соединение с Postfix не работает при ТРЕБОВАНИИ SSL

Несмотря на то, что ручная проверка соединения MySQL TLS из командной строки здесь УСПЕХА, Postfix по-прежнему не будет использовать MySQL TLS.

Общий журнал MySQL:

180217 14:45:15       16 Connect   postfix@mail.domain.tld as anonymous on mail
      16 Connect   Access denied for user 'postfix'@'mail.domain.tld' (using password: YES)

Журнал Postfix:

Feb 19 19:22:55 mail postfix/cleanup[11951]: warning: proxy:mysql:/etc/postfix/lookup_aliases.cf lookup error for "root@mail.domain.tld"
Feb 19 19:22:55 mail postfix/cleanup[11951]: warning: E2CCA2069823: virtual_alias_maps map lookup problem for root@mail.domain.tld -- message not accepted, try again later
Соединение Postfix УСПЕШНО при удалении REQUIRE SSL

Это Postfix, успешно подключившийся после изменения разрешения с REQUIRE SSL на REQUIRE NONE. Однако связь не зашифрованный.

180217 15:17:21       26 Connect   postfix@mail.domain.tld as anonymous on mail
          26 Query show databases
          26 Query show tables
          26 Field List    admin
          26 Field List    alias
          26 Field List    alias_domain
          26 Field List    config
          26 Field List    domain
          26 Field List    domain_admins
          26 Field List    fetchmail
          26 Field List    log
          26 Field List    mailbox
          26 Field List    quota
          26 Field List    quota2
          26 Field List    vacation
          26 Field List    vacation_notification
          26 Query select @@version_comment limit 1

Вывод

Все, что мне нужно, это чтобы Postfix уважал ssl = true для своих клиентских подключений MySQL. Пожалуйста, дайте мне знать, если вам понадобится дополнительная информация.

Обновить:

После публикации этого вопроса я обнаружил при более внимательном чтении, что версии Postfix старше 2.11 вообще не поддерживают чтение файлов конфигурации MySQL. Таким образом, невозможно настроить поставляемую поставщиком версию Postfix (версия 2.10) для использования MySQL TLS. Я считаю, что в документации Postfix плохой выбор формулировок, где верхняя часть документация Postfix для конфигурации MySQL читает:

Postfix 3.1 and earlier don't read [client] option group settings unless a non-empty option_file or option_group value are specified. To enable this, specify, for example "option_group = client".

Автор не смог разобрать:

These options are ignored for Postfix 2.10 and earlier.  Postfix 2.11 through 3.1 don't read [client] option group settings unless a non-empty option_file or option_group value are specified. To enable this, specify, for example "option_group = client".

Итак, я обновил Postfix на CentOS 7 с поставляемой поставщиком версии 2.10 до GhettoForge Plus в комплекте версия 3.2. Я установил дополнительный postfix3-mysql пакет. У меня были большие надежды, но они не оправдались. Теперь, даже с Postfix 3.2, он по-прежнему не подключается к MySQL по ссылке TLS.

Я пробовал оба option_file = /etc/my.cnf (должно быть по умолчанию и не нужно) и option_file = /etc/my.cnf.d/client.cnf но безрезультатно.

Я даже попытался заставить Postfix учитывать TLS, добавив tls_verify_cert = yes. Это тоже не подействовало. Обратите внимание, что имя сертификата совпадает, поэтому эта проверка пройдет, если она когда-либо будет предпринята.

Синопсис

Чтобы установить соединение MySQL TLS с Postfix, вам необходимо:

  1. Postfix версии 2.11 или новее. CentOS 7 предоставляет только Postfix версии 2.10. Вы должны приобрести обновление для Postfix средствами, отличными от CentOS. Я решил использовать postfix3 и postfix3-mysql пакеты от GhettoForge Plus потому что кажется хорошо рекомендован сообществом CentOS.
  2. Устанавливать внутри вашего mysql_table файлы конфигурации либо:
    1. Хотя бы один допустимый tls_ciphers установка;
    2. Клиентский сертификат TLS и соответствующий ему закрытый ключ, подписано центром сертификации, общим для сервера MySQL и вашего клиента Postfix; или
    3. обе.
  3. Не полагайтесь на их установку в файлах /etc/my.cnf или /etc/my.cnf.d/*! Код Postfix MySQL не читает эти файлы, чтобы определить, устанавливать ли соединение MySQL TLS; они разбираются слишком поздно. В только способ заставить Postfix открыть соединение MySQL TLS - указать настройки TLS в вашем mysql_table файлы конфигурации. Период.

Как я сюда попал

Я наконец прибег к чтению исходного кода Postfix 3.2. Строки 653-658 файла src / global / dict_mysql.c были особенно информативными.

Окончательное решение

Если вы хотите подражать поведению ssl = true, вам просто нужно добавить строку, подобную следующей, в свой mysql_table файлы конфигурации:

tls_ciphers = TLSv1.2

Наша конфигурация требует, чтобы использовался только TLS 1.2 - и он уже давно применяется в конфигурации наших серверов MySQL, поэтому мне не приходило в голову автоматически применять его на клиентах - но вы можете добавить другие шифров, если ваша организация допускает использование старых шифров.

Обратите внимание, что мы совершенно счастливы, что не используем сертификаты на стороне клиента. Мы используем другие средства для защиты и активного мониторинга наших подключений к базе данных; мы просто не хотим дополнительной сложности.

Альтернативное решение

Если вы предпочитаете, чтобы к вашим серверам MySQL подключались только известные доверенные клиенты - и вы не можете сделать это с помощью других механизмов применения политик, таких как жесткие межсетевые экраны, строгая сложность паролей, периодичность смены паролей, аудит соединений и т. Д. - тогда вы можете также используйте сертификаты на стороне клиента с помощью этих дополнительных настроек в вашем mysql_table файлы конфигурации:

tls_key_file = /path/to/private.key
tls_cert_file = /path/to/public.certificate
tls_CAfile = /path/to/common.CA.certificate # OR tls_CApath = /path/to/CA-and-intermediate-chain-certificates/

Опять же, установив их в /etc/my.cnf или /etc/my.cnf.d/* не поможет. Эти файлы не анализируются до тех пор, пока после тип подключения (TLS или не-TLS) имеет уже решено.

Если вы решите использовать сертификаты на стороне клиента, обеспечить их соблюдение на сервере! Вы не нужны сертификаты на стороне клиента, когда все, что вам нужно, это шифрование трафика MySQL; вместо этого просто используйте tls_ciphers альтернатива, выше. Добавление сертификатов на стороне клиента позволяет MySQL проверять, что подключающийся клиент уже известен и является доверенным, но только если вы скажете MySQL, как это сделать! Он не будет гадать, и полагаться только на наличие общего ЦС между клиентом и сервером - это лишь частичная реализация этого мощного инструмента. Если вас интересует эта модель безопасности MySQL, я нашел как минимум один Практическое руководство, в котором приведены хорошие примеры использования проверки сертификата клиента..