問題

問題

問題

PostfixにMySQLへのTLS接続を強制する方法がわかりません。できるPostfix ユーザーとして TLS を使用して Postfix サーバーから MySQL サーバーに手動で接続すると、MySQL 認証に問題はありません。問題は明らかです。Postfix は MySQL 接続に TLS を要求していません。

バージョン:

  • OS: CentOS7
  • ポストフィックス: 2:2.10.1-6.el7 および 2:3.2.4-1.gf.el7
  • MySQL (MariaDB): 5.5.56

私がここに来た経緯

私は、この質問に対する答えを求めて、さまざまな StackExchange サイトを含む Web 全体を検索してきました。Postfix と MySQL のドキュメントを何度も何度も読みました。私が見つけた最良の答えは、不必要に複雑すぎるため却下したものです。"Postfix サーバーと MySQL サーバーの間に SSH トンネルを設定し、それを介して接続します。「MySQL クライアントで TLS (SSL) 暗号化を使用するように Postfix に指示する方法が必要です。

セットアップの詳細を調べる前に、次の点を明確にしておきましょう。 私のメールサーバーの設定はMySQL TLSなしでも問題なく動作します私はSMTPSとIMAPSにTLSをうまく使用しており、私の質問とは関係ありません. メールは、Postfix と MySQL サーバー間の MySQL 接続が暗号化されていないことを除き、ネットワークの内外両方で安全に転送されています。公開されている Postfix-MySQL リンクを除けば、メール インフラストラクチャにはまったく問題はありません。

ただし、セキュリティ要件の変更により、既存のインフラストラクチャを更新してすべての MySQL 接続を暗号化する必要があります。MySQL 接続の TLS の設定は簡単でした。 手動テストでは、MySQLクライアントは許可されたすべてのホストからTLS暗号化リンクを介して正常に接続できることが示されています。つまり、MySQL TLSの設定もしっかりしていて、すべてにおいて機能している。ポストフィックスを除く

私が試したこと

Postfix サーバー上の関連する構成:

/etc/postfix/main.cf

素材を可能な限り具体的に保つために、複数の接続のうちの 1 つだけに減らしました。

virtual_alias_maps = proxy:mysql:/etc/postfix/lookup_aliases.cf
proxy_read_maps = $virtual_alias_maps
参照:

資格情報とホスト名が難読化されています。

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
クライアント
[client]
ssl = true

成功 -- 手動 -- Postfix ユーザーとしての Postfix サーバーからの MySQL TLS 接続出力

特に 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)

ログ

SSL を要求すると Postfix 接続が失敗する

ここで 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
REQUIRE SSL を削除すると Postfix 接続が成功します

これは、REQUIRE SSLからREQUIRE NONEに権限を変更した後、Postfixが接続に成功した例です。ただし、接続は暗号化されていない

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 = trueMySQL クライアント接続を尊重することだけです。 さらに情報が必要な場合はお知らせください。

アップデート:

この質問を投稿した後、より注意深く読んでみると、Postfix 2.11より古いバージョンはMySQL設定ファイルの読み取りをまったくサポートしていないことがわかりました。そのため、ベンダー提供バージョンのPostfix(バージョン2.10)をMySQL TLSを使用するように設定することは不可能です。Postfixのドキュメントの文言の選択がまずいと感じています。MySQL設定に関するPostfixドキュメント読みます:

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".

そこで、CentOS 7のPostfixをベンダー提供のバージョン2.10からGhettoForge Plusが提供バージョン3.2。追加パッケージをインストールしましたpostfix3-mysql。期待は大きかったのですが、期待は裏切られました。Postfix 3.2でも、TLSリンク経由でMySQLに接続できない

option_file = /etc/my.cnf両方(デフォルトであり、不要であるはず)を試しましたが、option_file = /etc/my.cnf.d/client.cnf効果はありませんでした。

を追加して、Postfix に TLS を強制的に考慮させようとしましたtls_verify_cert = yes。これも効果はありませんでした。証明書名は一致するので、実際に試行された場合、この検証は成功することに注意してください。

答え1

概要

Postfix から MySQL TLS 接続を確立するには、次のものが必要です。

  1. Postfix バージョン 2.11 以降CentOS 7では、Postfix バージョン 2.10. PostfixのアップグレードはCentOS以外の手段で取得する必要があります。私は、postfix3およびpostfix3-mysqlパッケージを使用することを選択しました。ゲットーフォージプラスなぜなら、CentOSコミュニティから高く評価されています
  2. セットmysql_table設定ファイル内どちらか:
    1. 少なくとも 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 のソース コードを読み通すことにしました。src/global/dict_mysql.c の 653 行目から 658 行目は特に有益でした。

最終的解決

の動作をエミュレートしたい場合は、設定ファイル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にその方法を伝えた場合のみ! 推測はできず、クライアントとサーバー間の共通CAの存在のみに依存するのは、この強力なツールの部分的な実装にすぎません。このMySQLセキュリティモデルに興味がある場合は、少なくとも1つ見つけました。クライアント証明書の検証をどのように採用するかについての良い例を示すハウツーガイド

関連情報