お盆休み中に、Postfix Advent Calendar 2014 という数年前のコンテンツを読んでいました。
20日目の記事に セカンダリメールサーバの設定(認証サーバが落ちても動くようにプレインテキストにユーザ一覧を記入する構成)という記事を見つけました。その記事の中を一部引用させていただきます。

例えばセカンダリで存在しないユーザのメールを受信したとしましょう.最初の設計の時に述べましたが,セカンダリが受信したメールはプライマリに転送します.プライマリに転送した後,ユーザが存在しないため,そこでエラーになり,送信者にエラーとして戻る事になります.その時ですが,エラーの送信者が「MAILER-DAEMON@example.jp」になります.メールの内容が一般的な文章だった場合は良いのですが,内容がspamだった場合ですがspamのメールは多くが発信者偽造をされています.無断で発信者にされたメールアドレスにエラーメールが戻ります.そして本ドメイン「MAILER-DAEMON@example.jp」はspam送信者の烙印をおされる事になるのです.そのため,有効なメールアドレスの確認をせずにセカンダリメールサーバでメールを受信するのは得策ではありません.

セカンダリメールサーバの設定

まさしく、この部分についてしっかり対応しないと、ブラックリストに登録された経験があるので、さっそくやってみた結果を備忘録代わりに残します。
プログラムは、もう数十年触っていないので、スクリプトについては参考程度にしてください(^_^;)

メールサーバに登録されていて、受信しなくてはいけない全てのアカウントについて、そのメールアドレスをまとめたテキストファイルの作成方法です。

それでは簡単に手順を記載します。

 メールアドレス一覧の作成方法

/root/makeuser というスクリプトファイルを作成します。

getent passwd で、/etc/passwd ファイルからアカウント行を取り出します。一般的なメールサーバであれば、/home にアカウント毎にディレクトリが存在するので、次のパイプラインにある grep /home で、メールアドレスにはならないアカウント(システムアカウント等)を除きます。

行のデリミタ(単語を分ける記号)をコロン ‘:‘ に設定し、行頭の単語を取り出し、そこにドメイン名 “@example.com” と OK という単語をくっつけて、user01.dat に書き込みます。

同様に /etc/aliases からアカウント名を取り出しますが、空白行やコメント行に対応するため、sed で不要な行を削除しています。

最後に、postfix で仮想ユーザ(仮想ドメイン)を使っている場合に、/etc/postfix/virtual が作成されているので、そこから同様にメールアドレスを作成しますが、anything という行は不要なので、最初に grep -v でその不要行以外を取り出します。

/etc/passwd /etc/aliases /etc/postfix/virtual この3つのファイルから抽出したメールアドレス一覧が user01.dat に格納されているので、最後にアルファベット順に並べ替えて、もし同じメールアドレスがあれば、重複を削除し、column -t で見栄えを良くして user02.dat に結果を書き込みます。

こういうちょっとしたテキスト編集には、awksed がとても便利です。

出来上がったメールアドレス一覧 user02.dat を、フロントにある(MX に登録されている)メールサーバにセットし、main.cf に下記設定を追加します。

unknown_relay_recipient_reject_code = 550
relay_recipient_maps = hash:/etc/postfix/user02.dat

postmap で、 user02.dat のハッシュファイルを作成後、postfix をリスタートします。

postmap /etc/postfix/user02.dat

主メールサーバに登録されていないアカウントへメールが送られてくると、MX で指定されているサーバは user unknown で、そのメールを弾いてくれます。

 管理サーバから各メールサーバへ一括変更

例として、フロントに MX サーバを2台(mx1-server, mx2-server)、アカウントを持っている主メールサーバを main-server とします。

ここでは、管理用サーバから、MX サーバへファイルをコピーする前に、これは使わないというか弾いてもよいメールアドレスを複数 deladdr.dat に登録しておき、sed -f で一括削除しています。
sed -i”.bak” で、作業前にバックアップファイルを .bak という拡張子で自動作成してくれます( -i と “.bak” の間はスペース(空白)は無し!! ご注意を…)。
※メールアドレス一覧 user02.dat から、postmap で ハッシュファイル(user02.dat.db)を作成します。
※管理用サーバから、MX サーバや主メールサーバへは、公開鍵を使って root でSSH接続できるようにしておきます。

作業に必要なファイルを管理サーバへ全てコピーするのは、ちょっと嫌だったので、上記の makeuser というスクリプトは主メールサーバに置いておき、管理サーバからはスクリプトの起動と、出来上がったファイルのダウンロード、それから各 MX サーバ へ転送後、ハッシュ化& postfix のリロードという手順にしました。
※sleep 2 は、無くても大丈夫だと思いますが、なんとなく待ってみましたww

deladdr.dat の内容(例) ※ここは、環境に合わせて適時変更してください。

 検証環境

Debian 10 「buster」  4.19.0-17-amd64
postfix 3.4.14-0+deb10u1