« ODF Add-in for Word 2007 Version 1.0 is releasedバカンス海外旅行持ち物備忘録 »

Debian sargeでdovecot(IMAP), qpopper(APOP), postfix(SMTP Auth)パスワード同期

2007/02/26

  00:30:58 by , Categories: Freesoftware and Open Source Software, Linux

Debian Sargeでは、Postfixバージョンが2.1.5なので、dovecot SASLには対応していない。
また、pop-before-SMTP をパッケージだけで簡単に実現するには、qpopperしかない。

しかしながら、セキュリティを考えるとPOP3よりAPOPを使いたい。dovecotではcram-md5を認証スキームとして使いたい(一部のMUAはimap認証でcram-md5しかサポートしないらしい)

このようなニーズ(ごく限定されているが)に答えるため、以下のようなスクリプトを作成した。


#! /bin/sh
#
# popasswd version 1.0 written by Hiroshi Miura
# Copyright (C) 2007 Hiroshi Miura miurahr@acm.org
# This program is lisenced by GNU GPL v2.0 and after
#
# usage: popasswd [-v] [-c] <username>

DOVECOTPW=/usr/local/sbin/dovecotpw
DOVECOT_PASSWD_FILE=/etc/dovecot/imap-passwd
REALM=example.com
TMP=/tmp
FLAG=

if [ "$1" == "-c" ]; then
UNAME=$2
FLAG="-c"
else
UNAME=$1
fi

if [ "$UNAME" == "" ]; then
echo "Usage: $0 [-c] <username>"
echo " -c: create post office user"
exit 1
fi

read -p "Please enter password for ${UNAME}:" -s PASSWD
echo
read -p "Re-enter new password:" -s REPASSWD
echo

if [ $PASSWD != $REPASSWD ]; then
echo "Error: two password is differed!"
exit 1
fi


# change APOP password for qpopeer
if popauth -user $UNAME $PASSWD; then
HMACPASSWD=`$DOVECOTPW -s HMAC-MD5 -u $UNAME -p $PASSWD`

# test existence of user in passwd-file
if (egrep -q "^${UNAME}:" $DOVECOT_PASSWD_FILE); then
# modify Dovecot password file(CRAM-MD5)
cp -p $DOVECOT_PASSWD_FILE ${TMP}/popasswd.$$
sed -e "s/^${UNAME}:.*/${UNAME}:${HMACPASSWD}/" ${TMP}/popasswd.$$ > $DOVECOT_PASSWD_FILE
rm -f ${TMP}/popasswd.$$ ${TMP}/popasswd_sed_script.$$
else
# add user to Dovecot password file
echo "${UNAME}:${HMACPASSWD}" >> $DOVECOT_PASSWD_FILE
fi

# change postfix(cyrus SASLv2) passwd file
saslpasswd2 ${FLAG} -p -u ${REALM} ${UNAME} << _EOL_
${PASSWD}
_EOL_
fi

popauthは、qpopperのAPOPパスワードを生成するコマンド。
saslpasswd2は、libsasl2のパスワードデータベースを更新するコマンド。
dovecotpwは、dovecotのpasswd like fileのパスワードを生成するコマンドである。

このスクリプトをつかうことにより、APOPとSMTP AUTHとIMAPのパスワードが同期できる。

Trackback address for this post

Trackback URL (right click and copy shortcut/link location)

4 comments

Comment from: tsekine [Visitor]  
tsekine

勝手に採点しました(汗

if [ $PASSWD != $REPASSWD ]; then
のところは変数を “” で quote しないと、もしパスワードが "-x /bin/sh" とかだとエラーになるやもしれません。

あと、read-p オプションは bash specific かもです。

2007/03/02 @ 01:19
Comment from: [Member]
momokuri

たしかに、shell script内での文字列比較はquote必須でした。
readのオプションも確かにそのとおり。

やっぱ、echo -n “hoge"してからreadが作法としてはいいということですね。

2007/03/18 @ 20:28
Comment from: [Member]
momokuri

他には、readの-sオプションも怪しいし、if [ “” = “” ]はほんとは if [x"$hoge” = x"$fuga” ]が望ましいですね。

2007/03/18 @ 20:46
Comment from: [Member]
momokuri

ところで、popauthはsuidされていて、一般ユーザは自身のパスワードを変更できるのだが、このスクリプトでは、


HMACPASSWD=`$DOVECOTPW -s HMAC-MD5 -u $UNAME -p $PASSWD`

# test existence of user in passwd-file
if (egrep -q "^${UNAME}:" $DOVECOT_PASSWD_FILE); then
# modify Dovecot password file(CRAM-MD5)
cp -p $DOVECOT_PASSWD_FILE ${TMP}/popasswd.$$
sed -e "s/^${UNAME}:.*/${UNAME}:${HMACPASSWD}/" ${TMP}/popasswd.$$ > $DOVECOT_PASSWD_FILE
rm -f ${TMP}/popasswd.$$ ${TMP}/popasswd_sed_script.$$
else
# add user to Dovecot password file
echo "${UNAME}:${HMACPASSWD}" >> $DOVECOT_PASSWD_FILE

なんてことをしているものだから、一般ユーザにパスワード変更させることができない。
saslpasswd2も然り。

2007/03/18 @ 21:02

This post has 7 feedbacks awaiting moderation...


Form is loading...