Sendmail の DomainKeys を止めてみる

SERVER


DomainKeys を使用しないようにしてみました。

DomainKeys という送信元認証のための仕組みが Yahoo や Google によって推奨されていたようだったので、2010 年の 10 月頃にそれをやってみたのですけど、どうやらそのときの DomainKeys が影響して、Yahoo! からの確認メールが届かなくなっているようでした。

届かないのは確認メールだけで、その他の通知メールはどうやら届いている様子です。

でも、2012 年 5 月 19 日には確認メールが届いていたので、それがどうして届かなくなってしまったのかは謎なままですけれど。

メールログ周りを確認してみる

ともあれ確認メールを何度送信しても届かなかったので、まずはメールのログ (/var/log/maillog) を確認してみたところ、次のようなエラーが記録されていました。

sendmail[12762]: q83BprU6012762: Milter: data, reject=451 4.3.2 Please try again later

このエラーはどうやら MILTER という sendmail のメールフィルタが出力しているもののようです。

sendmail.mc の INPUT_MAIL_FILTER で指定されているフィルターで、今回の環境では次のような定義になっています。

INPUT_MAIL_FILTER(`dk-filter', `S=inet:18892@localhost')dnl

つまり、自分で以前に設定した "dk-filter" という DomainKeys を実現するためのフィルターですね。

試しにこの行をコメントアウトしてみたところ、正常に確認メールが届くようになったので、このフィルターが影響して Yahoo! からの確認メールが届かなくなっていることは間違いなさそうです。

dk-filter 周りを調べてみる

それなら、dk-filter の何が影響しているのかを調べてみることにしました。

今回のように "reject=451 4.3.2 Please try again later" となるのは DNS 周りの検索が上手く行っていないからだという情報もありましたが、このメールサーバーの DNS は機能しているようで、それ以上のことはどう調べたら良いのか判りませんでした。

とりあえず gmail のメールアドレスを Yahoo! アカウントに登録してみたところ、gmail にちゃんと届いて、DomainKeys の情報が正しいものとして認識されているようだったので、送信元がおかしいということも、なさそうな感じが強かったです。

 

dk-filter では、何か不正があったとき、そのメールをどうするかを -C オプションで指定できるようになっていたので、次のように内部エラーを「一時エラー」に、それ以外を「受信」に設定してみました。

-C bad=a,dns=a,int=t,no=a,miss-a

このようにしても、Yahoo! からの確認メールは "reject=451 4.3.2 Please try again later" となりました。

そこで、次のように全ての条件で「受信」にしてみます。

-C bad=a,dns=a,int=a,no=a,miss-a

こうしたところ、Yahoo! の確認メールを受信できたことから、どうやら内部エラーによる失敗のため、Yahoo! のメールが到着しなくなっているように思われます。

 

ちなみに、それぞれの意味合いは、次のようになっています。

bad 付与されていた署名の認証失敗
dns 送信元の公開鍵の取得失敗
int 内部エラーによる失敗
no 署名が付与されていない場合 (相手自身で署名を任意と宣言している場合)
miss 署名が付与されていない場合 (相手自身で署名を必須と宣言している場合)

それらのときの動作は、次から選択します。

a 受信
d 受信したことにして破棄
t 一時エラーを通知
r 拒否を通知

dk-filter 内部エラーの可能性は…

Yahoo! の確認メールが届かない原因が、自分の設置した dk-filter の内部エラーが原因だろうと思ってみても、だからどう直せばいいかがどうにも判らないところでした。

dk-filter を再起動したときにログに "dk-filter: Sendmail DomainKeys Filter: mi_stop=1" というメッセージが表示されるのですけど、これは停止や起動の時には表示されず、再起動のときだけ、それも再起動のときの停止のタイミング辺りで表示される感じです。

 単に停止したということが通知されているだけなのでしょうか…。

 

とりあえず、dk-filter をコンパイルしなおしてみたり、公開鍵を更新してみたりしましたけど、それによって改善されることはありませんでした。

そんな感じで原因がわからないまま、これ以上調査したところでそもそも DomainKeys を使用する価値があるのかも疑問だったので、今回は dk-filter を使わないようにすることにします。

自分が出したメールが迷惑メールとして扱われる可能性は高まりますけど、そもそも DomainKeys を付けたからって偽装を防止できる訳でもないし、何より大事なメールが届かないことの方がずっと痛手な気がするので、こういう決着になりましたけど、これでよかったかなって思います。