poppassd のインストールの方法

poppassd ってなに?

「電子メールクライアントソフト」でパスワードを変更することの出来るものが有ります。(Eudora , NUPOP , Pちゃん , p-chng 等)
しかし、サーバ側で対応したデーモン(サービス)が動作していないと「電子メールクライアントソフト」からパスワードを変更することは出来ません。
ちなみにメールをサーバに送信できるのはサーバで「SMTP デーモン」が動いているからです。
同じくメールをサーバから受信できるのはサーバで「POP3 デーモン」が動いているからです。
よって、パスワードを変更するデーモンをサーバに入れておくとサーバに telnet して /usr/bin/passwd コマンドを使用してパスワードを変更するといった面倒な操作をしなくてもパスワードを変更できるようになります。

poppassd とは unix 用のパスワードを変更するデーモンまたはそのプロトコルの名前です。

poppassd のプロトコル

単純なプロトコルです。
FTP サーバーが応答するように、サーバーの応答が必ずあるはずです。
サーバの応答の先頭の数字が意味を持ってます。
サンプルを以下に示します。
S: 200 hello\r\n
E: user yourloginname\r\n
S: 300 please send your password now\r\n
E: pass yourcurrentpassword\r\n
S: 200 My, that was tasty\r\n
E: newpass yournewpassword\r\n
S: 200 Happy to oblige\r\n
E: quit\r\n
S: 200 Bye-bye\r\n
S: <closes connection>
E: <closes connection>

試した環境

Machine    : CPU=Pentium200 Memory=32MB HDD=1GB
OS         : linux2.0.30(SlackWare3.2 + 2.0.30patch)
C-Compiler : gcc version 2.7.2.1
SlackWare3.2 でインストールしたので shadow-password が有効になっています。
よって、/usr/bin/passwd コマンドは SlackWare3.2 に付いていた shadow 版の /usr/bin/passwd のバイナリを使用しています。
バージョンは /usr/include/shadow.h から推測すると 3.3.2 だと思われます。

poppassd のソースの入手

poppassd は Eudora に添付されています。ftp://ftp.qualcomm.com/eudora/servers/unix/password/ にもソースが置いて有ります。
Linux 用のソースは ftp://ftp.qualcomm.com/eudora/servers/unix/password/linux.tar のファイルです。
ただしこのソースは shadow に対応していません。世の中には shadow に対応させるべく努力してる人がおり shadow に対応したソースは debian のパッケージに入っています。http://www.il.debian.org/Packages/stable/mail/poppassd.html
ftp://ftp.debian.org/debian/stable/source/mail/poppassd_1.2.orig.tar.gz でダウンロード出来ます。
1.2-5 パッチも同じディレクトリに入ってます。

結論
ftp://ftp.debian.org/debian/stable/source/mail/ から ftp://ftp.debian.org/debian/stable/source/mail/poppassd_1.2.orig.tar.gz をダウンロードする。
今回は poppassd_1.2.orig.tar.gz だけを使用しました。(公開されているパッチは使いませんでした。)

http://www.altavista.com/ で "linux poppassd" 等のキーで探しました。

poppassd のインストール方法

適当な作業ディレクトリに poppassd_1.2.orig.tar.gz をコピーして
tar -zxvf poppassd_1.2.orig.tar.gz
で解凍展開します。

内容は
-rw-r--r--   1 hogehoge users         363 May  7  1995 Makefile
-rw-r--r--   1 hogehoge users         138 May  7  1995 README
-rw-r--r--   1 hogehoge users        4817 May  7  1995 info
-r--r--r--   1 hogehoge users         685 Sep 16  1996 poppassd-src.tar.gz.lsm
-rw-r--r--   1 hogehoge users       21102 May  7  1995 poppassd.c
でした。

make
すると実行ファイル poppassd が出来ます。

ソースファイル poppassd.c のコメントにインストールのやり方が書いてあります。
/etc/services に
poppassd     106/tcp
を追加します。(TCP port 106 番のサービスが poppassd だとの設定です。)
/etc/inetd.conf に
poppassd stream tcp nowait root /usr/local/bin/poppassd poppassd
を追加します。6番めの「/usr/local/bin/poppassd」はあなたが poppassd をインストールしたパスを書く必要があります。私はデフォルトと同じ所にインストールしました。
(/usr/local/bin/poppassd で poppassd サービスを起動するという設定です。)
tcpd を使用している場合は
poppassd stream tcp nowait root /usr/sbin/tcpd /usr/local/bin/poppassd
でも大丈夫です。
kill -HUP </usr/sbin/inetdのプロセスID> するか reboot すれば poppassd が動作します。

shadow に対応させる方法。

vi 等のエディタを使用して Makefile を変更します。
Makefile の先頭に変数の設定が有るのでそこを書き出します。
BINDIR  = /usr/sbin
LIBDIR  =
CFLAGS  = -O2 # -DHAS_SHADOW
LFLAGS  =
OBJECTS = poppassd.o
LIBS    = # -lshadow
と、一目瞭然なので
BINDIR  = /usr/sbin
LIBDIR  =
CFLAGS  = -O2 -DHAS_SHADOW
LFLAGS  =
OBJECTS = poppassd.o
LIBS    = -lshadow
と、コメントを削除します。

make でエラーがでる場合。

筆者の環境では make でエラーが出ました。 エラーメッセージは
poppassd.c:137: shadow/pwauth.h: No such file or directory
でした。
poppassd.c ソースの 137 行の #include 文でインクルードしてるヘッダファイルが無いというエラーです。
その行の内容は
#include <shadow/pwauth.h>
poppassd.c では shadow/pwauth.h に含まれている関数定数の定義は使用していませんのでコメントアウトしてしまえば問題は無くなります。
/* #include <shadow/pwauth.h> */
shadow/pwauth.h は shadow で使用されるヘッダです。
ソースを触らずにコンパイルを通したい場合は shadow のソースをインストールすれば大丈夫です。
筆者は shadow のソース shadow-971001.tar.gz を展開し、lib/pwauth.h を /usr/include/shadow/ にコピーしました。

poppassd のテスト方法

サーバで
telnet localhost 106
して poppassd に接続します。
あとはプロトコルを手で入力して確かめましょう。

成功例です。
trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
200 kiwi poppassd v1.2 hello, who are you?
user hogehoge
200 your password please.
pass pswd1234
200 your new password please.
newpass newpass0
200 Password changed, thank-you.
quit
200 Bye.
Connection closed by foreign host.

現在のパスワードが正しくない場合の例。
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
200 kiwi poppassd v1.2 hello, who are you?
user hogehoge
200 your password please.
pass pswd1233(正しくないパスワード)
200 your new password please.
newpass newpass0
500 Invalid user or password
Connection closed by foreign host.

poppassd 1.2 は 親切な /usr/bin/passwd と相性が悪い?の解決法

newpass で新しいパスワードを入力する時に6文字未満のパスワードや数字の混ざっていないパスワード等、好ましくないパスワードを入力した場合にフリーズしませんでしたか?
もしフリーズしたのであればその原因は poppassd がパスワードを変更するのに /usr/bin/passwd を使用していて [too short] [no change] [palindrome]等のチェックをしていて poppassd がそのエラーメッセージに対応していないからです。
対応するためのパッチを作りましたので poppassd.c に
patch -p1 poppassd.c passwd_solalis.pat
を実行して以下のパッチをあててください。


diff -u --recursive --new-file poppassd.c poppassd+pat.c
--- poppassd.c  Wed Jan  7 12:49:43 1998
+++ poppassd+pat.c      Tue Jan  6 14:01:47 1998
@@ -182,6 +182,7 @@
    {
      "enter new password: ",                   /* non-shadow passwords */
      "changing password for *\nnew password: ",        /* shadow passwords     */
+     "*\nnew password: ",      /* solalis passwd     */
      ""
    };


たぶんこれでフリーズしなくなるはずです。
確証は有りませんので各自の判断にまかせます。動作報告等を筆者は欲しいです。

NIS を使用している場合

サーバが NIS を使用している場合は /usr/bin/passwd コマンドに -y オプションを付ける必要があります。
   execl("/usr/bin/passwd", "passwd", user, (char*)0);

   execl("/usr/bin/passwd", "passwd", "-y", user, (char*)0);
にすれば大丈夫なはずです。(未確認)

対応するためのパッチは以下のようになると思います。
patch -p1 poppassd.c passwd_yp.pat
を実行して以下のパッチをあててください。


diff -u poppassd.c poppassd+nis.c
--- poppassd.c  Wed Jan  7 14:49:06 1998
+++ poppassd+nis.c      Tue Jan  6 14:01:47 1998
@@ -448,8 +448,8 @@
  */

 #ifdef HAS_SHADOW
-   execl("/bin/passwd",     "passwd", user, (char*)0);
-   execl("/usr/bin/passwd", "passwd", user, (char*)0);
+   execl("/bin/passwd",     "passwd", "-y", user, (char*)0);
+   execl("/usr/bin/passwd", "passwd", "-y", user, (char*)0);
 #else

 /*
@@ -460,8 +460,8 @@
    setregid (pw->pw_gid, pw->pw_gid);
    setreuid (pw->pw_uid, pw->pw_uid);

-   execl("/bin/passwd",     "passwd",       (char*)0);
-   execl("/usr/bin/passwd", "passwd",       (char*)0);
+   execl("/bin/passwd",     "passwd", "-y",       (char*)0);
+   execl("/usr/bin/passwd", "passwd", "-y",       (char*)0);
 #endif

    syslog(LOG_ERR, "can't exec /bin/passwd: %m");

poppassd 関連のリンク

本家 qualcomm http://ftp.qualcomm.com/
デビアン http://www.il.debian.org/
p-chng http://www.nets.or.jp/~chaya/

筆者メールアドレス等

名前    :田中 啓(たなか ひらく)
電子メール :mailto:pegira@po.jah.ne.jp
ホームページ:http://www.jah.ne.jp/~pegira/

name:Tanaka Hiraku ([family name] [last name])
e-mail:mailto:pegira@po.jah.ne.jp
WebPage:http://www.jah.ne.jp/~pegira/

[戻る] [TOP]
last update [1997/4/28]