2011年12月14日水曜日

さくらVPSでOpenBSD (postfix imapの設定)

さくら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 コメント:

コメントを投稿