送信smtpサーバの認証

SPAMの踏み台防止のため、通常メールサーバはエンベロープ受信者の ドメインがローカルなメールでないと受け取り拒否をします。

外部プロバイダからこのメールサーバ経由でメールを出せるようにするため、 smtpdでユーザの認証を行わせ、 認証が通った場合にのみログインを許可し、メールを出せるようにします。
LOGIN認証ではパスワードのプレーンテキストが流れてしまいますので、 smtpdのsslにつないだ場合にのみLOGIN認証を有効にします。

# vi /etc/courier/esmtpd
...
ESMTPAUTH=""     LOGINがないことを確認します
...
# vi /etc/courier/esmtpd-ssl
...
AUTHMODULES="authdaemon"
ESMTPAUTH="LOGIN"
# /etc/init.d/courier-mta-ssl restart
この状態だと、/etc/passwdにパスワード設定があるユーザはログインできますが、 ldap上のユーザはログインできなくなるので、/etc/pam.d/esmtpに設定します。
# vi /etc/pam.d/esmtp
auth     sufficient pam_ldap.so
account  sufficient pam_ldap.so
password sufficient pam_ldap.so

auth     required   pam_unix.so nullok use_first_pass
account  required   pam_unix.so
password required   pam_unix.so try_first_pass
session  required   pam_unix.so
esmtpdのssl版は通常ポート465番で起動していますので、 Outlook Express等でSMTPサーバにSSL有効、465番を設定し、 送信メールサーバの認証を有効にすれば使用できます。

Pop before smtp

smtp認証ができるメールクライアントは限られますので、 pop before smtpを導入します。

Debianは普通dracとかなんでしょうけど、courierのソースにパッチを当てなければ ならないので、ここでは relay-ctrlを用います。

% tar xzf relay-ctrl-3.1.1.tar.gz
% cd relay-ctrl-3.1.1
% vi relay-ctrl-allow.c
... (関数make_file)
  switch (do_chdir()) {
  case 0: return;
  case 2: mode = 0666; break;
  default: mode = /*0600*/ 0644; break;
  }
...
% vi relay-ctrl-check.c
... (関数main)
    if ((rc = getenv("RELAY_CTRL_RELAYCLIENT")) == 0) rc = "";
    if ((ip = getenv("TCPREMOTEIP")) == 0 || (ip= validate_ip(ip))==0)
      warn1("$TCPREMOTEIP not set, not checking IP");
...
% make
% strip relay-ctrl-allow relay-ctrl-check relay-ctrl-age
# mkdir /usr/lib/courier/relay
# cp relay-ctrl-allow relay-ctrl-check relay-ctrl-age /usr/lib/courier/relay
# mkdir /var/lib/courier/relay ; chmod a+rwx /var/lib/courier/relay
コンパイルするといろいろできますが、必要なのは、relay-ctrl-allow、relay-ctrl-check、relay-ctrl-ageの3つだけです。

次にpopでログインが成功した時に、relay-ctrl-allowが呼ばれるようにします。

# vi /etc/init.d/courier-pop
...
    /usr/bin/env - PATH="$PATH" SHELL="$SHELL" POP3AUTH="$POP3AUTH" RELAY_CTRL_DIR="/var/lib/courier/relay" \
      $TCPD -pid=$PIDFILE -stderrlogger=${sbindir}/courierlogger \
      -maxprocs=$MAXDAEMONS -maxperip=$MAXPERIP \
      $TCPDOPTS -address=$ADDRESS $PORT \
      ${prefix}/lib/courier/courier/courierpop3login $AUTHMODULELIST \
      ${prefix}/lib/courier/relay/relay-ctrl-allow \
      ${prefix}/lib/courier/courier/courierpop3d Maildir
...
# /etc/init.d/courier-pop restart
/usr/lib/courier/pop3dは使われないので修正しなくてもいいです。 また、imapはそもそも外に公開しませんし、 pop-sslやimap-sslが使える環境なら esmtp-sslが使えてそれでログインできるでしょうから、 その他の修正はもし必要なら行ってください。

次にsmtpを修正します。

# vi /usr/lib/courier/esmtpd
...
        echo RELAY_CTRL_DIR=/var/lib/courier/relay
        echo ${sbindir}/couriertcpd $TCPDOPTS $PORT \
                /usr/lib/courier/relay/relay-ctrl-check \
                ${sbindir}/courieresmtpd $AUTHMODULES '>/dev/null 2>&1 </dev/null'
...
# /etc/init.d/courier-mta restart
これでpop接続後15分間はsmtpがリレーとして動作します。 最後に/var/lib/courier/relayディレクトリのごみそうじを登録します。
# vi /etc/crontab
...
41 * * * *       root    /usr/bin/env RELAY_CTRL_DIR=/var/lib/courier/relay /usr/lib/courier/relay/relay-ctrl-age 
...
ユーザ数にもよりますが1時間に1回で十分でしょう。