
Проблема
Я не могу понять, как заставить Postfix использовать TLS-соединение с MySQL. Яможетвручную подключитесь с сервера Postfix к серверу MySQL с TLS как пользователь postfix, чтобы ничего не сломалось с аутентификацией MySQL. Проблема ясна: Postfix не запрашивает TLS для соединения с MySQL.
Версии:
- ОС: CentOS 7
- Постфикс: 2:2.10.1-6.el7 и 2:3.2.4-1.gf.el7
- MySQL (MariaDB): 5.5.56
Как я сюда попал
Я искал ответ на этот вопрос по всему Интернету, включая различные сайты 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:
/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 Client.
!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: [email protected]
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-грантыОбратите внимание, что TLS (SSL) ОБЯЗАТЕЛЬНО требуется, но в остальном разрешения относительно слабые, пока я не решу эту проблему с подключением TLS:
MariaDB [(none)]> SHOW GRANTS FOR 'postfix'@'10.0.101.%';
+-----------------------------------------------------------------------------------------------------+
| Grants for [email protected].% |
+-----------------------------------------------------------------------------------------------------+
| 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 соединение не работает при REQUIRE SSLНесмотря на то, что ручная проверка соединения MySQL TLS с помощью командной строки здесь УСПЕШНО выполнена, Postfix по-прежнему не будет использовать MySQL TLS.
Общий журнал MySQL:
180217 14:45:15 16 Connect [email protected] 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 "[email protected]"
Feb 19 19:22:55 mail postfix/cleanup[11951]: warning: E2CCA2069823: virtual_alias_maps map lookup problem for [email protected] -- message not accepted, try again later
Postfix-соединение УСПЕШНО, если REQUIRE SSL удален
Это Postfix успешно подключается после изменения разрешения с REQUIRE SSL на REQUIRE NONE. Однако соединениене зашифровано.
180217 15:17:21 26 Connect [email protected] 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
. Это также не дало никакого эффекта. Обратите внимание, что имя сертификата совпадает, поэтому эта проверка пройдет, если она когда-либо будет предпринята.
решение1
Синопсис
Чтобы установить MySQL TLS-соединение из Postfix, вам необходимо:
- Postfix версии 2.11 или новее. CentOS 7 обеспечивает толькоПостфикс версии 2.10. Вам необходимо получить обновление для Postfix из не-CentOS средств. Я решил использовать
postfix3
иpostfix3-mysql
пакеты изGhettoForge Плюспотому что кажетсяхорошо рекомендован сообществом CentOS. - Наборв ваших
mysql_table
конфигурационных файлахили:- По крайней мере одна допустимая
tls_ciphers
настройка; - Клиентский сертификат TLS и соответствующий ему закрытый ключ,подписано Центром сертификации, который является общим для сервера MySQL и вашего клиента Postfix; или
- оба.
- По крайней мере одна допустимая
- Не полагайтесь на настройку этих параметров в файлах /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, как это сделать! Он не будет угадывать, и полагаться только на наличие общего CA между клиентом и сервером — это лишь частичная реализация этого мощного инструмента. Если вас интересует эта модель безопасности MySQL, я нашел по крайней мере однуРуководство, содержащее хорошие примеры использования проверки клиентских сертификатов..