OpenLDAP活用術

 このドキュメントはドラフト版です。予告無く内容が修正されたり、内容が間違っていたりすることがあります。
 また、間違い箇所を見つけたら、ご連絡いただけると幸いです。

 
 

PostfixでSMTP認証とVirtualドメイン(後編)

 今回は、主にPostfix側の設定を行います。

  • システム情報
    • 認証局サーバ
      ホスト名root.aineas.net
    • LDAPサーバ
      ホスト名ldapserver.aineas.net
      ポート番号389(STARTTLS対応), 636(LDAPS)
    • SMTPサーバ
      ホスト名(本体名)mailserver.aineas.net
      バーチャルドメイン名mail2.aineas.net
      ポート番号25(STARTTLS対応), 465(SMTPS)

Postfixのインストール

 Vineの場合、PostfixはデフォルトのMTAですので、Postfix本体は既にインストールされていることがほとんどではないかと思います。もしインストールされていないならインストールしてください。
 また、LDAPをサポートする為に、postfix-ldapパッケージもインストールしてください。

 今回のシステムでは、SMTP認証のパスワードが平文でネットワークを流れます。  これが、精神衛生上よろしくない! または、昨今のセキュリティ事情に配慮していない! と、考える人はけっこういらっしゃるのではないかと思います。
 そこで、PostfixでSSL/TLSを使用して通信経路そのものを暗号化することにします。
 これにより、SMTPサーバとメールクライアント間の通信が暗号化され、盗聴は困難になります。

 ちなみに、暗号化されるのは、あくまでもSMTPサーバとメールクライアント間だけですので、その先であるSMTPサーバ to SMTPサーバにおいてはメール内容の盗聴の危険性は付きまとうことになります。

 

インストール

 以下のパッケージをインストールします。
Exec

# apt-get install postfix
# apt-get install postfix-ldap
 

Postfix用証明書の作成

 PostfixでSSL/TSL通信を利用するために認証局で、証明書を生成します。

 今回、Postfix(Courier-imapも)を運用するメールサーバと、(CAを運用する)認証局サーバは、別々のノードでの運用を想定しています。
 その都合から、Postfix用の証明書の作成は認証局サーバ上で作成するという前提で、ここへの記述を行っています。
 ここで記述している証明書作成までの手順は、認証局サーバ上で行っていることに留意してください。

秘密鍵の生成

 Postfix用の秘密鍵を/usr/share/ssl/privateディレクトリに生成します。
 このとき、証明書作成用のパスフレーズを問われますので、好きなパスフレーズを入力してください(CAのパスフレーズとは別にした方が無難です)。
Exec

# cd /usr/share/ssl
# openssl genrsa -des3 -out /usr/share/ssl/private/mail.key 1024
Enter pass phrase for /usr/share/ssl/private/mail.key:←パスフレーズを入力
Verifying - Enter pass phrase for /usr/share/ssl/private/mail.key:←パスフレーズを再入力

 Postfix起動時に毎回パスフレーズを問われることを避ける為に、秘密鍵のパスフレーズを削除します。
Exec

# openssl rsa -in /usr/share/ssl/private/mail.key -out /usr/share/ssl/private/mail.key
Enter PEM pass phrase:←先ほど設定したパスフレーズを入力

 

証明書要求の生成

 CSRを生成します(ここでは有効期限2年間用を作成)
Exec

$ openssl req -new -days 730 -key /usr/share/ssl/private/mail.key -out /usr/share/ssl/certs/mail.csr

 証明書情報を入力します(環境によって異なります)。

情報
国名(Country Name)JP
都道府県(State or Province Name)Fukuoka
市区町村(Locality Name)Fukuoka
組織名(Organization Name)Aineas Net
部署名(Organizational Unit Name)users
ホストFQDN(Common Name)mailserver.aineas.net
メールアドレス(Email Address)なし
パスワード(challenge password)なし
企業名?(optional company name)なし

 

Country Name (2 letter code) [AU]:(JPを入力)
State or Province Name (full name) [Some-State]:(Fukuokaを入力)
Locality Name (eg, city) []:(Fukuokaを入力)
Organization Name (eg, company) [Internet Widgits Pty Ltd]:(Aineas Netを入力)
Organizational Unit Name (eg, section) []:(usersを入力)
Common Name (eg, YOUR name) []:(mailserver.aineas.netを入力)
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

   これでCSRの出来上がりです。

CAで署名する

 CAでCSRに署名し、証明書を作成します。
  Exec

# openssl ca -config openssl.cnf \
  -keyfile CA/private/cakey.pem \
  -cert CA/cacert.pem \
  -in /usr/share/ssl/certs/mail.csr \
  -out /usr/share/ssl/certs/mail.crt

Using configuration from /usr/share/ssl/openssl.cnf
Enter pass phrase for CA/private/cakey.pem: ←CAのパスフレーズを入力

Sign the certificate? [y/n]:y ←yを入力

1 out of 1 certificate requests certified, commit? [y/n]y ←yを入力
Write out database with 1 new entries
Data Base Updated

 これでPostfix用の証明書が完成しました。
 作成したmail.keyとmail.crtファイルを、Postifxを運用するメールサーバにコピーします。
 コピーするファイルは、以下のものです。

  • /usr/share/ssl/certs/mail.crt
  • /usr/share/ssl/private/mail.key

 これを、メールサーバの同じディレクトリに格納してください。(メールサーバにOpenSSLがインストールされているならば、このディレクトリは最初から作成されているはずです。)
 秘密鍵は一般ユーザから読み取りできないようパーミッションを適切に設定してください。

 

Postfixの設定

 Postfix用の証明書ができたら、メールサーバ側の作業に入ります。

Virtualドメイン用ユーザー作成

 uidとgidが共に10001(空いていなければ別のIDで)のmanagerというユーザーを作成してください(このmanagerも名前は何でも良いです)。このユーザー権限でVirtualドメインのメールボックスが管理されます。
Exec

# groupadd -g 10001 manager
# useradd -u 10001 -g 10001 -d /home/manager manager


main.cfの設定(基本編)

 次に/etc/postfix/main.cfファイルを編集します。ここでは変更か追加点のみ記述しますので他は環境に合わせてください。(ここに記述しているものはあくまでも例です)
 mynetworksにはループバックと自分のIPのみを指定。home_mailboxにはMaildir/を指定します。
 気をつけるべき点としては、バーチャルドメイン利用時は、これに使用するドメイン名/ホスト名をmydestinationに記述しないことです。
 これをやってしまうと、『warning: do not list domain …』とか『Host or domain name not found …』などとmaillogに出て正しく配送できません。仮にLinux側に同一名のユーザが存在した場合、このユーザ宛にlocal配送されてしまいます。

Edit

myhostname = mailserver.aineas.net
mydomain = aineas.net
myorigin = $myhostname
mydestination = $myhostname, localhost.$mydomain, localhost
mynetworks = 127.0.0.0/8, xxx.xxx.xxx.xxx/32
home_mailbox = Maildir/


 

main.cfの設定(SMTP認証編)

 main.cfの最後尾に、SMTP認証の設定を記述します。これは一般的なSMTP認証の設定と変わりませんので説明は省きます。
Edit

smtpd_sasl_auth_enable = yes
smtpd_helo_required = yes
smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname
smtpd_sasl_security_options = noanonymous
smtpd_recipient_restrictions = permit_mynetworks,
                               permit_auth_destination,
                               permit_sasl_authenticated,
                               reject
broken_sasl_auth_clients = yes


 バーチャルドメインの設定はまだ行っていませんが、この設定が完了した時点で問題を切り分ける為に一度配送テストを行った方が良いと思います。
 配送に構築中のSMTPサーバを使い、フリーアドレスでも何でも良いので、無関係なメールアドレスに対してメール送信を行います。

 テストにはTelnetを使う方法もありますが、私はSMTP認証対応のメールクライアントを利用しました。なぜなら、そっちが楽そうだからです。
 送信時に/var/log/maillogや、/var/log/ldap.logなどをみてLDAPの検索が行われているか確認してください。手順は次の通りです。

  • Postfixを再起動して設定を反映
  • メールクライアントの設定
    1. SMTPサーバに構築中のサーバを指定
    2. SMTP認証のユーザーIDにはLDAPサーバに登録してあるユーザーのUPNを指定
    3. SMTP認証のパスワードにはLDAPサーバに登録してあるユーザーのパスワードを指定
    4. 認証方式には、LOGINかPLAINを指定
  • フリーメールアドレスなどの構築中のメールサーバに関係ないメールアドレスへ配送テスト
  • 無事に送信出来ていればOK。その際ちゃんとLDAPエントリが検索されているか/var/log/ldap.logなどを参照してみる

     

main.cfとmaster.cfの設定(SSL/TLS編)

 PostfixをSSL/TLS対応にします。VineのPostfix RPMはSSL/TLSに対応しているようで、パッチを当ててリビルドする必要はありませんでした。設定を追加するだけでOKなようです。

 まずは、STARTTLSの設定をmain.cfに施します。
Edit

smtpd_tls_cert_file = /usr/share/ssl/certs/mail.crt
smtpd_tls_key_file = /usr/share/ssl/private/mail.key
smtpd_tls_session_cache_database = sdbm:/etc/postfix/smtpd_scache
smtpd_tls_session_cache_timeout = 3600s
smtpd_tls_loglevel = 1
smtpd_use_tls = yes

 簡単に説明します。

 (*)smtpd_tls_cert_fileには、先ほど作成したクライアント証明書を指定します。
 (*)smtpd_tls_key_file には、同様に秘密鍵を指定します。
 (*)smtpd_tls_session_cache_databaseには、TLSセッションキャッシュを保持するDBを指定します。
 (*)smtpd_tls_session_cache_timeoutには、TLSキャッシュを保持する時間を指定します。ここでは1時間(3600秒)となっています。
 (*)smtpd_tls_loglevelには、TLSに関するログ出力レベルを指定します。私はこの値を1としましたが、必要ないようなら0、もしくは記述自体を削除しても問題ありません。
 (*)smtpd_use_tls、この設定でyesを指定することでTLSを明示的に有効にします。

 古いメールクライアントの為に、SSLラッパーモードの設定を行います。これはmaster.cfに記述してください。
Edit

smtps    inet  n       -       n       -       -       smtpd
  -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes

 smtpsの行を見つけて、その行と次の行(つまり、smtpsとそのオプション全部)のコメントを外し、設定を有効化します。

 これでPostfixのSSL/TLS設定は終わりです。念のためここでPostfixを再起動してみて、 動作を確認してみてください。
 telnetでサーバのTCP25番ポートへアクセスして、『250-STARTTLS』の記述が出ていればSTARTTLSは成功していると思われます。
 SSLラッパーの方は、TCP465番がListenしていれば成功しているのではないでしょうか。
 確実な確認方法としてはやはりメールクライアントによるテストを行うのが良いかと思います。
 メールクライアントの設定方法は様々ですので、ここでは省略します。

 

main.cfの設定と付属ファイルの作成(Virtualdomain編)

 他ドメインへの配送テストがうまく行ったなら、次はmain.cfの最後尾に、Virutaldomainの設定を記述します。
 Virtualドメインの設定情報は付属のドキュメントであるVIRTUAL_READMEが詳しいと思います。PostfixのぺーじにはVIRTUAL_README日本語訳が掲載されていますのでこちらを参照すると良いでしょう。
 また、同様にLDAP_README日本語版もありますのでこちらもどうぞ。
Edit

virtual_transport = virtual
virtual_mailbox_base = /
virtual_uid_maps = static:10001
virtual_gid_maps = static:10001

virtual_mailbox_domains = ldap:/etc/postfix/ldap_virtual_mailbox_domains.cf
virtual_mailbox_maps = ldap:/etc/postfix/ldap_virtual_mailbox_maps.cf
virtual_alias_maps = ldap:/etc/postfix/ldap_virtual_alias_maps.cf
local_transport = local
local_recipient_maps = unix:passwd.byname, $alias_maps


 ポイントとなりそうなところを説明します。

  • virtual_uid_maps と virtual_gid_maps の値には Virtualメールボックスにメッセージを読み書きする権限を持つユーザーのIDを指定します。static の後にこれから作成するVirtualドメイン用のユーザーのUIDとGIDを指定してください。
  • virtual_mailbox_domains の記述(ldap: vmaildomains)はldapを使うことを明示した後、Virtual domainに関するファイルを指定します。ここで指定したファイルに記述されている内容がvirtual_mailbox_domainsの挙動を決定します。
  • 同様に、メールアドレスのマッピングとして virtual_mailbox_mapsを、メール転送用のマッピングとして virtual_alias_maps を使い、それぞれの設定ファイルを指定します。
  • aliasesファイルを利用したいのでローカル配送には local を使います。それに virtual ではメーリングリストのうまい運用方法を思いつきませんでした。
     
     今から設定するファイルの内容も含んでいますが、先に説明します。
     内容についての理解は、「たぶんこんな感じかな?」という程度です。
  1. まずメールが配送されてくると virtual_mailbox_domains で、そのメールのドメイン名が domain 属性の値にマッチしているか検索されます。
  2. 次に配送されるべきメールアドレスをvirtual_mailbox_maps で探し、そこでエントリが検索されれば、そのエントリの持つメール保存用ディレクトリ(mailDirの属性値)にメールを配送します。
  3. もし、エントリが見つからなければ、virtual_alias_maps が検索され、条件にマッチするエントリがあれば、mailForward の属性値であるメールアドレスへ配送されます。

ldap_virtual_mailbox_domains.cfの作成

 virtual_mailbox_domainsの設定ファイルとして、/etc/postfix/ldap_virtual_mailbox_domains.cfファイルを作成します。
Edit

server_host = ldaps://ldapserver.aineas.net/
version = 3
bind = no
search_base = ou=system,dc=aineas,dc=net
query_filter = (&(uid=manager)(domain=%s))
result_attribute = domain
tls_cert = /usr/share/ssl/certs/ldap.crt
tls_key = /usr/share/ssl/private/ldap.key
tls_cipher_suite = HIGH

 パラメータの意味は、以下のようになります。

  • server_host:LDAPサーバのホスト名です。ここではldapsを指定しています。
  • version:LDAPのバージョンです。PostfixでのLDAP SSL/TLSはバージョン3が必要です。
  • bind:バインドするか否かを設定します。今回必要になる属性はバインドせずとも取得可能ですのでバインドしません。
  • search_base: 検索ベースです。
  • query_filter: 検索条件です。%sにはドメイン名/ホスト名部分が代入されます。
  • result_attribute: 上記 query_filter の条件に合致したエントリが持つ、このresult_attributeが指定する属性の値が結果として返されます。
  • tls_cert: クライアントの証明書です。
  • tls_key: クライアントの秘密鍵です。
  • tls_cipher_suite: 暗号化方式の優先順位を指定します。暗号レベルでの指定も可能です。

 virtual_mailbox_domainsの設定に限り、TLS関係の指定が無くとも、ldapsで、LDAPサーバへ問い合わせができています。なぜ証明書の指定がなくても動作してるのでしょう?ご存知の方がいらっしゃったら、どなたか教えてください。

 ldap_virtual_mailbox_maps.cf、ldap_virtual_alias_maps.cfも基本的にこの設定を流用します。相違点のみ説明します。

 

ldap_virtual_mailbox_maps.cfの作成

 virtual_mailbox_mapsの設定ファイルとして、/etc/postfix/ldap_virtual_mailbox_maps.cfファイルを作成します。
Edit

server_host = ldaps://ldapserver.aineas.net/
version = 3
bind = no
search_base = ou=users,dc=aineas,dc=net
query_filter = (|(mail=%s)(mailAlias=%s))
result_attribute = mailDir
tls_cert = /usr/share/ssl/certs/ldap.crt
tls_key = /usr/share/ssl/private/ldap.key
tls_cipher_suite = HIGH
  • query_filter: 宛先メールアドレスが、mailかmailAliasにマッチしたエントリが検索されます。
  • result_attribute: メール保存ディレクトリのパスが返されます。
 

ldap_virtual_alias_maps.cfの作成

 virtual_alias_mapsの設定ファイルとして、/etc/postfix/ldap_virtual_alias_maps.cfファイルを作成します。これはメール転送用の設定です。
Edit

server_host = ldaps://ldapserver.aineas.net/
version = 3
bind = no
search_base = ou=users,dc=aineas,dc=net
query_filter = (|(mail=%s)(mailAlias=%s))
result_attribute = mailForward
tls_cert = /usr/share/ssl/certs/ldap.crt
tls_key = /usr/share/ssl/private/ldap.key
tls_cipher_suite = HIGH
  • query_filter:宛先メールアドレスが、mailかmailAliasにマッチしたエントリが検索されます。
  • result_attribute:メール転送先のアドレスが返されます。

Postfixの起動&テスト

 Postfixを起動します。

# /etc/init.d/postfix start

 メールクライアントを使って、メールの配送テストを行ってください。
 ここで、STARTTLSとSMTPSの対応状況を確認するため、複数のメールクライアントで試した方が吉です。

 次はOpenLDAP活用術 - IMAPサーバ構築です。

 

 

コメント:

コメントスパム対策中です。投稿の際はこのキャラクターが登場する映画シリーズを一緒に答えてください。
この質問は2009/01/07 10:26に締め切られます。 
 

Return to OpenLDAP活用術


トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-05-20 (日) 19:03:36 (597d)