2021/09/18 CentOS7.4





特定アドレスからのみ添付ファイルの送信を許可するメールサーバ

Postfixで、送信元のアドレスによりネスクトホップサーバを振り分けるメールサーバです。

別項の「添付ファイルの送信を遮断するメールサーバ」ではできなかった、送信元アドレスにより添付ファイル遮断メールサーバをバイパスする用途で構成します。



メールの送信元アドレスにより、ネスクトホップを「添付ファイルを遮断するメールサーバ」か「添付ファイルを遮断しないメールサーバ」かを振り分けます。

別に添付ファイルは関係なく、単に送信元アドレスでネクストホップを振り分けたい場合でも参考になると思います。

送信元アドレスによって添付ファイル遮断メールサーバをバイパスする
メールの配送を構成する
マルチインスタンスにし、添付ファイルを遮断する子Postfixを構成する
sender_dependent_default_transport_mapsで「全て」の指定が動作しない





送信元アドレスによって添付ファイル遮断メールサーバをバイパスする

添付ファイルを遮断するメールサーバを用意したものの、「特定のアドレスからのみ添付ファイル送信を許可したい」という要望は出てきそうです。
少なくとも対応はできるようにしておいたほうがいいでしょう。

しかし別項の「添付ファイル付きメールを遮断するメールサーバ」で説明した通り、header_checksでは送信元アドレスと添付ファイル有無の2つの条件を組み合わせることが出来ません。

そこで添付ファイルを遮断するメールサーバの手前で、送信元を条件に宛先メールサーバを振り分けるよう構成すれば、この問題は解決できます。
使用するパラメータは「sender_dependent_default_transport_maps」です。
Postifx2.7以降で使用可能です。

メインメールサーバへ「sender_dependent_default_transport_maps」を設定する案が考えられます。

しかしこれでは、メインメールサーバにややこしい設定を追加することになります。
メールサーバのOSやソフトウェアが変わったりすると、機能維持が面倒になります。


なので、別メールサーバを構築し、その中で振り分けと添付ファイル遮断を行わせればシンプルになります。


Postfixをマルチインスタンスで構成すれば、用意するサーバを1台すみます。
親Postfixは送信元アドレスによるメールサーバを振り分け、子Postfixが添付ファイルを遮断する機能を持ちます。
(Postfixのマルチインスタンスについては「Postfixをマルチインスタンスで構成する」を参照してください)







メールの配送を構成する






1.Postfixのメールリレーのため基本構成をする
 メールを中継する設定です。すでに構成されているメールサーバなら、不要です。
 ここではメインメールサーバからだけメールを受け付けるつもりなので、mynetworksはメインメールサーバのアドレスを指定してます。
#vi /etc/postfix/main.cf

変更
myhostname = mail-x.example.com
inet_interface = all
mynetworks = 192.168.1.100
relayhost = [localhost]:10025
relayhostはいわばトラブル回避のために設定してあります。詳細は後述。


2.配送ファイルを記述する
 transportファイルとsender_dependent_default_transport_mapsの2つを記述します。

 まずtransportファイルで、全ての宛先はローカルホストの子Postfixへ転送するよう記述します。
#vi transport

追加
*                   smtp:[localhost]:10025

 次に、sender_dependent_default_transport_mapsを記述します。
 transportファイルと文法は同じです。(使用できるアクションが異なりますが今回は関係ありません)
#vi sender_dependent_default_transport_maps

追加
admin@example.com   smtp:[172.16.1.100]:25
system@example.com  smtp:[172.16.1.100]:25
adminとsystemからのメールは子Postfixではなく、直接上位メールサーバへ転送するよう記述します。
transportとsender_dependent_default_transport_mapsの2つを組み合わせることで
「全体の送信は子Postfixへ転送」「そのうち指定された送信元のみ直接転送」という構成になります。


なお注意点として、以下のような記述は意図した通りには動作しませんでした。(解説は後述
#main.cfにtransport指定がなく、relayhostがある場合

sender_dependent_default_transport_mapsファイル

admin@example.com   smtp:[172.16.1.100]:25  (機能する)
system@example.com  smtp:[172.16.1.100]:25  (機能する)
*                   smtp:[localhost]:10025 (ここが機能しない)


3.ハッシュを生成
 transport と sender_dependent_default_transport_mapsをハッシュします。
#postmap transport
#postmap sender_dependent_default_transport_maps


4.sender_dependent_default_transport_mapsを指定する
 main.cfを編集しtransport_mapsと、sender_dependent_default_transport_maps ファイルを指定します。
#vi main.cf

追加
transport_maps = hash:/etc/postfix/transport

sender_dependent_default_transport_maps =
  hash:/etc/postfix/sender_dependent_default_transport_maps



5.Postfixをリロード
 最後にリロードして、main.cfの変更とmapファイルを読み込みます。
#systemctl reload postfix

といっても、この時点では転送先である子Postfixが構成されていませんので、正常には動作しません。
ちなみにpostmapした後は、確実にリロードしたほうがいいです。理由は、マップファイルが自動読み込みされているかいないかで動作が変わってしまい、試験にならないからです。






マルチインスタンスにし、添付ファイルを遮断する子Postfixを構成する




1.SELinuxの無効化
 一応SELinuxを無効化しておきます。
#setenforce 0

#vi /etc/selinux/config

変更
SELINUX=disabled


2.Postfixをマルチインスタンス構成にする
 コマンドを実行すると、マルチインスタンスのコンフィグを追加してくれます。
 続けて子Postfixの名前を定義します。ディレクトリ名であり、インスタンス名になります。
#postmulti -e init
#postmulti -I postfix-attachreject -e create


3.子Postfixの設定ファイルを編集
 このメールサーバ自体は、内部から外部への通過用でなので、とりあえずリレー先に上位メールサーバを指定しておきます。
 それから、事故防止のためのサービス起動禁止をコメントアウトしておきます。
#vi /etc/postfix-attachreject/main.cf

relayhost = [172.16.1.100]:25

コメントアウト
# master_service_disable = inet

#vi /etc/postfix-attachreject/master.cf

コメントアウト
#smtp  inet  n  -  n  -  -  smptd
追加
10025  inet  n  -  n  -  -  smptd

 子Postfixのポート番号を指定します。25番と被らないため10025としました。バインドもlocalhostのみです。
 既存の設定をコメントアウトし、10025ポートの設定を追加します。



4.子Postfixを有効化
#postmulti -i postfix-attachreject -e enable

main.cfに「multi_instance_enable = yes」が追加され、起動可能となります。



5.子Postfixの起動試験
#postmulti -i postfix-attachreject -p start
#postmulti -i postfix-attachreject -p status
#netstat -ant
ポート10025番で起動していることを確認します。



6.子Postfixに添付ファイル遮断の設定を加える
#vi /etc/postfix-attachreject/header_checks

追加
/name=.*/ REJECT



7.header_checksを有効にする
 main.cfを編集してheader_checksを指定します。
#vi /etc/postfix-attachreject/main.cf

追加
header_checks = regexp:/etc/postfix-attachreject/header_checks



8.Postfixをリロードする
#systemctl reload postfix


9.動作試験
 一般のアドレスからの添付メール送信が遮断されること。
 特定のアドレスからはメールが直接上位メールサーバへ転送されることを確認します。






sender_dependent_default_transport_mapsで「全て」の指定が動作しない


sender_dependent_default_mapsで、アスタリスクを使っての転送先の指定は機能しませんでした。
#main.cfにtransport指定がなく、relayhostがある場合

sender_dependent_default_transport_mapsファイル

admin@example.com   smtp:[172.16.1.100]:25  (機能する)
system@example.com  smtp:[172.16.1.100]:25  (機能する)
*                   smtp:[localhost]:10025 (ここが機能しない)
main.cfでtransporが指定されていない場合、sender_dependent_default_transport_maspの
「*  smtp:[localhost]:10025」は評価されず、main.cfのrelayhostに従いました。

Postfixの本家マニュアルを読んでも、
transportrelayhostを上書きする」
sender_dependent_default_transport_mapstransportを上書きする」
sender_dependent_relayhost_mapsrelayhostを上書きする」
と記載がありますが、
sender_dependent_default_transport_mapsrelayhostを上書きする」
という記述は見つけられませんでした。

とにかく運用中に、優先順位によって問題が複雑化しないよう、今回は
transportファイルとsender_dependent_default_transport_mapsで問題解決を図りました。







prev.gif