Я не могу понять, как заставить 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.
Уменьшено до одного из нескольких соединений, чтобы материал был максимально конкретным.
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
В частности, обратите внимание, что 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
Обратите внимание, что ТРЕБУЕТСЯ 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 УСПЕШНО при удалении 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, вам необходимо:
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, я нашел как минимум один Практическое руководство, в котором приведены хорошие примеры использования проверки сертификата клиента..