ラベル mail の投稿を表示しています。 すべての投稿を表示
ラベル mail の投稿を表示しています。 すべての投稿を表示

2024-09-21

Postfix に DKIM の設定を行う方法

はじめに

DMARCでメールの検証を行うには、SPFとDKIM両方を設定しないといけない。 この記事では、DKIMの設定を取り上げる。

DKIMの概要

SPF が配送もとの IP アドレス (つまりヘッダーの `Received: from helo-host.example.org (resolved-host.example.org [192.0.2.27])` の部分) を検証するのに対して、 DKIM では、メールを配送する際に、主要なヘッダー情報 (`Date`, `From`, `Reply-To`, `To`, `Subject` など) に対して署名を付加する。 公開鍵を DNS の TXT レコードに設定することになっており、受信側のメールサーバーで署名を検証する。

SPF と同様に DNS レコードを使ってメールを検証するので、 DNS が改ざんされると第三者がなりすましメールを送ることができてしまう。また、メール本文の改ざんは DKIM では検知できない。

設定手順

このセクションでは、 EL9 (AlmaLinux 9 や Rocky Linux 9) 上の Postfix で DKIM 署名を付加するための設定を説明する。 EL8 でもほぼ同様の方法で設定できる。

OpenDKIM のインストール

前もって CRB と EPEL をインストールしておき、以下のコマンドで OpenDKIM をインストールする。
sudo dnf --enablerepo=epel,crb install opendkim opendkim-tools

キーの作成

cd $(mktemp -d)
opendkim-genkey --directory ./ --domain example.com --selector 20240921 --bit 2048 --append-domain
sudo cp 20240921.private /etc/opendkim/keys/ -i
sudo chown opendkim:opendkim /etc/opendkim/keys/20240921.private

DNSレコードの設定

公開鍵が記載されたファイル 20240921.txt が生成されるので、これを参照してDNSレコードを設定する。 上記の例の場合、 20240921._domainkey.example.com. の TXT レコードを設定する。 TXT以降はカッコでかこまれてダブルクオートがついているが、例えば Cloudflare の DNS 場合は、カッコ・ダブルクオート・改行を取って Content に登録する。

設定ファイルの編集

sudo cp /etc/opendkim.conf /etc/opendkim.conf-20240921
sudoedit /etc/opendkim.conf
以下のように編集して保存する。
@@ -36,7 +36,7 @@
 ##  Selects operating modes. Valid modes are s (sign) and v (verify). Default is v.
 ##  Must be changed to s (sign only) or sv (sign and verify) in order to sign outgoing
 ##  messages.
-Mode	v
+Mode	sv
 
 ##  Log activity to the system log.
 Syslog	yes
@@ -101,12 +101,12 @@
 ##  Gives the location of a file mapping key names to signing keys. In simple terms,
 ##  this tells OpenDKIM where to find your keys. If present, overrides any KeyFile
 ##  directive in the configuration file. Requires SigningTable be enabled.
-# KeyTable	/etc/opendkim/KeyTable
+KeyTable	/etc/opendkim/KeyTable
 
 ##  Defines a table used to select one or more signatures to apply to a message based
 ##  on the address found in the From: header field. In simple terms, this tells
 ##  OpenDKIM how to use your keys. Requires KeyTable be enabled.
-# SigningTable	refile:/etc/opendkim/SigningTable
+SigningTable	refile:/etc/opendkim/SigningTable
 
 ##  Identifies a set of "external" hosts that may send mail through the server as one
 ##  of the signing domains without credentials as such.

sudoedit /etc/opendkim/KeyTable
以下の1行を加える。
20240921._domainkey.example.com example.com:20240921:/etc/opendkim/keys/20240921.private

sudoedit /etc/opendkim/SigningTable 
以下の1行を加える。
*@example.com 20240921._domainkey.example.com

OpenDKIMを起動する

sudo systemctl enable --now opendkim.service
sudo systemctl status opendkim.service

Postfixの設定

cd /etc/postfix/
sudo cp main.cf main.cf-20240921
sudoedit main.cf
以下の3行を追加する。
smtpd_milters = local:/run/opendkim/opendkim.sock
non_smtpd_milters = local:/run/opendkim/opendkim.sock
milter_default_action = accept
もしローカルからしか配送しないなら、 smtpd_milters は設定しなくてよさそう。

Postfixを再起動する

グループも設定したので、再起動する。
sudo systemctl restart postfix
sudo systemctl status postfix

動作確認

TXTレコードが設定されているかどうか確認する。
dig txt 20240921._domainkey.example.com
他のメールサーバーへ送信してみる。 Gmailなどへ送付すれば、「メッセージのソースを表示」からDKIMの検証状況を確認できる。
date -R | mutt -s 'DKIM key should be added' user@example.org
もし問題があれば、 /etc/postfix/main.cf をもとに戻して確認しよう。

小言

SSLのように外部の機関に認証してもらう必要がなく、コストがかからないのがありがたい。

参考

2022-04-19

Spamhausへブラックリスト解除を申請

KagoyaのVPSを借りたところ、以下の550メッセージでoutlook.com宛のメールを送信できないことが判明した。
    apc.olc.protection.outlook.com[104.47.57.161] said: 550 5.7.1 Service
    unavailable, Client host [133.18.xxx.xxx] blocked using Spamhaus. To request
    removal from this list see https://www.spamhaus.org/query/ip/133.18.xxx.xxx
    (AS3130). [DM6NAM11FT040.eop-nam11.prod.protection.outlook.com] (in reply
    to MAIL FROM command)

上記のURLへアクセスしたところ、delistの申請を進めることができ、1時間ほどでメールを送れるようになった。

それにしても、新たに借りたVPSがこのような状態になっているのは困る。 同じようなことが続くなら、他のVPSを借り直すか、VPSはやめて自宅サーバー経由でプロバイダ経由の送信にするかなど思案中。

その他にも、ブラックリストのチェックを行えるサイトがあるらしい。 次に借りるときは、使用期間中に調べるようにしよう。

  • Spamhaus
  • MX toolbox
  • blacklistalert.org
  • 2015-11-08

    Postfix: 細工したメールにより他者に配送エラーメッセージが送られる

    Postfixは, 配送でエラーが起こると, 送信者に配送エラーメールを返すようになっている. たとえば, 配送先のアドレスが存在しない, メールボックスが満杯など.
    本来はこうあるべきなのだけれども, この機能を悪用して, 第3者に配送エラーメールをスパムメールとして送る手口があるらしい.
    MAILER-DAEMONが配送エラーメールを送る事自体, スパムの情勢とあっていないのかもしれない.

    棒サイトでは, 配送先アドレスが存在しない場合に配送エラーメールを送らないような設定をしており, メールアドレスを間違った場合, 気づかずに処分されてしまう設定をしているほどだ.
    こうしないと, 自分のサーバーがスパムメールの送信元となってしまい, ブラックリストに入れられてしまう.
    配送先アドレスが存在しない場合は対処方法があるのだが, 他にも手口があるので, 紹介する. こういう攻撃に対しても対処が必要だ:-(

    Postfixに, 配送ループが起こっていると錯覚させる. 以下の例では, 踏み台ホストをsmtp.example.org, 踏み台のメールアドレスをhoge@example.orgとして書いている.

    $ telnet smtp.example.org
    220 smtp.example.org ESMTP Postfix
    helo localhost
    250 smtp.example.org
    mail from: 
    250 2.1.0 Ok
    rcpt to: 
    250 2.1.5 Ok
    data
    354 End data with .
    Delivered-To: hoge@example.org
    Date: Sun 08 Nov 2015 20:23:15 +0900
    ... (続く)
    .
    250 2.0.0 Ok: queued as 123456789A
    
    メール本文にあるDelivered-To:によって, ループが起こっていると錯覚するらしい. 他にも, Received:ヘッダーをたくさん書くなどでも, 同様の配送エラーを起こすことができるかも.
    以下に, このメールを受けたホストでのログを紹介する. 最後の行で, 犠牲者spamee@example.comにメールを送ってしまったことが分かる.
    postfix/local[11]: 123456789A: to=, relay=local, delay=52, delays=52/0.01/0/0.06, dsn=5.4.6, status=bounced (mail forwarding loop for hoge@example.org)
    postfix/cleanup[12]: 2233445566: message-id=<20151108120947.2233445566@smtp.example.org>
    postfix/bounce[13]: 123456789A: sender non-delivery notification: 0B41860FF6
    postfix/qmgr[14]: 2233445566: from=<>, size=2074, nrcpt=1 (queue active)
    postfix/qmgr[14]: 123456789A: removed
    postfix/smtp[15]: 2233445566: to=, relay=x.x.x.x, delay=0.29, delays=0.03/0.02/0.2/0.04, dsn=2.0.0, status=sent
    

    2011-11-30

    SMTP 認証を LDAP + PAM 環境で使用

    CentOS 5, 6 などにおいて SMTP にて認証を行うためには, saslauthd を使用する. しかし, 認証情報を LDAP から取得するようにしている場合には, 単に saslauthd の設定を行うだけではうまくいかない. 以下のような警告とともに認証に失敗する.
    postfix/smtpd[24325]: warning: SASL authentication failure: Password verification failed
    postfix/smtpd[24325]: warning: example.com[192.168.0.2]: SASL PLAIN authentication failed: authentication failure
    

    saslauthd が pam に認証情報を問い合わせるとき, /etc/pam.d/smtp の設定に基づいて pam が認証情報を返す. 一方で, smtppassword-auth を見るような設定となっているので, LDAP にて認証を行うことができない.

    解決方法は, pam がシステムの認証方法に従うようにすることである. include password-auth とかかれている部分を include system-auth と書き換えると LDAP にて認証できるようになる.

    2011-11-20

    フリーのバックアップメールサーバ

    メールサーバのバックアップのサービスが, フリーで提供されている: Free MX EMail Server Backup Service. スパムフィルタが有償で, 機能限定版であるバックアップメールサーバが無償という位置づけらしい.

    メールサーバが 1 台だけだと, 何らかの障害時にメールが失われてしまう. また, 送信者にメールサーバへの配送失敗の連絡が届き, 迷惑をかけてしまうこともあるだろう. 自宅サーバでメールサーバを運用している人だけでなく, レンタルサーバでメールサーバを運用している人にもおすすめしたい.

    サイトは英語だが, 登録の操作はさほど難しくない. というのも, MX レコードにバックアップサーバのホストを追加するだけである. MX レコードは, 優先順位とホストとを設定するが, メインのメールサーバの優先順位値を小さく (最優先) し, バックアップサーバの優先順位を大きく設定する. アナウンスのメーリングリストに入会することをすすめているが, 必須ではない.

    メールの送信側のサーバがバックアップサーバへ接続して RCPT TO を送った時点で, バックアップサーバが MX レコードをチェックする仕組みらしい.

    2011-01-06

    K-9 Mail で Courier-IMAP サーバのメールが表示されなくなる

    Android の K-9 mail は, Courier IMAP とともに使用すると, いくつかのメッセージが K-9 mail 上に表示されないことがある. とくに, 新しいメールが受信されないようで, 使用していて困る.

    どうも, K-9 Mail のスレッドによると Courier IMAP 側の問題といわれていて, 対策はまだ見付かっていない模様.

    とりあえず, K-9 Mail で, Recreate data (Last Resort!) を行うと, サーバからメッセージを取得しなおすことができるので, 当分は問題がないようだが, 私の経験ではしばらくするとまた再発する.

    Courier IMAP 側の問題といわれているので, 別の IMAP サーバ dovecot に代えてみたところ, 同様の問題は起こらなくなった.

    参考