SMTPAuth導入

|2015/4/30(木曜日)-23:06| カテゴリー: コンピューターの使い方関係
| コメントする

 以前、メールが送れないということを書き、サブミッションポートの設定と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でオレが設定してオレしか使わないオレ専用サーバなので、証明書もオレオレでいいんですよね。例外設定して警告しないようにしても問題なしです。

 mod_evasive入れたんで、ちょっとはDOS攻撃に強くなるかと思ったのだけど、それでも時々サーバが動かなくなる。OS自体は動いてるのだけど、swapを使い尽くして何もできなくなる。swap_pagerのエラーログが出続け、logrotateしてると、肝心のエラーが出始める直前の状態のログが流れ去っていたりする。原因究明のために、パソコンから端末を開いてtopコマンドを動かしっぱなしにしてみた。これだと、swapを使い尽くすと通信も激重になるので、端末画面にトラブルの状態がそのまま残る。
 その結果、原因はhttpdで、httpdの数はそれほどでもないが使用メモリが跳ね上がってるケースと、httpd1つの使用メモリはそれほどでもないが一度に大量に動いてメモリを食い尽くすケースの2通りが起きることがわかった。
 apacheからはプロセスの管理がデフォルトでeventになっているので、これを、PHPを使う場合のお薦めとされているpreforkに変更。
./configure –prefix=/usr/local/apache2 –enable-so –enable-mods-shared=all –enable-rewrite=shared –with-mpm=prefork
とやってから make install。
http -V
で、mpmがpreforkであることを確認。

 設定は、httpd.confで、extra/main.confとextra/mpm.confを見に行くようにしておいて、main.confでKeepAliveをOffにする。mpm.confは、
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 12
MaxConnectionsPerChild 100
という、数を増やさず、接続回数100回で一度メモリを解放させるということにして様子を見ることにした。お行儀の悪いPHPが紛れ込んでもこの程度なら何とかなるかな。

 やってみた結果、まず、httpdのプロセスのSIZEが平均350Mくらいだったのが165M〜180Mに減り、WordPressの画像の多いページにアクセスしてもプロセスの数が無闇に増えることもなくなった。その分、アクセスが集中すると重くなるだろうとは思うが、最初だけ多少早くてもswapに落ち始めたらどのみち激重になって復活させるには強制リブートしかないので、それなら少しタイミングを外せばまた軽くなる方がましだろう。