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

Проблема

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

Версии:

  • ОС: CentOS 7
  • Postfix: 2: 2.10.1-6.el7 и 2: 3.2.4-1 .gf.el7
  • MySQL (MariaDB): 5.5.56

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

Я искал во всем Интернете, включая различные сайты StackExchange, ответ на этот вопрос. Я много раз читал документацию по Postfix и MySQL. Лучший ответ, который я нашел, - это тот, который я отвергаю как излишне сложный: « Настройте туннель SSH между вашими серверами Postfix и 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. Гранты MySQL

​​Обратите внимание, что 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)

Журналы

Постфиксное соединение не работает, когда ТРЕБУЕТСЯ 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 Connection SUCCEEDS when REQUIRE SSL is Removed

Это 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 . Это тоже не подействовало. Обратите внимание, что имя сертификата совпадает, поэтому эта проверка пройдет успешно, если она когда-либо будет предпринята.

2
задан 19 February 2018 в 21:49
1 ответ

Краткое содержание

Чтобы установить соединение 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, я нашел по крайней мере одно практическое руководство, в котором приведены хорошие примеры того, как использовать проверку сертификата клиента .

2
ответ дан 3 December 2019 в 11:26

Теги

Похожие вопросы