
問題
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 = true
MySQL クライアント接続を尊重することだけです。 さらに情報が必要な場合はお知らせください。
アップデート:
この質問を投稿した後、より注意深く読んでみると、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 接続を確立するには、次のものが必要です。
- Postfix バージョン 2.11 以降CentOS 7では、Postfix バージョン 2.10. PostfixのアップグレードはCentOS以外の手段で取得する必要があります。私は、
postfix3
およびpostfix3-mysql
パッケージを使用することを選択しました。ゲットーフォージプラスなぜなら、CentOSコミュニティから高く評価されています。 - セット
mysql_table
設定ファイル内どちらか:- 少なくとも 1 つの許容される
tls_ciphers
設定。 - クライアント側のTLS証明書とそれに対応する秘密鍵、MySQLサーバーとPostfixクライアントの両方に共通の認証局によって署名されている; または
- 両方。
- 少なくとも 1 つの許容される
- /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つ見つけました。クライアント証明書の検証をどのように採用するかについての良い例を示すハウツーガイド。