このドキュメントはドラフト版です。予告無く内容が修正されたり、内容が間違っていたりすることがあります。
また、間違い箇所を見つけたら、ご連絡いただけると幸いです。
今回は、主にPostfix側の設定を行います。
| ホスト名 | root.aineas.net |
| ホスト名 | ldapserver.aineas.net |
| ポート番号 | 389(STARTTLS対応), 636(LDAPS) |
| ホスト名(本体名) | mailserver.aineas.net |
| バーチャルドメイン名 | mail2.aineas.net |
| ポート番号 | 25(STARTTLS対応), 465(SMTPS) |
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で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で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を運用するメールサーバにコピーします。
コピーするファイルは、以下のものです。
これを、メールサーバの同じディレクトリに格納してください。(メールサーバにOpenSSLがインストールされているならば、このディレクトリは最初から作成されているはずです。)
秘密鍵は一般ユーザから読み取りできないようパーミッションを適切に設定してください。
Postfix用の証明書ができたら、メールサーバ側の作業に入ります。
uidとgidが共に10001(空いていなければ別のIDで)のmanagerというユーザーを作成してください(このmanagerも名前は何でも良いです)。このユーザー権限でVirtualドメインのメールボックスが管理されます。
Exec
# groupadd -g 10001 manager # useradd -u 10001 -g 10001 -d /home/manager manager
次に/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認証の設定を記述します。これは一般的な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を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の最後尾に、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_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
パラメータの意味は、以下のようになります。
virtual_mailbox_domainsの設定に限り、TLS関係の指定が無くとも、ldapsで、LDAPサーバへ問い合わせができています。なぜ証明書の指定がなくても動作してるのでしょう?ご存知の方がいらっしゃったら、どなたか教えてください。
ldap_virtual_mailbox_maps.cf、ldap_virtual_alias_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
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
Postfixを起動します。
# /etc/init.d/postfix start
メールクライアントを使って、メールの配送テストを行ってください。
ここで、STARTTLSとSMTPSの対応状況を確認するため、複数のメールクライアントで試した方が吉です。
Return to OpenLDAP活用術