さくら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
smtpd_banner = $myhostname ESMTP $mail_name
home_mailbox = Maildir/
smtpd_helo_required = yes
#disable_vrfy_command = yes
#strict_rfc821_envelopes = yes
smtpd_client_restrictions =
permit_mynetworks,
reject_unknown_client,
check_client_access hash:/etc/postfix/reject_list,
permit
smtpd_sender_restrictions =
reject_unknown_sender_domain,
reject_non_fqdn_sender,
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`
# /usr/local/sbin/userdbpw | userdb UserName set smtppw
Password:
Reenter password:
# /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を開いて下記のように変更します。
/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の編集
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated,reject_unauth_destination
smtpd_sasl_local_domain =
smtpd_sasl_security_options=noanonymous
mtpd_tls_security_level = may
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=may
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
設定前
smtps inet n - - - - smtpd
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
接続・認証テスト
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
#
これでサーバーの設定は終了しました。