こんなページを発見したので、うちのサーバもDomainKeys対応にしてみようかと思い立つ。
と言っても、このページの問題点によると、まだまだこれを使ってメールを弾いてしまうのは危険らしいので、自己満足の世界ですね。
ports/mail/dkfilterと言うのができていたので、まずはportsからdkfilterをインストール。
portsで入れると、普通に/usr/local系に入るらしい&ユーザとグループは作られないらしい。(でも、起動スクリプトだとdkfilterユーザで動くようだ)
そして、/usr/local/etc/rc.d/dkfilter_inとdkfilter_outと言う二つの起動スクリプトがインストールされるので、/etc/rc.confでdkfilter_in_enable="YES"とか書くと有効になるっぽい。
参考にしたドキュメントでも、portsでも、inboundフィルタのポートとして10025と10026を使うようだ。が、うちではamavisdとのやりとりに10025を使っているので、そこを避ける必要がある。
これは、rc.confでdkfilter_in_flagsをいじってやれば良さそうだ。
さて、amavisとdkfilterの二つのフィルタを通す必要があるのだが、どちらを先に通すべきだろうか?
良くわからなかったので、dkfilterを先に通すことにする。
つまり、
  1. ポート25でメールを受け取る
  2. smtpd_proxy_filterの設定に従い、ポート10026でdkfilterにメールを渡す
  3. dkfilterが検証した後、ポート10027に渡す
  4. ポート10027でpostfixが受け取った後、content_filterの設定に従いpipe経由でamavisdに渡す
  5. amavisdがウィルスの検証をした後、ポート10025に渡す
  6. 通常のメール配送
ん?amavisdを先にすれば、1ステップ減らせるかな?
  1. ポート25でメールを受け取る
  2. content_filterの設定に従い、pipe経由でamavisdに渡す
  3. amavisdがウィルスの検証をした後、ポート10025(dkfilter_in)に渡す
  4. dkfilterが検証した後、ポート10026に渡す
  5. ポート10026でpostfixが受け取り、通常のメール配送
これだと、ポートの設定もdkfilter側はデフォルトで行けそうですね。amavis側の戻し先もデフォルトのままだし・・・。
って、やっぱり駄目か。amavisdを通ると、メールのヘッダが変わってしまうので、dkfilterの検証に必ず失敗するに違いない・・・。
試してみれば良いんだけど、運用中のサーバだし、ちょこちょこ設定変えて再起動もしたくないのよね~。
と、言うわけで第1案で行くことにする。

inbound filterの設定

まずは、/etc/rc.conf
dkfilter_in_enable="YES"
dkfilter_in_flags="127.0.0.1:10026 127.0.0.1:10027"
後は、ユーザdkfilterを追加して、/usr/local/etc/rc.d/dkfilter_in start でdkfilter_inが起動する。
続いて、/usr/local/etc/postfix/master.cfを修正(変更箇所のみ提示)
smtp      inet  n       -       n       -       -       smtpd
        -o smtpd_proxy_filter=127.0.0.1:10026
        -o smtpd_client_connection_count_limit=10
        -o content_filter=
localhost:10027 inet n - n - - smtpd
        -o smtpd_authorized_xforward_hosts=127.0.0.0/8
        -o smtpd_client_restrictions=
        -o smtpd_helo_restrictions=
        -o smtpd_sender_restrictions=
        -o smtpd_recipient_restrictions=permit_mynetworks,reject
        -o smtpd_data_restrictions=
        -o mynetworks=127.0.0.0/8
        -o receive_override_options=no_unknown_recipient_checks
有効にするにはpostfix reload。
これで、試しにDomainKeys非対応のところからメールを送るとヘッダに
Authentication-Results: *** from=***; domainkey=neutral (no signature; no policy for ***)
のような行が追加され、gmail等のDomainKeys対応のところからメールを送ると
Authentication-Results: *** from=***; domainkey=pass
DomainKey-Signature: ***
のような行が追加される。(***の部分は伏せてあります)

outbound filterの設定

こちらも、ポートの問題と順番の問題があるので、inboundとは逆に、amavisdを通してから、dkfilterを通すことにする。(と言うのは無理だった)
まずは、鍵の作成。(参考にしたページそのまま)
# cd /usr/local/etc
# mkdir dkfilter
# cd dkfilter
# openssl genrsa -out selector1.key 1024
# openssl rsa -in selector1.key -pubout | grep -v "^--" | tr -d '\012' > pubkey.tmp
# chown -R dkfilter:dkfilter .
# chmod 700 .
# chmod 400 selector1.key
続いて、DNSのゾーンデータに公開鍵を登録する。このドメインはwizard-limit.netなので、ゾーンファイルに以下を追加。p=の部分は先ほどのpubkey.tmpの中身。
selector1._domainkey IN TXT "k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCbdo
F8H6+qr8KZc9RrEhsax96E+qgD+TgalOCTPG2uq0Mb03UdHji8+ZOAGUlac/LhzitgBuXFAbOQ66kHO9
rYCgGzSb2BFs/crChTMSoN1iXhg/r/kK7pekSVJOO2FinJhoeTSVxxYGg4c9UZyrVjThXYrujGWwbtA0
JapbvqOwIDAQAB; t=y"
namedの再起動をしておく。(もちろん、rndc reloadとかでOK)

ここからがいよいよフィルタの設定。
/etc/rc.conf
dkfilter_out_enable="YES"
dkfilter_out_flags=" --header \
        --keyfile=/usr/local/etc/dkfilter/private.key \
        --selector=selector1 --domain=wizard-limit.net --method=nofws \
        127.0.0.1:10028 127.0.0.1:10029"}
そして、/usr/local/etc/postfix/master.cf
pickup    fifo  n       -       n       60      1       pickup
        -o content_filter=dksign:[127.0.0.1]:10028
submission inet n       -       n       -       -       smtpd
        -o smtpd_helo_restrictions=
        -o smtpd_sender_restrictions=
        -o smtpd_data_restrictions=
        -o smtpd_etrn_restrictions=reject
        -o content_filter=dksign:[127.0.0.1]:10028
dksign    unix  -       -       n       -       10      smtp
        -o smtp_send_xforward_command=yes
localhost:10029 inet n  -       n       -       10      smtpd
        -o smtpd_authorized_xforward_hosts=127.0.0.0/8
        -o smtpd_client_restrictions=
        -o smtpd_helo_restrictions=
        -o smtpd_sender_restrictions=
        -o smtpd_recipient_restrictions=permit_mynetworks,reject
        -o smtpd_data_restrictions=
        -o mynetworks=127.0.0.0/8
        -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
        -o content_filter=
参考にしたページと違い、submissionポートでもSASLは有効にしていません。
結局、content_filterをうまく2重でかける方法がわからなかったので、pickup経由と、submission経由ではamavisを通らなくなってしまった。
どうしてもやりたかったら、inbound用とoutbound用の二つのamavisdを立ち上げて、それぞれで別のポートに返すようにしないと駄目かな~。
とりあえずテストとしては、gmail宛にメールを出してみたら、DomainKey-Status: good (test mode)みたいなヘッダがついていました。

と思ったんだけど、dkfilter_outの後にamavisを通すことならできそうなのでやってみたら、少なくともgoogleさんは文句を言わなかった。pgpの署名とかとは違って、メールの中身は変わっても問題ないらしい。
と、言うわけで、上のmain.cfの10029で、amavisをcontent_filterに指定してやれば、出て行くメールもウィルスチェックされるのであった。
localhost:10029 inet n  -       n       -       10      smtpd
        -o smtpd_authorized_xforward_hosts=127.0.0.0/8
        -o smtpd_client_restrictions=
        -o smtpd_helo_restrictions=
        -o smtpd_sender_restrictions=
        -o smtpd_recipient_restrictions=permit_mynetworks,reject
        -o smtpd_data_restrictions=
        -o mynetworks=127.0.0.0/8
        -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
        -o content_filter=amavis
これができるんだったら、inboundの方もamavis→dkfilterにしようかとも思ったんだけど、dkfilter_inはキューに入る前にチェックするフィルタのようなので、今回はこのままで行くことにする。

こうやって動いてしまうと、SPFとか、SASLとか、どんどん入れたくなってしまいますねえ。

おまけ。
上記の設定だけだと、MUAからsubmissionポートに繋がりませんでした。
/etc/ipf.rulesを修正して、SMTPだけでなくsubmissionポートも通すようにして、無事にDomainKeysが有効になることを確認しました。

カテゴリ

トラックバック(0)

このブログ記事を参照しているブログ一覧: DmainKeys対応

このブログ記事に対するトラックバックURL: https://www.wizard-limit.net/cgi-bin/mt/mt-tb.cgi/1030

コメントする

このブログ記事について

このページは、falseが2006年3月30日 13:47に書いたブログ記事です。

ひとつ前のブログ記事は「postgresqlバージョンアップ」です。

次のブログ記事は「SASL対応」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

広告

Powered by Movable Type 6.1.1