Я не могу понять, как заставить Postfix использовать TLS-соединение с MySQL. Я могу вручную подключиться с сервера Postfix к серверу MySQL с TLS в качестве пользователя postfix, так что с аутентификацией MySQL ничего не сломается. Проблема очевидна: Postfix не запрашивает TLS для подключения MySQL.
Версии:
Я искал во всем Интернете, включая различные сайты StackExchange, ответ на этот вопрос. Я много раз читал документацию по Postfix и MySQL. Лучший ответ, который я нашел, - это тот, который я отвергаю как излишне сложный: « Настройте туннель SSH между вашими серверами Postfix и MySQL, Ручные тесты показывают, что клиенты MySQL могут успешно подключаться через зашифрованный TLS канал со всех разрешенных узлов . Таким образом, настройка MySQL TLS также надежна и работает для всего , кроме Postfix .
Сокращено до одного из нескольких подключений, чтобы материал был как можно более конкретным.
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)
Хотя ручная командная строка тест 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
. Это тоже не подействовало. Обратите внимание, что имя сертификата совпадает, поэтому эта проверка пройдет успешно, если она когда-либо будет предпринята.
Чтобы установить соединение MySQL TLS из Postfix, вам необходимо:
postfix3
и postfix3-mysql
из GhettoForge Plus , потому что они кажутся хорошо рекомендованными сообществом CentOS . mysql_table
либо:
tls_ciphers
; 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, я нашел по крайней мере одно практическое руководство, в котором приведены хорошие примеры того, как использовать проверку сертификата клиента .