当社はIT技術のオンライン教育を得意としたセミナー専門会社です。

ITエンジニアの技術力UPをお約束します。

Postfixのセキュリティ制限チェックよくある勘違いについて

postfixでメールのチェックする機能の一つに「SMTP アクセス制限リスト」がある。具体的には以下の設定のことを指している。

  • ・smtpd_client_restrictions
  • ・smtpd_helo_restrictions
  • ・smtpd_sender_restrictions
  • ・smtpd_recipient_restrictions
  • ・smtpd_data_restrictions
  • ・smtpd_end_of_data_restrictions
  • ・smtpd_etrn_restrictions

この中でもよく使われるのがsmtpd_recipient_restrictions、smtpd_client_restrictions、smtpd_sender_restrictionsのあたりだと思う。この違いが実は非常にわかりにくく多くの人が勘違いしてしまうポイントである。

簡単に言ってしまうと下記の表ような感じになる。telnetでsmtpプロトコルを叩いて操作できる人ならすぐ理解できると思う。

メールエンべロープという言葉はご存知でしょうか?電子メールは実在する郵便で言うところの封書の仕組みと同じです。封筒に書いてある住所、宛名が実際に送付される先であり、差出人も同様である。これが電子メールでは(MAIL FROM,RCPT TOの箇所)。一方封書の中に入っている手紙にも宛名、差出人が書かれているのが普通ですよね。これが電子メールのメールBODY直前に書いてある「From: To:」なのです。厳密には(dataコマンド直後はメールヘッダの最後の部分に追加される。改行のCR/LF以降がメールBODY)、現実の郵便封筒に書かれている宛名と中の手紙に書かれている宛名が違っても問題ありません。郵便配達は封筒の宛名を見て配送するので。電子メールも全く同様でメールヘッダの”FROM: TO:”は宛先参照ではエンベロープより優先順位が低いです。エンベロープに問題があったときや複数の宛先に送るとき等に参照されます。

smtpd_sender_restrictionsMAIL FROMコマンド時点で評価する。それまでのコネクションでわかっている情報を使い判断可能。
smtpd_recipient_restrictionsRCPT TOコマンド時点で評価する。それまでのコネクションでわかっている情報を使い判断可能。
smtpd_client_restrictionsSMTPプロトコル通信上においてメールサーバが(クライアントが送信するコマンド)受信する各コマンドを評価する。ある意味全体に渡ってチェックする制限。上記の2つのエンベロープチェックではMAIL FROM、RCPT TOの段階で即時振り落とす部分を行い、それ以外の制限チェック、フィルターはsmtpd_client_restrictionsで行うのがもっともわかりやすい記述方法です。

各設定で被ってしまう設定(同じことをする設定)がよくある。そしてcheck_sender_access、check_client_access、check_recipient_accessの使う場所を誤解してしまうケースがある。それは誤動作の原因となります。どういうことかといえばsmtpd_recipient_restrictionsだからチェックファイルに対する命令はcheck_recipient_accessしか使えないと思い込んでしまうことだ。これは間違いでなんでもありだ。要はどこでも使えるから、最初にきちんと設計する必要がある。smtpd_recipient_restrictionsでもちろんcheck_sender_accessはありです。つまりRCPTの段階でsender情報をチェックするという意味なのでRCPT TOに指定しているメールアドレスを必ずしもチェックするだけというわけではない。設計者にとってどのタイミングで行うか!?というのが合理的で評価するタイミングで情報が揃っていればどのように書いてもよいのである。それ故に大切なことはルールを配置する順番とタイミングがフィルターを正しく動かす根拠となるということを理解することです。