以前、メールが送れないということを書き、サブミッションポートの設定とPOP before SMTPの設定で解決したと書いたのだけど、いつの間にかまた送れなくなっていた。dracdは動いていてくれるのだけど、送信しようとするとrelayできないというエラーになる。
で、あきらめてSMTPAuthを導入することにした。SMTP認証の際、SMTP over SSLでユーザー名とパスワードを暗号化する。
まず、Cyrus SASL2をインストール。
cd /usr/ports/security/cyrus-sasl2
make BATCH=yes WITHOUT_OTP=yes WITH_BDB=yes install clean
次に、Cyrus saslauthd インストール。
cd /usr/ports/security/cyrus-sasl2-saslauthd
make BATCH=yes WITH_BDB=yes install clean
インストールできたら、
/usr/local/etc/rc.d/saslauthd start
で、デーモンを起動しておく。
暗号化のためのOpenSSLをインストール。ソースをダウンロードして展開したディレクトリにcdした後、
./config
make
make test
make install
とやれば、
/usr/local/ssl/bin/openssl
にインストールされる。
/etc/pki/tls/certsディレクトリが無いので作った後、
cd /etc/pki/tls/certs
/usr/local/ssl/bin/openssl req -new -x509 -nodes -days 365 -out mail.crt -keyout mail.key
を実行。いろいろきいてくるので、次のように入力。
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:*.frontier-line.org
Email Address []:
これが終わると、mail.crtとmail.keyができる。パーミッションを変更。
chmod 600 mail.key
セキュリティ証明書の作成。
/usr/local/ssl/bin/openssl x509 -in mail.crt -outform der -out mail.der
次にPostfix本体の再インストール。一度make deinstallしてからmake reinstallとかするとうまくいく。
make WITH_SASL2=yes WITH_TLS=yes WITH_BDB=yes WITH_BDB_VER=41
で適当にインストール。
portsから入れると/usr/local/sbin/postfixが動く。ソースから入れた時とディレクトリが違い、いろいろやってるとどっちかわからなくなるので要注意。
もろもろの設定は次の通り。
/usr/local/etc/postfix/main.cfは、
myhostname = frontier-line.org
mydomain = frontier-line.org
myorigin = $mydomain
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
relay_domains = $mydestination
alias_maps = hash:/etc/postfix/aliases
alias_database = hash:/etc/postfix/aliases
mail_spool_directory = /var/mail
とやっておいて、ファイルの最後に、SMTPAuthに必要な設定を追加。
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $mydomain
smtpd_sasl_security_options = noanonymous
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
broken_sasl_auth_clients = yes
さらに、TLSを使うための追加。
smtpd_tls_security_level = may
smtpd_tls_key_file = /etc/pki/tls/certs/mail.key
smtpd_tls_cert_file = /etc/pki/tls/certs/mail.crt
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
添付ファイルの大きいのを受信できるようにするための設定を追加。
mailbox_size_limit= 102400000
message_size_limit = 51200000
body_checks_size_limit = 204800000
/etc/rc.confは、
saslauthd_enable="YES"
saslauthd_flags="-a sasldb"
を追加。saslauthdを自動起動するように設定。
postfixを最初に入れた時に変更した分
sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
postfix_enable="YES"
はそのまま。
/usr/local/lib/sasl2/smtpd.confに、
pwcheck_method: auxprop
と書いておく。
/etc/periodic.confは、既に変更済みだが、
daily_clean_hoststat_enable="NO"
daily_status_mail_rejects_enable="NO"
daily_status_include_submit_mailq="NO"
daily_submit_queuerun="NO"
となっているのを確認。
/etc/mail/mailer.confは、
sendmail /usr/local/sbin/sendmail
send-mail /usr/local/sbin/sendmail
mailq /usr/local/sbin/sendmail
newaliases /usr/local/sbin/sendmail
で、これは最初のインストールの時のまま。
/etc/make.confは、
PERL_VERSION=5.14.4
NO_MAILWRAPPER=YES
NO_SENDMAIL=YES
で、これも他のインストールで決めたまま変更なし。何も設定していないなら特に何かする必要は無いかも。
/usr/local/etc/postfix/master.cfで、以下の部分のコメントを外す。
smtp inet n - n - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=may
smtps inet n - n - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
smtp authユーザーを追加する。
saslpasswd2 -c username
で、登録したいユーザーをusernameのところに書くと、パスワードをきいてくる。
登録後は、
sasldblistusers2
で確認。この登録でデータベースができるので、所有者とパーミッションを変更。
chown cyrus:mail /usr/local/etc/sasldb2
chmod 640 /usr/local/etc/sasldb2
/etc/servicesで、サブミッションポート587とSMTP over SSLのポート465がコメントアウトされていることを確認し、
/usr/local/sbin/postfix stop
/usr/local/sbin/postfix start
とやって、設定を確実に読み込ませる。
デーモンが上がったら、
netstat -na | grep 587
netstat -na | grep 465
を実行し、この2つのポートをlistenしていることを確認する。
TLSの動作確認は、
telnet localhost 25
してから、
EHLO localhost
STARTTLS
.
を順番に入力して様子を見る。
今回、どういうわけか、newaliasesでできる/etc/aliasesがうまくpostfixに認識されず、データベースを開けないために接続が拒否され、外部からのメールが到達しないという現象にみまわれた。main.confで、
alias_maps = hash:/etc/postfix/aliases
alias_database = hash:/etc/postfix/aliases
と設定し、/etc/postfix/aliasesを書き換えたら
/usr/local/sbin/postalias /etc/postfix/aliases
を実行するとエラーは出ない。メーラーデーモン共通で使えるaliasesでうまくいかない理由はよくわからない。
Thunderbird側の設定は、
サーバ名:frontier-line.org
ポート番号:465
接続の保護:SSL/TLS
認証方式:通常のパスワード認証
で接続できる。
なお、今回作ったTLSの証明書は、いわゆるオレオレ証明書なので、Thunderbird様から怪しいと怒られますorz。でもまあ、オレがrootでオレが設定してオレしか使わないオレ専用サーバなので、証明書もオレオレでいいんですよね。例外設定して警告しないようにしても問題なしです。