[Memo2008][EPA]tako作業メモ(納多)(080723)

qmail

qmail に新たに qmail-realrcptto パッチを適用するため, qmail の再インストールを行う

qmail-realrcptto パッチの解説

qmail-realrcptto パッチ は, あて先が有効であるかを確認する機能を qmail に付加するパッチである.

これを適用することにより, 存在しないアドレスへのメール (SPAM など) を拒否することができ, サーバへの無用な負荷を避けることができる. (参考: http://ya.maya.st/mail/lwq.html#smtp-reject )

qmail の再インストール

# cd /usr/local/src

念のため, tar.gz ファイルの展開からやり直すことにする.

# rm -r qmail-1.03
# tar zxfv qmail-1.03.tar.gz
# cd qmail-1.03

パッチを当てていく.

# patch -p1 < ../qmail-1.03-realrcptto-2006.12.10.patch
patching file Makefile
patching file qmail-qmtpd.c
patching file qmail-smtpd.c
patching file realrcptto.c

# patch -p1 < ../qmail-date-localtime.patch
patching file date822fmt.c

# patch -p0 < ../qmail-glibc.patch
patching file error.h
patching file dns.c
patching file cdb_seek.c

# patch -p0 < ../qmail-local.patch
patching file qmail-local.c

再インストールのためサービスを停止する.

# /etc/init.d/qmail stop

インストールを行う.

# make
# make man
# make setup
./install
install: fatal: unable to write .../bin/splogger: text busy
make: *** [setup] Error 111

tcpserver が停止していなかったため上書きできなかったようだ.

# /etc/init.d/tcpserver stop

# make check

OK. サービスを再開する.

# /etc/init.d/qmail start
# /etc/init.d/tcpserver start

宛先の有効性をチェックしたくない場合

宛先の有効性をチェックしたくない場合には

# echo '#' > /var/qmail/alias/.qmail-default

とすればよい.

動作テスト

外部から存在しないアドレス, 例えば hoge_at_tako.epa.scitec.kobe-u.ac.jp にメールを送る.

tako:/var/log/mail.log に受信した内容が追記されていた.

今度は宛先の有効性をチェックしないでみる.

# echo '#' > /var/qmail/alias/.qmail-default

再び, 外部から存在しないアドレスにメールを送る. アドレスが存在しないことを伝えるエラーメールが帰ってきた. tako:/var/log/mail.log には何も追記されていない.

設定を元に戻す.

# rm /var/qmail/alias/.qmail-default

みたび, 外部から存在しないアドレスにメールを送る. 最初のように, tako:/var/log/mail.log にメールを受信した内容が追記されていた.

qpopper

qpopper は APOP をサポートする POP3 サーバである.

qpopper のインストール

最新版である qpopper 4.0.13 をインストールする.

# cd /usr/local/src
# wget ftp://ftp.qualcomm.com/eudora/servers/unix/popper/qpopper4.0.13.tar.gz
# tar zxfv qpopper4.0.13.tar.gz
# cd qpopper4.0.13

ビルドの前に, qpopper を動作させるためのユーザ pop を作成する.

# adduser --system --ingroup mail --no-create-home --shell /bin/false --disabled-password --home /nonexistent pop
Warning: The home dir you specified does not exist.
Adding system user `pop' (UID 117) ...
Adding new user `pop' (UID 117) with group `mail' ...
Not creating home directory `/nonexistent'.

# vipw

上の行を下の行にする ('Post Office Owner' と追記しただけ)

pop:x:117:8::/nonexistent:/bin/false pop:x:117:8:Post Office Owner:/nonexistent:/bin/false

ちなみに, ユーザ ID とグループ ID は システムによって順に割り振られていくので, いつも上記のようになるとは限らない.

ビルド

以下のコマンドを打つ.

# ./configure \
--prefix=/usr/local/qpopper \    # インストール場所
--enable-apop=/usr/local/qpopper/pop.auth \   # APOP の設定ファイルの場所
--enable-popuid=pop \   # qpopper を動作させるユーザ
--enable-shy \          # qpopper のバージョン番号を隠蔽
--enable-nonauth-file=/usr/local/qpopper/popusers \  # 接続拒否ユーザを書いたリストの場所
--without-pam \    # POP3 に PAM による認証を行わない
--with-gdbm        # データベースの取り扱いに GDBM を使う

configure の設定オプションについては ./configure --help コマンドで参照できる.

APOP のみにするため, popper/Makefile を編集する. OS_DEFS の行を以下のように変更する.

OS_DEFS         =    -DLINUX -DUNIX -DAPOP_ONLY

make する.

$ make
(略)
pop_user.c: In function 'pop_user':
pop_user.c:149: error: 'DBM' undeclared (first use in this function)
pop_user.c:149: error: (Each undeclared identifier is reported only once
pop_user.c:149: error: for each function it appears in.)
pop_user.c:149: error: 'db' undeclared (first use in this function)
pop_user.c:153: error: 'datum' undeclared (first use in this function)
pop_user.c:153: error: expected ';' before 'key'
pop_user.c:332: error: 'key' undeclared (first use in this function)
pop_user.c:345: error: 'value' undeclared (first use in this function)
make: *** [pop_user.o] Error 1

DBM が宣言されていない, ということは, gdbm が怪しい.

# apt-get install gdbm

gdbm なるパッケージはないようだ. debian のパッケージ検索をしてみると, libgdbm-dev なるものがあるようだ.

# apt-get install libgdbm-dev

configure をやり直す.

# make

今度はエラーなく完了.

2007 年度の構築ドキュメントにおける, バージョン 4.0.9 のインストールでは, 「qpopper の Makefile はディレクトリの作成を行ってくれないため, 自前で箱は用意した後に make install する.」 とあるが, 何もせず

# make install

と実行しても普通に /usr/local/qpopper ディレクトリ以下は作られていた (構築ドキュメントの修正は既に完了).

しかし, 以下のメッセージが現れた.

(略)
Installed popper as /usr/local/qpopper/sbin/popper
/bin/sh: line 1: @/usr/bin/install: No such file or directory
/bin/sh: line 3: @echo: command not found
/bin/sh: line 5: /usr/local/qpopper/sbin/popauth: No such file or directory
/bin/sh: line 6: @echo: command not found
make[1]: *** [install] Error 127
make[1]: Leaving directory `/usr/local/src/qpopper4.0.13/popper'
make: *** [install] Error 2

/usr/local/qpopper/sbin/popper の存在は確認したが, /usr/local/qpopper/sbin/popauth は見つからない.

popper/Makefile より, 関係がありそうなところを以下に引用する:

(略)
install: popper ${pop_auth}
      @if [ ! -d ${installdir} ]; then \
              mkdir -m 0755 ${installdir}; \
              chown root:wheel ${installdir}; \
      fi
      @${INSTALL} -s -m 0755 -o root popper ${installdir}/popper
      @echo "Installed popper as ${installdir}/popper"
      @if [ "x${poppassd}" != "x" ]; then \
              cd ${password_dir} && ${MAKE} install ;\
      fi

      @if [ "x${pop_auth}" != "x" ]; then \
              @${INSTALL} -s -m 4755 -o ${apop_uid} -g 0 ${pop_auth} \
                      ${installdir}/${pop_auth}; \
              @echo "Installed popauth as ${installdir}/${pop_auth} " \
                "with uid ${apop_uid}"; \
          ${installdir}/${pop_auth} -init -safe; \
          @echo "Initialized popauth database"; \
      fi
(略)

上に引用したものの後半部において, '@' がなぜかコマンドの一部と解釈されてしまっているようだ.

# cp popper/Makefile popper/Makefile.org

上に引用したものの後半部において, '@' を消去してみる.

# make install

前にエラーが出た箇所は以下のように出力された.

Installed popper as /usr/local/qpopper/sbin/popper
if [ "xpopauth" != "x" ]; then \
                /usr/bin/install -c -s -m 4755 -o pop -g 0 popauth \
                        /usr/local/qpopper/sbin/popauth; \
                echo "Installed popauth as /usr/local/qpopper/sbin/popauth " \
                  "with uid pop"; \
            /usr/local/qpopper/sbin/popauth -init -safe; \
            echo "Initialized popauth database"; \
        fi
Installed popauth as /usr/local/qpopper/sbin/popauth  with uid pop
Initialized popauth database
make[1]: Leaving directory `/usr/local/src/qpopper4.0.13/popper'

コマンドが陽に表示されたが, うまく実行されたようだ. /usr/local/qpopper/sbin/popauth の存在も確認.

inetd に登録を行う.

# vi /etc/inetd.conf

以下の行を追加する.

pop3    stream  tcp     nowait  root    /usr/lcoal/qpopper/sbin/popper popper -s

inetd を再起動する.

# /etc/init.d/openbsd-inetd restart

パスの設定

インストールした qpopper の実行ファイル群, マニュアル群へパスを通す.

実行ファイルへのパスの設定

[EPA]パスの設定 の <一般ユーザ用コマンドのパス> に /usr/local/qpopper/sbin を追加する. (大抵, sbin はシステム用コマンドがインストールされる場所であるが, 一般ユーザが使用する pop_auth もインストールされているため, 一般ユーザ用コマンドのパスとして登録する).

マニュアルへのパスの設定

/etc/manpath.config に以下の行を追加する. 詳しくは [EPA]パスの設定#man 関連のパスの設定 を参照のこと.

MANDATORY_MANPATH                           /usr/local/qpopper/man
MANPATH_MAP        /usr/local/qpopper/sbin  /usr/local/qpopper/man
MANDB_MAP          /usr/local/qpopper/man   /usr/local/qpopper/man

popauth の使い方の例

APOP を使うようにする.

$ popauth
    または
# popauth -u (ユーザ名)

登録しているユーザ全員を表示する

# popauth -list ALL

ユーザ testuser を削除する

# popauth -delete testuser

動作確認

ユーザ chikuwa1 で qpopper による APOP の動作確認を行う まず APOP で使用するパスワードを設定する.

$ popauth
Changing only APOP password for mondo1.
New password: (パスワードを入力)
Retype new password: (パスワードを入力)

$ sudo -s

# mail chikuwa1
Subject: test of APOP
test [Enter]
[Ctrl + D]
Cc: [Enter]

ユーザ chikuwa1 になると,

You have new mail in /home/chikuwa1/Mailbox

というメッセージが現れた. メールがメールスプール /home/chikuwa1/Mailbox にあることを確認.

最後に, APOP 対応のメーラーからメールを受け取れるか確認する.

メーラーからのログインには成功するが, Mailbox のメッセージが 手元に来ない. 設定を確認する必要あり.

[Memo2008][EPA]tako作業メモ(納多)(080724) へ続く