329 | | # SASL 関連の設定; SSL 証明書を取得するまでコメントアウト |
330 | | #smtpd_sasl_auth_enable = yes |
331 | | #smtpd_sasl_security_options = noanonymous, noplaintext |
332 | | #smtpd_sasl_local_domain = $myhostname |
333 | | #smtpd_tls_cert_file = /etc/httpd/conf/developer_harapeko_jp.crt |
334 | | #smtpd_tls_key_file = /etc/httpd/conf/developer.harapeko.jp.key.pk |
335 | | #smtpd_tls_CApath = /etc/httpd/conf/ |
336 | | #smtpd_use_tls = yes |
337 | | #smtpd_tls_auth_only = yes |
338 | | #smtpd_tls_session_cache_timeout = 3600s |
339 | | #smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination |
340 | | |
1058 | | SSL が使えるようになったので、 POP3S と Submission over SMTP-AUTH の設定をして、メールが利用できるようにする。 |
| 1035 | SSL が使えるようになったので、 POP3S と Submission over SSL/TLS の設定をして、メールが利用できるようにする。 |
| 1036 | |
| 1037 | === メールユーザー DB を構築 === |
| 1038 | |
| 1039 | 弊社メールサーバーの動作用件は以下の通り。 |
| 1040 | |
| 1041 | * クライアントとの接続プロトコルは POP3S と Submission over SSL/TLS を用いる。 POP3 は使わない。 |
| 1042 | * 25番ポート (SMTP) はメール配送用に開けておく必要がある。 |
| 1043 | * Linux アカウントのパスワードと同じパスワードを使わせたくない。 |
| 1044 | * 受信/送信の両方で同一のパスワードとして管理したい。 |
| 1045 | |
| 1046 | POP3S の認証は dovecot にて、 Submission over SSL/TLS の認証は cyrus-SASL にて行う。この場合、 |
| 1047 | |
| 1048 | * cyrus-SASL では /etc/shadow や PAM を参照する saslauthd ではなく、 auxprop を用いる。 auxprop がサポートしている参照先は以下のいずれかである。 |
| 1049 | * sasldb (cyus-SASL 独自形式の DB; 解説をもっともよく見かける) |
| 1050 | * DBMS (MySQL/PostgleSQL/SQLite) |
| 1051 | * LDAP |
| 1052 | * 上記のうち、 sasldb は dovecot が理解できず、双方で同一のパスワードを管理できなくなってしまうので、NG。 |
| 1053 | * 別にアプリケーション間で共通のパスワードを一元管理したいわけでもないので、わざわざ LDAP 使う必要もないかな。 |
| 1054 | |
| 1055 | というわけで、せっかく MySQL も入れてあるし、 MySQL でメールユーザー DB を構築することにしてみた。 |
| 1056 | |
| 1057 | なお、 dovecot はメール配送時のユーザー情報参照にもこの DB を利用することになる為、その内容はユーザー ID とパスワードの他、メールサーバーのドメイン名、ホームディレクトリ、UID、GID も必要になる。この辺の情報については dovecot をインストール後、 /usr/share/doc/dovecot-x.x.x/wiki/AuthDatabase.SQL.txt ファイルを参照のこと。 |
| 1058 | |
| 1059 | 1. DB を作成。 DB 名、 DB ユーザー名共に mailusers とした。 |
| 1060 | {{{ |
| 1061 | $ mysql -u root -p |
| 1062 | |
| 1063 | mysql> create database mailusers; |
| 1064 | mysql> mysql> grant all privileges on mailusers.* to mailusers@localhost identified by 'パスワード'; |
| 1065 | mysql> use mailusers; |
| 1066 | mysql> create table users ( |
| 1067 | -> userid varchar(128) primary key, |
| 1068 | -> domain varchar(128), |
| 1069 | -> plain_passwd varchar(64), |
| 1070 | -> home varchar(255) not null, |
| 1071 | -> uid integer not null, |
| 1072 | -> gid integer not null |
| 1073 | -> ); |
| 1074 | mysql> quit |
| 1075 | }}} |
| 1076 | * ドメイン名とパスワードは NULL 可とした。メール配送は受け付けるが転送するだけで認証することのないアカウント (root, admin など) もある為。 |
| 1077 | 1. mailusers でのアクセス確認を兼ねて、テーブルにさしあたって必要なメール用のアカウントをいくつか登録してみる。 |
| 1078 | {{{ |
| 1079 | $ mysql -u mailusers -p mailusers |
| 1080 | |
| 1081 | mysql> insert users values |
| 1082 | -> ('toshiyuki.murayama', 'developer.harapeko.jp', 'パスワード', '/home/toshiyuki.murayama', 502, 502), |
| 1083 | -> ('root', null, null, '/root', 0, 0), |
| 1084 | -> ('admin', null, null, '/home/admin', 503, 503); |
| 1085 | mysql> quit |
| 1086 | }}} |
| 1087 | * ホームディレクトリや UID, GID は事前に /etc/passwd を参照して確認しておくこと。 |
| 1088 | * パスワードは、危険だが平文で保存する。ちなみに dovecot は MD5 ハッシュ、 cyrus-SASL は平文を要求する… cyrus も MD5 に対応してくれよ… orz |
| 1089 | * もちろんパスワードは Linux アカウントのパスワードと同じである必要はない。むしろセキュリティリスクを抑える為にも、別々のパスワードを設定すべきである。 |
1087 | | # MD5 ダイジェスト認証および CRAM-MD5 に対応する。 |
1088 | | mechanisms = digest-md5 cram-md5 |
1089 | | |
1090 | | }}} |
1091 | | 1. /usr/lib/sasl2/smtpd.conf を作成する。 |
1092 | | {{{ |
1093 | | $ vim /usr/lib/sasl2/smtpd.conf |
| 1115 | # 平文認証、ログイン認証、MD5 ダイジェスト認証、CRAM-MD5 に対応する。 |
| 1116 | mechanisms = plain login digest-md5 cram-md5 |
| 1117 | |
| 1118 | # 認証に PAM は使わないので、コメントアウト |
| 1119 | #passdb pam { |
| 1120 | # (中略) |
| 1121 | #} |
| 1122 | |
| 1123 | # 認証に DBMS を利用する |
| 1124 | passdb sql { |
| 1125 | # DBMS への接続方法を記した設定ファイルのパス。あとで作成 |
| 1126 | args = /etc/dovecot-sql.conf |
| 1127 | } |
| 1128 | |
| 1129 | # ユーザー情報も DB を参照するようにする。コメントアウト |
| 1130 | #userdb passwd { |
| 1131 | # (中略) |
| 1132 | #} |
| 1133 | |
| 1134 | # ユーザー情報を DBMS にて参照する。 |
| 1135 | userdb sql { |
| 1136 | args = /etc/dovecot-sql.conf |
| 1137 | } |
| 1138 | |
| 1139 | # MySQL には root でなくてもアクセスできるので、以下はコメントアウト。 |
| 1140 | #user = root |
| 1141 | } |
| 1142 | }}} |
| 1143 | 1. DBMS への接続方法を示す設定ファイルを作成する。 |
| 1144 | {{{ |
| 1145 | $ sudo vim /etc/dovecot-sql.conf |
| 1146 | |
| 1147 | # MySQL を使用する。 |
| 1148 | driver = mysql |
| 1149 | # 接続情報 (ホスト名、DB 名、DB ユーザーの ID/パスワード) |
| 1150 | connect = host=localhost dbname=mailusers user=mailusers password=パスワード |
| 1151 | # 認証の際のクエリー SQL - パスワードは MD5 ハッシュを要求するので、 MD5() 関数を噛ませる |
| 1152 | password_query = select concat(userid, '@', domain) as user, md5(plain_passwd) as password from users where userid = '%n' |
| 1153 | # ユーザー情報を参照する際のクエリー SQL |
| 1154 | user_query = select home, uid, gid from users where userid = '%u' |
| 1155 | |
| 1156 | $ sudo chmod 600 /etc/dovecot-sql.conf # DB ユーザーのパスワードを知られてはマズイので、権限を変更しておく |
| 1157 | }}} |
| 1158 | 1. dovecot を起動し、デフォルトで起動するようにする。 |
| 1159 | {{{ |
| 1160 | $ sudo /etc/init.d/dovecot start |
| 1161 | $ sudo /sbin/chkconfig --add dovecot |
| 1162 | }}} |
| 1163 | |
| 1164 | === Submission over SSL/TLS の設定 === |
| 1165 | |
| 1166 | 1. cyrus-SASL と、それ用の MD5 認証用プラグインと SQL auxprop プラグインをインストールする。 |
| 1167 | {{{ |
| 1168 | $ sudo yum install cyrus-sasl cyrus-sasl-md5 cyrus-sasl-sql |
| 1169 | }}} |
| 1170 | 1. cyrus-SASL の設定。設定方法は[http://www.postfix.org/SASL_README.html#auxprop_sql ここ]を参考にした。 |
| 1171 | {{{ |
| 1172 | $ vim /etc/sasl2/smtpd.conf |
1096 | | auxprop_plugin: sasldb |
1097 | | mech_list: cram-md5 digest-md5 |
1098 | | }}} |
| 1175 | auxprop_plugin: sql |
| 1176 | mech_list: cram-md5 digest-md5 plain login |
| 1177 | sql_engine: mysql |
| 1178 | sql_hostnames: localhost |
| 1179 | sql_user: mailusers |
| 1180 | sql_passwd: パスワード |
| 1181 | sql_database: mailusers |
| 1182 | sql_select: select plain_passwd as password from users where userid = '%u' |
| 1183 | |
| 1184 | $ sudo chmod 600 /etc/sasl2/smtpd.conf # DB ユーザーのパスワードを知られてはマズイので、権限を変更しておく |
| 1185 | $ rm -f /usr/lib64/sasl2/smtpd.conf /usr/lib64/sasl/smtpd.conf # この辺のファイルが残っていると悪さをするので消しておく |
| 1186 | }}} |
| 1187 | * '''最後のファイル削除は超重要'''。これで何時間嵌ったことか…。orz |
| 1188 | 1. Postfix の設定に、 SASL 関連の設定と、サブミッションポートの設定を追加する。 main.cf の設定パラメータについては[http://www.postfix-jp.info/trans-2.2/jhtml/postconf.5.html こちら]を参照。 |
| 1189 | {{{ |
| 1190 | $ sudo vim /etc/postfix/main.cf |
| 1191 | |
| 1192 | # SMTP の SASL による認証を有効にする |
| 1193 | smtpd_sasl_auth_enable = yes |
| 1194 | # 匿名での利用、および平文認証を禁止する |
| 1195 | smtpd_sasl_security_options = noanonymous, noplaintext |
| 1196 | # realm の名前。ホスト名にしておく |
| 1197 | smtpd_sasl_local_domain = $myhostname |
| 1198 | # SSL 証明書および秘密鍵ファイル |
| 1199 | smtpd_tls_cert_file = /etc/httpd/conf/ssl/developer.harapeko.jp.crt |
| 1200 | smtpd_tls_key_file = /etc/httpd/conf/ssl/developer.harapeko.jp.key |
| 1201 | # STARTTLS サポートをクライアントに通知する |
| 1202 | smtpd_use_tls = yes |
| 1203 | # TLS 暗号化されていない接続を受け付けない |
| 1204 | smtpd_tls_auth_only = yes |
| 1205 | # SASL 認証に成功した場合のみ、 SMTP によるメールの配送 (RCPT TO コマンド) を受け付けるようにする |
| 1206 | # (この順番で書くことにより、サーバー上で sendmail コマンドを用いる場合 (Web アプリからのメール発送等) |
| 1207 | # には SASL 認証が不要になる) |
| 1208 | smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination |
| 1209 | |
| 1210 | $ sudo vim /etc/postfix/master.cf |
| 1211 | |
| 1212 | # サブミッションポートを有効にする |
| 1213 | submission inet n - n - - smtpd |
| 1214 | -o smtpd_sasl_auth_enable=yes |
| 1215 | }}} |
| 1216 | 1. Postfix を再起動する。 |
| 1217 | {{{ |
| 1218 | $ sudo /etc/init.d/postfix restart |
| 1219 | }}} |