user icon

Google Domainsを使ってDANEを設定する

前回前前回MTA-STSを設定したので、今回はDANEを設定してみます。
ドメイン取得はDNSサーバを提供していて、最初からDNSSECが設定されているGoogle Domainsを使います(DNSSEC分からなくても、何もしなくて良いのは助かります)。
※提供しているDNSサーバによってはTLSAレコードを設定出来なかったりするので、他で取得する時は事前に確認が必要です。
※タイムリーな事にGoogle Domainsやめるってよ、な話が出てて、移行先でもDNSSECが最初から有効かは、分かりません。
TLS証明書は、前前回のLet’s Encryptを使い回します。いつものようにexample.comを使います。

TLSAレコード作成(danetool)

TLSAレコードの作成には、opensslを使ったやり方が幾つも見つかるのですが、
  • 殆どがopenssl 0.9のやり方で書いてあって、違う値を出力していた(これは後で分かった)
  • CertUsage, Selector, MatchingTypeによって書き方が何通りも有り、ミスに気を使う
といった点で(特に一番目の理由が最初分からず)一旦挫折したのですが、色々と調べた結果それを含めた面倒を見てくれるdanetoolが有ったのでそれで解決します。
dnf install gnutls-utils
danetool --tlsa-rr --host example.com --load-certificate /etc/letsencrypt/live/example.com/cert.pem --starttls-proto=smtp
_25._tcp.example.com. IN TLSA ( 03 01 01 [hash値]) のように出力がされるのでTLSAレコードには、
03 01 01 [hash値]を3 1 1 [hash値]に修正して入れます。
またstarttls-proto=httpsにすると、_25._tcpが_443._tcpにだけ変わりますが、他のオプションを変えなければhash値等は変わらないので、確認をする意味以外では出力する必要は有りません。

Google Domains

取得したドメインに、先ほど生成したTLSAレコードを設定します。DNS>カスタムレコードの管理で編集画面を出し、以下のように設定します。
  • サブドメイン _25._tcp と、ついでにWeb用に_443._tcpも追加する
  • TLSAを選択
  • TTLは失敗を考慮して短めに設定
  • 先ほど生成したTLSAレコード値を入力
最後に保存を押して、レコードが追加されるのを確認します。
ついでに下の方でDNSSECが有効になっているのを確認しておきます。

Postfix

サーバ側(smtpd)は前々回やったLet’s Encryptを使ったTLSの設定をしておけば、特に何もしなくてもVerifyは通ります。
SMTPクライアント (smtpd_でなくsmtp_) は試していないので、追加設定が必要になるかも知れません。

確認

確認もdanetoolで出来ます。
danetool --check example.com --proto tcp --starttls-proto=smtp --load-certificate /etc/letsencrypt/live/example.com/cert.pem
TLSAレコードが出力され、最後にVerification: Certificate matches.が出ればOKです。 Webについてもhttps接続が正常に出来ればOKになる筈です。

その他色々

Let’s Encrypt

短い間に更新をするLet’s Encryptでは、TLSAレコードで、3 0 1, 3 0 2のようにSelector=0(FullCertificate) を避けるように言っています。
また証明書の更新でpubkeyが変わり、TLSAレコードが無効になってしまうのに対して/etc/letsencrypt/cli.iniに reuse-key = true を入れる案が出ています。

Postfix

Postfixでは、CertUsageの01は不可、2はオプションで、3を推奨しているようです。
PostfixとLet’s Encryptの事情を考慮すると、TLSAには、3 1 1 を使うのが良いようです。

Openssl

TLSA作成用に書いてあるオプションがopenssl 0.9用になっていて通らなかった件ですが、Webで幾ら探しても分からず、postfixのパッケージに含まれていたTLS_READMEに書いてあったのを偶然見つけて漸く分かりました。 そんなわけでopensslでTLSAが 3 1 1の場合、以下のようにすればdanetoolと同じhash値を出しました。
openssl x509 -in /etc/letsencrypt/live/example.com/cert.pem -pubkey -noout | openssl pkey -pubin -outform der | sha256sum
Selector=0の場合はまた違いますので、注意が必要です。
Facebooktwitterlinkedintumblrmail

Trackback

Comment

* DANE TLSA レコードの正確性を監視し、少なくとも 1 つが常にライブ証明書と一致することを確認します。
* 監視を実施していない場合は、DANE SMTP を実装しないでください。 何らかの理由で TLSA レコードが証明書チェーンと一致しないかどうかを最初に確認する必要があります。 メールを黙って DoS 攻撃しないでください。

* Let’s Encryptを使用している場合。 「renewal.conf」ファイルで「reuse_key = true」を設定し、「3 1 1」レコードを使用する必要があります。そうしないと、更新によって TLSA レコードが無効になります。
* `danebot` の使用を検討してください: https://github.com/tlsaware/danebot [やる気のあるプログラマーであれば、`danebot` への貢献を検討してください。
[ Please pardon any clumsy machine-translation errors. ]

名前
E-mail
URL
コメント

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)