Postfix with SMTP-AUTHの設定方法



 Red Hat Linux 9.0にデフォルトでインストールされているPostfixは既にSMTP-AUTHに対応していますので、下記作業を行う必要はありませんので、SMTP-AUTHの設定に飛んで下さい。
 ただし、デフォルトで起動するMTAはsendmailでPostfixを起動するようにしなければなりません。それにはまず、
  $rpm -qa | grep redhat-switch-mail
として、redhat-switch-mailがインストールされているか確認して下さい。インストールされているのであれば、コマンドラインから
  #redhat-switch-mail
として、sendmailからPostfixに切り替えて下さい。

Vine Linux 2.5の場合 -----ここから-----

cyrus-sasl-1.5.27-17vl1.i386.rpm
cyrus-sasl-devel-1.5.27-17vl1.i386.rpm
postfix-0.0.20010228pl08-0vl3.src.rpm
を入手。
  # rpm -ivh cyrus-sasl-1.5.27-17vl1.i386.rpm cyrus-sasl-devel-1.5.27-17vl1.i386.rpm
postfix-0.0.20010228pl08-0vl3.src.rpmを適当な(root以外)ユーザの/home/****/rpm/SRPMSに保存し、オーナー・グループを変更しておこう。
  # chown **** postfix-0.0.20010228pl08-0vl3.src.rpm
  # chgrp **** postfix-0.0.20010228pl08-0vl3.src.rpm
  $ rpm -ivh postfix-0.0.20010228pl08-0vl3.src.rpm
  $ cd ~/rpm/SPECS/
PostfixをSASL化させるためspecファイルを編集する。(make行の直前に以下の行を挿入)

 make makefiles CCARGS="-DUSE_SASL_AUTH -I/usr/include" AUXLIBS="-L/usr/lib -lsasl"
postfix.specの中身
		:
		:
		:
  %patch -p1
  %build
  make makefiles CCARGS="-DUSE_SASL_AUTH -I/usr/include" AUXLIBS="-L/usr/lib -lsasl"
  make DEBUG="" OPT="$RPM_OPT_FLAGS"
  %install
  rm -rf $RPM_BUILD_ROOT
  rm -f html/Makefile.in
		:
		:
		:
Postfixの自分用RPMパッケージを作成する(Cyrus-SASLを先にインストールしておく)。
  $ rpm -ba --clean postfix.spec 2>&1 | tee postfix-rpmlog.txt
SASLに対応したPostfixを以下の手順にてインストール(強制的にアップデート)する。
  # rpm -Uvh --force postfix-0.0.20010228pl08-0vl3.i386.rpm
Vine Linux 2.5の場合 -----ここまで-----

SMTP-AUTHの設定

/usr/lib/sasl/smtpd.confを作成して以下の1行を記述する。

pwcheck_method: sasldb

パスワードを生成する。
  # /usr/sbin/saslpasswd -u hoge.hogehoge.com -c hayakawa
 (または saslpasswd -u `postconf -h myhostname` -c hayakawa)
      Password:(パスワードを入力)
      Again (for verification):(パスワードを入力)
  一回目が失敗した場合は再度実行すれば成功します。
 Vine Linux 2.5の場合 -----ここから-----
  # chgrp postfix /etc/sasldb
  # chmod 640 /etc/sasldb
  # ls -laF /etc/sasldb
      -rw-r-----    1 root     postfix     12673 May 23 10:00 /etc/sasldb
 Vine Linux 2.5の場合 -----ここまで-----
 Red Hat 9.0の場合 -----ここから-----
 (/と/var/spool/postfixが違うボリュームの場合)
  # chgrp postfix /etc/sasldb
  # chmod 640 /etc/sasldb
 # cp /etc/sasldb /var/spool/postfix/etc/sasldb
  この場合,saslpasswdを実行するたびに,コピーする必要があります。
 (/と/var/spool/postfixが同じボリュームの場合)
  # chgrp postfix /etc/sasldb
  # chmod 640 /etc/sasldb
 # ln /etc/sasldb /var/spool/postfix/etc
  この場合,最初にsasldbを作ったときのみで,通常は不要。
 Red Hat 9.0の場合 -----ここまで-----
ユーザーを確認する。
  # /usr/sbin/sasldblistusers
      user: hayakawa realm: hoge.hogehoge.com mech: DIGEST-MD5
      user: hayakawa realm: hoge.hogehoge.com mech: PLAIN
      user: hayakawa realm: hoge.hogehoge.com mech: CRAM-MD5
 ちなみに、既存ユーザのパスワード変更及び削除方法は以下のとおりです。
  既存ユーザのパスワードを変更する場合には-cオプションを使用しない
  # echo "123abc" | saslpasswd2 -p -u nsx.bluecoara.net hayakawa
  既存ユーザを削除する場合には-dオプションを使用する
  # saslpasswd2 -u nsx.bluecoara.net -d hayakawa
Postfixの設定

Postfixの設定ファイル/etc/postfix/main.cfを編集(以下の6行を追加)する。
  smtpd_sasl_auth_enable = yes     SMTP AUTHの利用を設定
  smtpd_sasl_local_domain = $myhostname
  smtpd_recipient_restrictions =   リレーを許可するものを設定する
      permit_mynetworks            mynetworksで設定されたネットワークからの接続を許可する
      permit_sasl_authenticated    SMTP認証を通過したものを許可する設定。これは必ず加えること
      check_relay_domains          
      reject                       それ以外は拒否することを設定
  smtpd_sasl_security_options = noanonymous
                                   セキュリティオプションの設定
                                   noanonymousは匿名での接続を拒否する
                                   上記のようにnoplaintextと記入するとPLAINでの認証を拒否する
  broken_sasl_auth_clients = yes
                               アウトルック,Outlook Expressのログイン認証を利用するための設定
    ※ テストするときはpermit_mynetworksを外す
Postfixの再起動
  # /etc/rc.d/init.d/postfix restart
      Shutting down postfix: postfix
      Starting postfix: postfix
SMTP-AUTHのテスト
  $ telnet localhost 25
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    220 hoge.hogehoge.com ESMTP Postfix
  EHLO localhost                              「EHLO localhost」と入力
    250-hoge.hogehoge.com
    250-PIPELINING
    250-SIZE 10240000
    250-ETRN
    250-AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5  これを確認
    250-AUTH=PLAIN LOGIN DIGEST-MD5 CRAM-MD5
    250 8BITMIME
  QUIT                                        「QUIT」と入力すると終了する
なお,Outlook Expressで使用する設定を行っている場合には「AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5」の下に「250-AUTH=PLAIN LOGIN DIGEST-MD5 CRAM-MD5」も表示される。

確認ができたら一端「QUIT」で終了し,saslpasswdで設定したパスワードをエンコードし,正しく認証が行われるかをチェックしよう。
  # printf 'ユーザー名\0ユーザー名\0パスワード' | mmencode 
  
	mmencodeについて:
  
       Vine Linux 2.5の場合 -----ここから-----
		インストールされていない場合は
		rpm -ivh metamail-2.7-25vl1.i386.rpm でインストールする。
		依存性の問題でインストールできない場合は
		rpm -ivh sharutils-4.2.1_jp-1.6.1vl2 でインストールする。
       Vine Linux 2.5の場合 -----ここまで-----
       Red Hat 9.0の場合 -----ここから-----
		インストールされていない場合は
		rpm -ivh metamail-2.7-28.i386.rpm でインストールする。
		依存性の問題でインストールできない場合は
		rpm -ivh sharutils-4.2.1-9.i386.rpm でインストールする。
       Red Hat 9.0の場合 -----ここまで-----
もしくは
  # perl -MMIME::Base64 -e 'print encode_base64("ユーザー名\0ユーザー名\0パスワード");' 
 たとえば,テスト用に「ユーザー名:hoge」,「パスワード:hoge」でパスワードを作成してからテストする場合は,先ほど解説したように
  # saslpasswd -c -u `postconf -h myhostname` hoge 
とし,パスワードを作成する。そしてユーザー名とパスワードが生成されていることを確認しよう。
  # sasldblistusers
    user: hoge realm: hoge.hogehoge.com mech: DIGEST-MD5
    user: hoge realm: hoge.hogehoge.com mech: PLAIN
    user: hoge realm: hoge.hogehoge.com mech: CRAM-MD5 
 そのあとユーザー名パスワードをエンコードする
  # printf 'hoge\0hoge\0hoge' | mmencode
  aG9nZQBob2dlAGhvZ2U= 
Telnetでlocalhostのポート25番に接続し,EHLOのあとに「AUTH PLAIN エンコードしたユーザー名パスワード」を入力する。正しくないパスワードでのエンコードも行って正常に認証されるかテストする。
  # telnet localhost 25
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    220 hoge.hogehoge.com ESMTP Postfix
  EHLO localhost                              「EHLO localhost」と入力
    250-zdnet.homelinux.org
    250-PIPELINING
    250-SIZE 10240000
    250-ETRN
    250-AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5
    250-AUTH=PLAIN LOGIN DIGEST-MD5 CRAM-MD5
    250 8BITMIME
  AUTH PLAIN aG9nZQBob2dlAGhvZ2U=             エンコードしたパスワードを入力
    235 Authentication successful             認証が成功している
  QUIT
念のため,間違ったパスワードを入力してテストしてみよう。
  # telnet localhost 25
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    220 hoge.hogehoge.com ESMTP Postfix
  EHLO localhost
    250-zdnet.homelinux.org
    250-PIPELINING
    250-SIZE 10240000
    250-ETRN
    250-AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5
    250-AUTH=PLAIN LOGIN DIGEST-MD5 CRAM-MD5
    250 8BITMIME
  AUTH PLAIN aG9nZQBob2dlAHRlc3Q=             間違ったパスワードを入力
    535 Error: authentication failed          認証が失敗している
  QUIT
テストが完了したらテスト用のアカウントを削除しておこう。
  # saslpasswd -d -u `postconf -h myhostname` hoge 
root宛のメールを任意のユーザに転送するには
  # vi /etc/aliases
  # Basic system aliases -- these MUST be present.
  MAILER-DAEMON:  postmaster
  postmaster:     root
  # General redirections for pseudo accounts.
  bin:            root
  daemon:         root
  games:          root
  ingres:         root
  nobody:         root
  system:         root
  toor:           root
  uucp:           root
  # Well-known aliases.
  manager:        root
  dumper:         root
  operator:       root
  # trap decode to catch security attacks
  decode:         root
  # Person who should get root's mail
  #root:          marc
 
 └#を外し、marcの箇所を任意のユーザに設定する。
  例:root	kenzo  この設定ではroot宛のメールはhogeに送られます。
aliasesを編集したので、システムに読み込ませる必要があります。
  # newaliases
/etc/aliasesと/etc/postfix/aliasesについて

 Vine Linux 2.5とRed Hat Linux 9.0の挙動の違いが見られた。Red Hat Linux 9.0で/etc/aliasesを編集して、root宛に来るメールを特定ユーザに転送するように設定してみましたが、何故かpostfixのスプールに取り込まれてしまう現象が発生ましたた。インターネットでいろいろ調べているうちに次のことが判明しました。main.cfを確認してみると、いずれも
  alias_maps = hash:/etc/postfix/aliases
  alias_database = hash:/etc/aliases
のようになっていて、違いは見られませんでした。よくよく調べてみるとVine Linux 2.5では/etc/postfix/aliasesは/etc/aliasesのリンクとなっていました。Red Hat Linux 9.0ではVine Linux 2.5のような設定になっておらず、/etc/postfix/aliasesの方を編集しないと駄目なことが分かりました(解決するまでに時間かかったなぁ〜w)。
 コマンドでのaliasesの確認方法
  #/usr/sbin/postmap -q root /etc/aliases(または/etc/postfix/aliases)
補足

/etc/mail/dracd.dbの中身がいつまでたっても保持されているので、30分ごとに強制的に空になるようにcronを設定した。
  # vi init-dracd.db
  /etc/rc.d/init.d/dracd stop
  cat /dev/null > /etc/mail/dracd.db
  /etc/rc.d/init.d/dracd start
  # vi initdracd
  */30 * * * * root /root/init-dracd.db
このファイルを適当なフォルダに保存。/etc/cron.dにinitdracdとして保存。

不正リレーのチェック

外部からの不正リレーをきちんと防げているかをチェックするには、メールサーバから
  % telnet relay-test.mail-abuse.org
とすると、自動的に telnet を実行したホストへアクセスし、十数個の不正なメール中継のチェックを行ないます。自分の管理下外のホストに対するチェックは不正アクセスになるので、決してチェックしてはいけません。また、管理者によってはユーザがこのようなチェックを行なうことを嫌うサイトもあります。実行は各自の責任において行なってください。

このテストを全てパスするためには 19991229 以降のバージョンの Postfix が必要です。それ以前のものは、構造上一部でチェックしきれないものがあります。たいていの場合は問題ありませんが、念のためバージョンアップして完全にテストをパスすることを確認する方がよいでしょう。

なお、sendmail のオプション -bt は Postfix ではエラーになります。Postfix の設定ファイルの文法チェックは
  # postfix check
で行なえます。