fc2ブログ

qmail + tcpserver + vpopmailにmagic-smtpdを導入

バージョンは↓

OS:RHEL5
qmail:netqmail-1.06
tcpserver:ucspi-tcp-0.88
vpopmail:5.4.25
magic-smtpd:0.8.4-2

コンパイル↓
# tar zxf magic-smtpd-0.8.4-2.tar.gz
# cd magicmail-0.8.4-2
# cp -p magic-smtpd/magic-smtpd.h magic-smtpd/magic-smtpd.h.YYYYMMDD
magic-smtpd/magic-smtpd.h 42行目「extern lm_string_t smtp_from_addr;」をコメントアウト
# make

設定・配置など↓
# mkdir -p /etc/magic-mail/control
# ./magic-smtpd/magic-smtpd -s

DEBUG: loading controls from environment
where | option | value
------------------------------------------------------------
environ | tcpremoteip | (null)
environ | tcplocalip | (null)
environ | tcpremotehost | (null)
environ | tcpremoteinfo | (null)
environ | tcprelayclient | (null)

DEBUG: loading controls from directory: /etc/magic-mail/control
where | option | value
------------------------------------------------------------
default | auth_enable | 0
default | check_valid_from | 0
default | check_valid_users | 0
default | dump_core | 0
default | dynamic_dns_regex_filename | /etc/magic-mail/control/dynamic_dns_regexes
default | ext_check_passwd_prog | (null)
default | ext_check_user_prog | (null)
default | ext_spam_rule_prog | (null)
default | ip2country_datadir | /usr/local/share/perl/5.6.1/IP/Country/Fast
default | max_hops | 100
default | max_invalid_rcpt | 0
default | max_line_length | 1024
default | max_rcpt | 0
default | max_smtp_cmds | 0
default | qmail_queue | /var/qmail/bin/qmail-queue
default | rcpt_delay_at | 0
default | rcpt_delay_inc | 0
default | rcpt_delay_max | 0
default | rfc_addr_only | 0
default | stray_newline_detection | 1
default | spam_check_enable | 0
default | spam_log_file | (null)
default | spam_rule_dbfile | /etc/magic-mail/dbfiles/spam.db
default | tls_cadir | /etc/ssl/certs
default | tls_cafile | (null)
default | tls_certificate | /etc/magic-mail/control/cert.pem
default | tls_dhparams | /etc/magic-mail/control/dh.pem
default | tls_enable | 0
default | tls_keyfile | /etc/magic-mail/control/cert.pem
default | tls_password | (null)
default | use_dbfile | 0
default | user_info_dbfile | /etc/magic-mail/dbfiles/user.db

DEBUG: loading controls from directory: /var/qmail/control
where | option | value
------------------------------------------------------------
loaded | defaultdomain | hogehoge.com
loaded | me | mail.hogehoge.com
default | smtpgreeting | MagicMail Daemon with Built-In Anti-Spam\See http://www.linuxmagic.com for info
default | databytes | 2147483646
default | timeoutsmtpd | 1200
default | badmailfrom | (null)
loaded | rcpthosts | [hogehoge.com][hugehuge.com]hegehege.com]

# cd /etc/magic-mail/
# mkdir bin
# cd SRC_ROOT/magicmail-0.8.4-2/
# cp scripts/vpopmail-check-user.sh /etc/magic-mail/bin/. ← vpopmail用のユーザ存在チェックスクリプト
# chmod 755 /etc/magic-mail/bin/vpopmail-check-user.sh
# cd /etc/magic-mail/control/
# echo 'on' > check_valid_users ← ユーザ存在チェックを有効
# echo '/etc/magic-mail/bin/vpopmail-check-user.sh' > ext_check_user_prog ← ユーザ存在チェックスクリプトを設定
# cd SRC_ROOT/magicmail-0.8.4-2/
# cp magic-smtpd/magic-smtpd /var/qmail/bin/.
# chown root:qmail /var/qmail/bin/magic-smtpd

qmail停止↓
# /etc/init.d/qmail stop

qmail-smtpdとmagic-smtpdを入れ換え↓
# cd /var/qmail/bin
# mv -i qmail-smtpd qmail-smtpd.old
# ln -s /var/qmail/bin/magic-smtpd /var/qmail/bin/qmail-smtpd

qmail開始↓
# etc/init.d/qmail start

で、試しにhoge@hogehoge.comにメールを送ってみたところ、↓みたいなメールが返ってくる。
Your message cannot be delivered to the following recipients:

Recipient :hoge@hogehoge.com
Reason :550 User does not exist

ユーザの存在チェックにうまくいってないらしい。

よく考えると、qmail-smtpdはtcpserverのオプション-u 502 -g 501を指定して起動してる。

つまり、このプロセスからユーザ存在チェックのために実行される
vpopmail-check-user.shはuid=502、gid=501で正常動作しなければならない。

が、vpopmail-check-user.sh自体のパーミッションは755なんだけど、
最終的にチェックされるであろう/home/vpopmail/domains/hogehoge.com/ディレクトリのオーナー、パーミッションを見ると
drwx------ 4 vpopmail vchkpw 4096 Jul 24 2009 hoghoge.com
とかなってる。

uid=502(qmaild) gid=501(nofiles)
uid=601(vpopmail) gid=601(vchkpw)
だから、これじゃあチェックできるわけがない。

結局どこかのオーナーやらパーミッションを変更しなければいけないわけだけど、
vchkpw vpopmail-check-user.sh
のユーザ・グループをvpopmail・vchkpwにして、setuidしてみた。

# cd /etc/magic-mail/bin
# chown vpopmail:vchkpw vpopmail-check-user.sh
# chmod 4755 vpopmail-check-user.sh

うまくいくかと思ったけどダメ。Linuxではスクリプトのsetuid/setgidは無視される。

で、結局vpopmail-check-user.shの中ではvaliasとvuserinfoを呼び出しているわけで、こいつらのユーザ・グループはvpopmail・vchkpw。しかもバイナリ。
なので、こいつらをsetuid。

# cd /home/vpopmail/bin
# chmod 4755 valias
# chmod 4755 vuserinfo

valiasはうまく動作するけど、vuserinfoは
Error: unable to setuid
とかエラーが出てうまくいかない。

# strace -f -F -o hoge.dat ./vuserinfo hoge@hogehoge.com
とかやって、hoge.datを調べてみると、
32312 setgid32(601) = -1 EPERM (Operation not permitted)
ていう箇所が見つかる。setgidで失敗しているわけだ。

なのでsetuid/setgid両方やればOKっぽい。

ということで、
# chmod 6755 vuserinfo

これでうまくいく … … と思っていたら、vpopmail-check-user.shの中身は↓みたいになっていて

#!/bin/sh

EMAIL=$1
ALIAS=`/home/vpopmail/bin/valias $EMAIL | wc -l | grep "1" >/dev/null 2>&1 ; echo $?`
USER=`/home/vpopmail/bin/vuserinfo $EMAIL >/dev/null 2>&1; echo $? | grep "0" >/dev/null 2>&1 ; echo $?`

if [ $ALIAS -eq 0 ] || [ $USER -eq 0 ]; then
exit 0
else
exit 1
fi

これだと、valiasが1行しか返さないことを前提としているから、.qmail-aliasに複数の転送先を書くと間違ったチェック結果になる。
なので、

#!/bin/sh

EMAIL=$1
ALIASRET=`/home/vpopmail/bin/valias $EMAIL >/dev/null 2>&1 ; echo $?`
ALIASNUM=`/home/vpopmail/bin/valias $EMAIL | wc -l`
USER=`/home/vpopmail/bin/vuserinfo $EMAIL >/dev/null 2>&1; echo $? | grep "0" >/dev/null 2>&1 ; echo $?`

if [ $ALIASNUM -ge 1 ] && [ $ALIASRET -eq 0 ] || [ $USER -eq 0 ]; then
    exit 0
else
    exit 1
fi

みたいにした。
スポンサーサイト



Template Designed by DW99