ubuntu 10.04 をメールサーバーに (Postfix で SMTP 認証)

Postfix と PostfixAdmin の連携」で書いたように、ubuntu 10.04 LTS Server Editon にインストールした Postfix を、外部からのメールを受信して保存できるように設定した。
また、外部宛てのメールの配送もできるようにした。
しかし外部に宛ててメールを送ることができるのは、メールサーバー自身から送信した場合に限られる。
これは Postfix の規定の動作がそうなっているからが、実際に運用する際にこのままでは不便なことこの上ない。
そこで Postfix を SMTP 認証に対応させることで、SMTP 認証で承認された PC からの接続であれば、どこ宛てのメールでも受け取れるようにする。

Postfix で SMTP 認証を使うには、何らかの SASL ライブラリが必要になるが、先の記事 (「Dovecot 編」) で Dovecot をインストールしたので、Dovocot の SASL ライブラリを使うことにする。

まずは Postfix から Dovecot に接続するための受け口を Dovecot 側に用意するため、以下の内容で /etc/dovecot/auth.d/socket.auth ファイルを作成する。

Dovecot 編」でも書いたが、/etc/dovecot/auth.d ディレクトリにある拡張子が .auth のファイルの内容は、auth セクションのサブセクションになるので、このファイルに書いた内容は、Dovecot では以下の様に解釈される。

auth セクションの soket サブセクションの client サブセクションにある path エントリには、Dovicot の SASL ライブラリの受け口になる UNIX ソケットのパスを指定する。
ubuntu の場合、/var/spool/run ディレクトリに、UNIX ソケットを提供するアプリケーションの名前のディレクトリを作り、そこに UNIX ソケットは作成するのが一般的な作法だ。
しかし、Postfix が Dovecot が提供する UNIX ソケットを利用するとき、Postfix は chroot 環境下で動作しているために、一般的な作法に則った位置に UNIX ソケットを作成してしまうと、それを利用できなくなる。
このため Dovecot の UNIX ソケットは、chroot した Postfix からでもアクセスできるように /var/pool/postfix ディレクトリの下に作成しなくてはならない。
/var/pool/postfix ディレクトリは Postfix が chroot したときにルートディレクトリになる位置であり、これは postconf -d queue_directory コマンドを実行すれば分かる。

auth セクションの soket サブセクションの client サブセクションにある mode エントリには、path エントリで指定した UNIX ソケットを作成するときのアクセス権を指定する。
ここに指定する値は、chmod コマンドを数値モードで実行するときの指定する値と同じ意味を持つ。
'660' だと UNIX ソケットのユーザーとグループに読み込み、および書き込みを許可することになる。

次の user エントリ (コメントアウトしている) と group エントリは、UNIX ソケットを作成するときのユーザーとグループだ。
これらを省略したときは、Dovecot を実行したユーザーとグループ、つまり ubuntu の場合は root ユーザーと root グループになる。
ここでは group エントリを 'dovecot' にしているので、root ユーザーと dovecot グループで UNIX ソケットが作成される。

/etc/dovecot/auth.d/socket.auth ファイルを作成したら、path エントリに指定したパスを作成するために sudo mkdir -p /var/spool/postfix/var/run/dovecot コマンドを実行する。
その後に sudo service dovecot reload コマンドを実行して、作成した設定を Dovecot に読み込ませる。
念のために path エントリで指定した /var/spool/postfix/var/run/dovecot/auth-client ソケットが作成されていることを確認しておこう。
ls -l /var/spool/postfix/var/run/dovecot/auth-client コマンドを実行して、以下のような結果が表示されればいい。

ここに表示される日付と時刻は、 sudo service dovecot reload コマンドを実行して、Dovecot に設定を読み込ませた日時。

Dovecot 側の準備ができたので、続いて Postfix の設定を行う。

まずは、Postfix が Dovecot が提供する UNIX ソケットにアクセスできるように、Postfix のプログラムが動いているユーザーアカウントを、適切なグループに所属させる。
先に実行した ls -l /var/spool/postfix/var/run/dovecot/auth-client コマンドの結果を見て分かるように、/var/spool/postfix/var/run/dovecot/auth-client ファイルのアクセス権は、root ユーザーと dovecot グループに対して読み書きが許可されている。
Postfix のプログラムは postfix ユーザーで動いているので、これを dovecot グループに所属させればいいことが分かる。
これをするために sudo usermod --groups $(echo $(/usr/bin/awk -F ':' '$4 ~ "^postfix$" {print $1}' /etc/group) dovecot | /bin/sed 's/[[:space:]]/,/g' -) postfix コマンドを実行する

続いて /etc/postfix/main.cf ファイルの内容を以下に挙げる。

Postfix と PostfixAdmin の連携」のときの設定に、30 行目から 34 行目までの 5 行と、36 行目から 39 行目までの 4 行を追加した。
なお、前半の 30 行目からの 5 行だけが Postfix で SMTP 認証を有効にするための設定で、後半の 36 行目からの 4 行が無くても SMTP 認証は正常に機能する。

30 行目の smtpd_sasl_auth_enable エントリには、Postifx で SMTP 認証を有効にするか否かを指定する。
ここには、当然ながら 'yes' を指定する。
なお、この smtpd_sasl_auth_enable エントリを 'yes' にしたときは、その他の SMTP 認証関連のパラメーターが正しく設定されていなければならないのは、言うまでもない。

31 行目の smtpd_sasl_type エントリには、Postfix が使用する SALS ライブラリの種類を指定する。
冒頭にも書いたように Dovecot の SASL ライブラリを使って SMTP 認証を実現するので、ここは 'dovecot' と指定する。

32 行目の smtpd_sasl_path エントリには、SASL ライブラリと通信するための UNIX ソケットのパスを指定する。
Dovicot が提供する SASL ライブラリの受け口になる UNIX ソケットのパスは、/etc/dovecot/auth.d/socket.auth ファイルの path エントリで指定した /var/spool/postfix/var/run/dovecot/auth-client だ。
しかしこれを利用する Postfix は、 postconf -d queue_directory コマンドで分かるように、/var/spool/postfix に chroot された状態で動作する。
このため smtpd_sasl_path エントリには、/var/spool/postfix/var/run/dovecot/auth-client の先頭の /var/spool/postfix を除いた、/var/run/dovecot/auth-client を指定する。

33 行目の smtpd_sasl_security_options エントリには、SASL ライブラリに渡すオプションを指定する。
ここでは 'noanonymous' を指定して明示的に匿名認証を無効にしているが、Dovecot の /etc/dovecot/auth.d/mechanisms.auth ファイルの中の mechanisms エントリに 'anonymous' が含まれていない (「Dovecot 編」参照) ので、この指定がなくても匿名認証が許可されることはない。
これを指定するのは、単に習慣だということと、Dovecot 側で mechanisms エントリに 'anonymous' を追加して匿名認証を許可したときでも、Postfix の SMTP 認証では匿名認証を許さないようにするという、二つの意味がある。

34 行目の broken_sasl_auth_client エントリは、Outlook Express Ver. 4 や Microsoft Express Server Ver. 5.0 のような、古い SMTP 認証の規格 (RFC 2554 -現時点での最新は RFC 2554-) にしか対応していない接続のための指定だ。
これらのソフトウェアを使っていないのであれば、broken_sasl_auth_client エントリを指定しなくても良い。

以上の 5 行 (broken_sasl_auth_client エントリを指定しなければ 4 行) を追加するだけで、Postfix が SMTP 認証に対応する。

ところで、SMTP 認証に対応させる以前の Postfix は、「Dovecot 編」の冒頭で指摘したように、Postfix がインストールされている PC 以外の PC から、PostfixAdmin で管理しているメールアドレス宛てのメール以外を送ると、エラーになる。
ここで main.cf ファイルに追加した 36 行目からの 4 行は、SMTP 認証で承認された PC からの接続であれば、どこ宛てへのメールでも受け取れるようにするため設定だ。

smtpd_recipient_restrictions エントリの初期値は smtpd_recipient_restrictions = permit_mynetworks reject_unauth_destination だ。
smtpd_recipient_restrictions エントリに指定する値の順序には意味があり、この順に値が評価される。
36 行目からの 4 行を見て分かるように、permit_mynetworks パラメーターと reject_unauth_destination パラメーターの間に、permit_sasl_authenticated パラメーターを追加しており、これによって Postfix は以下の順に受け付けたメールを判定して、処理するか否かを決定するようになる。

  • permit_mynetworks
    mynetworks エントリで指定したアドレス (127.0.0.0/8、[::ffff:127.0.0.0]/104、[::1]/128、これらは全て Postfix が動いている PC 自身) が送信したメールを全て処理
  • permit_sasl_authenticated
    上記以外から送信されたメールの内、SMTP 認証で承認された接続からのものを全て処理
  • reject_unauth_destination
    上記ふたつで処理されなかったメールの内、以下に挙げた以外が宛先になっているメールの処理を拒否
    • mydestination エントリに記されたドメイン
    • inet_interfaces エントリに記されたアドレス
    • proxy_interfaces エントリに記されたアドレス
    • virtual_alias_domains エントリに記されたアドレス、ドメイン
    • virtual_mailbox_domains エントリに記されたアドレス、ドメイン
    • relay_domains エントリに記されたアドレスおよびそのサブドメイン
    これらの宛先を纏めると、mydestination エントリに記されたドメインと PostfixAdmin で登録されたアドレス、ドメインになる。
  • パラメーターの最後が reject_unauth_destination なので、
    上記三つで処理された、または処理を拒否された残りのメールを全て処理

つまり、36 行目から 4 行に亘る smtpd_recipient_restrictions エントリの指定によって、この Postfix はPostfix が動いている PC 自身から送信されたメールと SMTP 認証で承認された接続で送信されたメールについては、どんな宛先であってもそれを処理し、それ以外のメールは PostfixAdmin で管理しているメールアドレス宛てのメールだけを処理するようになる。

最後に sudo service postfix reload コマンドを実行して、修正した /etc/postifx/main.cf ファイルを読み込ませる。
これでようやく、公開しても良いと思える状態のメールサーバーに仕上がった。

しかしこれでもまだ、出先のモバイル PC などからこのメールサーバーに接続してメールを送ろうとしたときに、接続できないというエラーになると思われる。
あるインターネット接続プロバイダーの管理している IP アドレスが割り当てられた PC が、別のインターネット接続プロバイダーの管理する IP アドレスを持つ PC などの 25 番の IP ポートに接続できないようにしていることが原因だ。
これは OP25B (Outbound Port 25 Blocking) といって、ほとんどのインターネット接続プロバイダーが採用している迷惑メールを送らせないようにする対策の一つだ。

次の記事ではこの OP25B を回避してメールを送信できるように、Postfix の設定を変更する予定だ。

2012.4 月 6 日追記
dovecot は 既存のディレクトリにしか unix ソケットを作成しないことに気付いたため、ディレクトリを予め作成する旨の手順を追加した。

関連記事

  • ubuntu 10.04 をメールサーバーに (序説)2010.7.5 (月) ubuntu 10.04 をメールサーバーに (序説) 6 月 1 日からサーバーのアップグレードに関する記事を書き始め、悠に一ヶ月が経った。 実際には 6 月 1 日の記事から 2 週間ほど試行錯誤をした後に、既にリプレースを完了している。 6 月 17 […]
  • CentOS 5.6 をメールサーバーに (Postfix で SMTP-auth)2011.7.15 (金) CentOS 5.6 をメールサーバーに (Postfix で SMTP-auth) 前々回の記事で Postfix を、前回の記事で Dovecot をインストール、設定した。 どちらも PostfixAdmin で MySQL サーバーのデータベースに保存したメール アカウントなどの情報を利用するようにしてある。 ここでは […]
  • ubuntu 10.04 をメールサーバーに (OP25B 対策)2010.8.9 (月) ubuntu 10.04 をメールサーバーに (OP25B 対策) 先の記事で Postfix を SMTP 認証に対応させた。 これによって、それまでは外部宛てのメールは Postfix を動かしている PC からだけしかできなかったのが、SMTP […]
  • ubuntu 10.04 をメールサーバーに (Dovecot 編)2010.8.2 (月) ubuntu 10.04 をメールサーバーに (Dovecot 編) 先に書いた「Postfix と PostfixAdmin の連携」で、PostfixAdmin で登録、管理するメールアカウントを Postfix からも利用できるようにした。 しかし実は「Postfix と PostfixAdmin […]

コメントを残す