Проблема

Проблема

Проблема

Я не могу понять, как заставить 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, вам необходимо:

  1. Postfix версии 2.11 или новее. CentOS 7 обеспечивает толькоПостфикс версии 2.10. Вам необходимо получить обновление для Postfix из не-CentOS средств. Я решил использовать postfix3и postfix3-mysqlпакеты изGhettoForge Плюспотому что кажетсяхорошо рекомендован сообществом 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, как это сделать! Он не будет угадывать, и полагаться только на наличие общего CA между клиентом и сервером — это лишь частичная реализация этого мощного инструмента. Если вас интересует эта модель безопасности MySQL, я нашел по крайней мере однуРуководство, содержащее хорошие примеры использования проверки клиентских сертификатов..

Связанный контент