さくらVPSにメールの設定を行います。ポリシーとしては下記の項目を設定してみます。
- MTAはpostfiを使用
- imapはcourier-imapを使用
- メール送信にはsmtp認証を行う
- smtp認証 imap認証にはauthdaemondを使用
- smtp(STARTTLS)
- Submission(STARTTLS)
- smtps(SSL)
- imaps(SSL)
postfix courier-authlib courier-imapをインストール
portsを使ってさくっとインストール。
インストール
# cd /usr/ports/mail/postfix/stable # env FLAVOR="sasl2" make install # cd /usr/ports/mail/courier-authlib # env FLAVOR="no_ldap no_mysql no_pgsql" make install # pkg_add /usr/ports/packages/amd64/all/courier-authlib-userdb-0.63.0p3.tgz # cd /usr/ports/mail/courier-imap # env FLAVOR="no_trashquota" make install #
/etc/rc.conf.localの編集
/etc/rc.conf.localに下記の設定を追加
sendmail_flags=NO syslogd_flags="-a /var/spool/postfix/dev/log" postfix_flags="" saslauthd_flags=NO courier_authdaemond_flags="" courier_imap_flags=NO courier_imap_ssl_flags="" pkg_scripts="postfix saslauthd courier_authdaemond courier_imap courier_imap_ssl"
postfixの一般的な設定
/etc/postfix/main.cfを編集して、メールの送受信テスト用に一般的な設定を行います。
/etc/postfix/main.cfの編集
myhostname = foo.example.org mydomain = example.org myorigin = $mydomain inet_interfaces = all inet_protocols = ipv4 mydestination = $myhostname, localhost.$mydomain, $mydomain mynetworks_style = host alias_maps = hash:/etc/mail/aliases alias_database = hash:/etc/mail/aliases # postfixのversionは非表示 smtpd_banner = $myhostname ESMTP $mail_name # 受信メールはMaildir形式で格納 home_mailbox = Maildir/ ## for Blockking ## # HELO または EHLO コマンドを要求 smtpd_helo_required = yes # VRFYやEXPNコマンドを無効(お好みで有効に) #disable_vrfy_command = yes #RFC821違反のFROM:やRCPT TO:を拒否(お好みで有効に) #strict_rfc821_envelopes = yes # SMTPサーバがクライアントからSMTP接続の要求を受けた際に適用する制限 smtpd_client_restrictions = permit_mynetworks, # 逆引出来ないIPは拒否 reject_unknown_client, # reject_listで定義されているものは拒否 check_client_access hash:/etc/postfix/reject_list, permit # Fromによる制限 smtpd_sender_restrictions = # 送信者のアドレスのドメインにAレコードまたはMXレコードがないとき拒否 reject_unknown_sender_domain, #アドレスがFQDNでなければ拒否 reject_non_fqdn_sender, # sender_accessはで定義されているものは拒否 check_sender_access hash:/etc/postfix/sender_access # アドレス検証状態の格納場所 address_verify_map = btree:/etc/postfix/verify
Maildirディレクトリを作成
自分のhomeディレクトリにMaildirを作成します。courier-imapがインストールされていれば、/usr/local/bin/にmaildirmakeコマンドがあると思いますのでこれを使います。
# su UserName -c '/usr/local/bin/maildirmake /home/UserName/Maildir' #
useraddコマンド実行時にMaildirが作成されるように/etc/skel/Maildirにも作成します。
# /usr/local/bin/maildirmake /etc/skel/Maildir #
postfixを立ち上げます
# /etc/rc.d/postfix start #
送受信と不正中継のチェック
送信と受信を行ってみて、正常に動作しているか確認します。受信の場合は正常に受信出来ていれば、/home/UserName/Maildir/newの下にファイルが出来ているはずです。
不正中継のチェックは第三者中継チェックなどを使えば良いでしょう。
authdaemondの設定
/usr/local/lib/sasl2にsmtpd.confを作成
smtpd.confはデフォルトでは存在しないので、新規作成して下記の設定をします。
pwcheck_method: authdaemond authdaemond_path: /var/run/courier-auth/socket mech_list: plain login
authdaemondにパスワードを登録
ユーザ情報を登録 # /usr/local/sbin/userdb UserName set home=/home/UserName mail=/home/UserName/Maildir uid=`id -u UserName` gid=`id -g UserName` smtp認証時のパスワード # /usr/local/sbin/userdbpw | userdb UserName set smtppw Password: Reenter password: imap認証時のパスワード(平文) # /usr/local/sbin/userdbpw | userdb UserName set imappw Password: Reenter password: データベース作成 # /usr/local/sbin/makeuserdb
これで/etc/courier/以下に userdb userdb.dat userdbshadow.dat が作成されます。
/etc/courier/authdaemonrcを編集
メモリーがもったいないので立ち上がるプロセスを減らします。/etc/courier/authdaemonrcを開いて下記のように変更します。
# You may need to increase daemons if as your system load increases. Symptoms
# include sporadic authentication failures. If you start getting
# authentication failures, increase daemons. However, the default of 5
# SHOULD be sufficient. Bumping up daemon count is only a short-term
# solution. The permanent solution is to add more resources: RAM, faster
# disks, faster CPUs...
#daemons=5
daemons=2
/etc/rc.d/courier_authdaemondを編集
OpenBSDのpostfixはchrootして動作しているので、/var/spool/postfixより上のディレクトリのファイルはアクセスは出来ません。しかしauthdaemondで認証をするためには、/var/run/courier-auth/socketにアクセスしなければならず、このままだと認証が失敗します。
これを回避するために、/var/spool/postfix/var/run/courier-auth/socket に /var/run/courier-auth/socketをハードリンクを作成して(シンボリックリンクでは認証NGになってしまいました)、postfixからもcourier-authのsocketをアクセス可能にします。
このハードリンクを作成する処理を /etc/rc.d/courier_authdaemondに追加します
rc_start() { mkdir -p /var/run/courier{,-auth}/ ${rcexec} "${daemon} start" if [ -x /var/run/courier-auth/socket ]; then ln /var/run/courier-auth/socket /var/spool/postfix/var/run/courier-auth/socket fi } rc_stop() { ${daemon} stop if [ -x /var/spool/postfix/var/run/courier-auth/socket ]; then rm /var/spool/postfix/var/run/courier-auth/socket fi }
SSLサーバ証明書の作成
サーバー秘密鍵の作成 (server.key)
# cd /etc/ssl/private/ # openssl genrsa -out server.key -aes256 2048 Generating RSA private key, 2048 bit long modulus .......................+++ ..................................................................................................................................+++ e is 65537 (0x10001) Enter pass phrase for server.key: パスフレーズを入力します。 Verifying - Enter pass phrase for server.key: パスフレーズを再度入力します。 #
パスフレーズを削除
# openssl rsa -in server.key -out server.key
Enter pass phrase for server.key: パスフレーズを入力します。
writing RSA key
#
証明書要求の作成(server.csr)
# openssl req -new -key server.key -out server.csr Enter pass phrase for server.key: You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) []:JP State or Province Name (full name) []:Tokyo Locality Name (eg, city) []:Sakura Organization Name (eg, company) []:Example Com Organizational Unit Name (eg, section) []:foo Common Name (eg, fully qualified host name) []:foo.example.com Email Address []:postmaster@example.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: #
自己署名の証明書の作成(server.crt)
個人使用のサーバーなので、ca署名でなく自己署名の証明書を作成します。そして、imap用の証明書imapd.pemとpostfix用の証明書postfix.pemを作成します。
# openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 3650 Signature ok subject=/C=JP/ST=Tokyo/L=Sakura/O=Example Com/OU=foo/CN=foo.example.com/emailAddress=postmaster@example.com Getting Private key # (cat server.crt ; cat server.key) > imapd.pem # chmod 400 imapd.pem # chown _courier imapd.pem # (cat server.crt ; cat server.key) > postfix.pem # chmod 400 postfix.pem # chown _postfix postfix.pem # # ls -al drwx------ 2 root wheel 512 Dec 10 16:11 . drwxr-xr-x 4 root wheel 512 Dec 3 17:10 .. -rw------- 1 _courier wheel 3021 Dec 10 15:51 imapd.pem -rw------- 1 _postfix wheel 3021 Dec 10 16:11 postfix.pem -rw------- 1 root wheel 1346 Dec 10 15:48 server.crt -rw------- 1 root wheel 1074 Dec 10 15:47 server.csr -rw------- 1 root wheel 1675 Dec 10 14:17 server.key #
postfixの認証用の設定を追加
/etc/postfix/main.cfを編集して、postfixの認証用の設定を追加します。
/etc/postfix/main.cfの編集
## for Auth ## # SASLによるSMTP認証を使用 smtpd_sasl_auth_enable = yes # メールの配送や中継の制限を設定 smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated,reject_unauth_destination smtpd_sasl_local_domain = # noanonymous : 匿名での接続を拒否。 smtpd_sasl_security_options=noanonymous ## for SMPT over SSL ## # STARTTLSサポートを案内するが、クライアントがTLS暗号化を使うことを強制はしない mtpd_tls_security_level = may # tlsのログレベル smtpd_tls_loglevel = 1 # 証明書の場所 smtpd_tls_cert_file = /etc/ssl/private/postfix.pem smtpd_tls_key_file = /etc/ssl/private/postfix.pem tls_random_source = dev:/dev/urandom
/etc/postfix/master.cfを編集
/etc/postfix/master.cfを編集して、submission(port 587)とsmtpsを有効にします。smtpsがあるのでsubmissionは不要な気もするが一応設定しておきます。
設定前 #submission inet n - - - - smtpd # -o smtpd_tls_security_level=encrypt # -o smtpd_sasl_auth_enable=yes # -o smtpd_client_restrictions=permit_sasl_authenticated,reject # -o milter_macro_daemon_name=ORIGINATING 設定後 submission inet n - - - - smtpd -o smtpd_tls_security_level=may -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject # -o milter_macro_daemon_name=ORIGINATING 設定前 #smtps inet n - - - - smtpd # -o smtpd_tls_wrappermode=yes # -o smtpd_sasl_auth_enable=yes # -o smtpd_client_restrictions=permit_sasl_authenticated,reject # -o milter_macro_daemon_name=ORIGINATING smtps inet n - - - - smtpd #smtpd_tls_wrappermode=yes を有効にしないとthunderbirdのsmtpsが動かなくてはまった -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject # -o milter_macro_daemon_name=ORIGINATING
接続・認証テスト
authdaemond imaps postfixの起動
テストの前にauthdaemond imapsを起動します。postfixは設定が変わったので再起動させます。
# /etc/rc.d/courier_authdaemond start courier_authdaemond(ok) # /etc/rc.d/courier_imap_ssl start courier_imap_ssl(ok) # /etc/rc.d/postfix restart postfix(ok) postfix(ok) #
認証用データの作成
認証データはperlを使って簡単に作成できます。
perl -MMIME::Base64 -e 'print encode_base64("username\@domain\0username\@domain\0password");'
例えば、ユーザー名が"FOOBAR"でパスワードが"HOGEHOGE"の場合は、次のようにして作成します。
# perl -MMIME::Base64 -e 'print encode_base64("FOOBAR\0FOOBAR\0HOGEHOGE");' Rk9PQkFSAEZPT0JBUgBIT0dFSE9HRQ== #
作成したデータを確認したい場合は次のようにします。
# echo "Rk9PQkFSAEZPT0JBUgBIT0dFSE9HRQ==" | nkf -mB | perl -pe 's/\0/\n/g' FOOBAR FOOBAR HOGEHOGE #
smtp(port 25)への接続
最初は暗号化されていない(非STARTTLS)接続で通信してみます。
# telnet localhost smtp Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 foo.example.org ESMTP Postfix EHLO localhost 250-mail.example.org 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-STARTTLS 250-AUTH PLAIN LOGIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN auth plain Rk9PQkFSAEZPT0JBUgBIT0dFSE9HRQ== 235 2.7.0 Authentication successful quit 221 2.0.0 Bye Connection closed by foreign host. #
次は暗号化された(STARTTLS)接続で通信してみます。
# openssl s_client -crlf -starttls smtp -connect localhost:smtp CONNECTED(00000003) depth=0 C = JP, ST = Tokyo, L = Sakura, O = Example Com, OU = foo, CN = foo.example.com, emailAddress = postmaster@example.com verify error:num=18:self signed certificate verify return:1 ---- 色々出力されるので略 ---- 250 DSN EHLO localhost 250-foo.example.org 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-AUTH PLAIN LOGIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN auth plain Rk9PQkFSAEZPT0JBUgBIT0dFSE9HRQ== 235 2.7.0 Authentication successful quit 221 2.0.0 Bye closed #
submission(port 587)への接続
smtpの時と同じように、非STARTTLSとSTARTTLSで接続してみます。
# telnet localhost submission Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 foo.example.org ESMTP Postfix ---- 色々出力されるので略 ---- 250-8BITMIME 250 DSN auth plain Rk9PQkFSAEZPT0JBUgBIT0dFSE9HRQ== 235 2.7.0 Authentication successful quit 221 2.0.0 Bye Connection closed by foreign host. #
# openssl s_client -crlf -starttls smtp -connect localhost:submission CONNECTED(00000003) depth=0 C = JP, ST = Tokyo, L = Sakura, O = Example Com, OU = foo, CN = foo.example.com, emailAddress = postmaster@example.com ---- 色々出力されるので略 ---- 250-8BITMIME 250 DSN auth plain Rk9PQkFSAEZPT0JBUgBIT0dFSE9HRQ== 235 2.7.0 Authentication successful quit 221 2.0.0 Bye closed #
smtps(port 465)への接続
smtpsの場合は最初からSSL通信するので、コマンドオプションが少し違います。
# openssl s_client -connect localhost:smtps CONNECTED(00000003) depth=0 C = JP, ST = Tokyo, L = Sakura, O = Example Com, OU = foo, CN = foo.example.com, emailAddress = postmaster@example.com ---- 色々出力されるので略 ---- 250-8BITMIME 250 DSN auth plain Rk9PQkFSAEZPT0JBUgBIT0dFSE9HRQ== 235 2.7.0 Authentication successful quit 221 2.0.0 Bye closed #
imaps(port 465)への接続
smtpsの場合は最初からSSL通信するので、コマンドオプションが少し違います。
# openssl s_client -connect localhost:imaps CONNECTED(00000003) depth=0 C = JP, ST = Tokyo, L = Sakura, O = Example Com, OU = foo, CN = foo.example.com, emailAddress = postmaster@example.com ---- 色々出力されるので略 ---- * OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE AUTH=PLAIN ACL ACL2=UNION] Courier-IMAP ready. Copyright 1998-2011 Double Precision, Inc. See COPYING for distribution information. 0000 CAPABILITY * CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE AUTH=PLAIN ACL ACL2=UNION 0000 OK CAPABILITY completed 0001 LOGIN "FOOBAR" "HOGEHOGE" 0001 OK LOGIN Ok. 0002 logout * BYE Courier-IMAP server shutting down 0002 OK LOGOUT completed closed #
これでサーバーの設定は終了しました。
0 コメント:
コメントを投稿