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 ファイルを作成する。

/etc/dovecot/auth.d/socket.auth
# It's possible to export the authentication interface to other programs:
socket listen {
  client {
    # The client socket is generally safe to export to everyone. Typical use
    # is to export it to your SMTP server so it can do SMTP AUTH lookups
    # using it.
    path = /var/spool/postfix/var/run/dovecot/auth-client
    mode = 0660
    # Default user/group is the one who started dovecot-auth (root)
    #user =
    group = dovecot
  }
}

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

auth default {
  socket listen {
    client {
      path = /var/spool/postfix/var/run/dovecot/auth-client
      mode = 0660
      #user =
      group = 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 ファイルを作成したら、sudo service dovecot reload コマンドを実行して、作成した設定を Dovecot に読み込ませる。
念のために path エントリで指定した /var/spool/postfix/var/run/dovecot/auth-client ソケットが作成されていることを確認しておこう。
ls -l /var/spool/postfix/var/run/dovecot/auth-client コマンドを実行して、以下のような結果が表示されればいい。

srw-rw---- 1 root dovecot 0 2010-07-30 18:11 /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 を SMTP 認証に対応させたときの /etc/postfix/main.cf ファイルの内容を以下に挙げる。

/etc/postfix/main.cf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#  See /usr/share/postfix/main.cf.dist for a commented, more complete version


# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = /var/run/dovecot/auth-client
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_client = yes

smtpd_recipient_restrictions =
        permit_mynetworks
        permit_sasl_authenticated
        reject_unauth_destination

myhostname = ******.example.jp
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = $myhostname localhost.$mydomain localhost
#relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +

virtual_minimum_uid = 8
virtual_uid_maps = static:8
virtual_gid_maps = static:8
virtual_mailbox_base = /var/spool/mail/
virtual_mailbox_domains = proxy:mysql:$config_directory/virtual_domains.cf
virtual_mailbox_maps =
        proxy:mysql:$config_directory/virtual_mailbox.cf
        proxy:mysql:$config_directory/virtual_alias_domain_mailbox.cf
virtual_alias_maps =
        proxy:mysql:$config_directory/virtual_alias.cf
        proxy:mysql:$config_directory/virtual_alias_domain.cf
        proxy:mysql:$config_directory/virtual_alias_domain_catchall.cf

inet_interfaces = ALL

local_recipient_maps = $alias_maps

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 の設定を変更する予定だ。

関連する記事 (Related posts):

  1. CentOS 5.6 をメールサーバーに (Postfix で SMTP-auth)
  2. ubuntu 10.04 をメールサーバーに (Postfix と PostfixAdmin の連携)
  3. ubuntu 10.04 をメールサーバーに (ウィルスチェック)
  4. ubuntu 10.04 をメールサーバーに (Dovecot 編)
  5. ubuntu 10.04 をメールサーバーに (序説)

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

Leave a Reply

  

  

  

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <img localsrc="" alt="">