2012年7月16日月曜日

CentOS 6.2 postfix + Dovecot + DRAC + drac plugin で pop beroe smtp

最近、pop before smtp をやりたいって話は聞かなくなってたんですが、頑なに pop before smtp にこだわる方が居たので調べてみました。

最近は、perlベースの Pop-before-smtp を使うのがはやりっぽいですね。

試してみると、maillogを監視してて、popの認証ログをベースに動くから、pop認証後にメールが送れるようになるまで、時間が掛りすぎました。


それで、昔ながらのDRACを使ってみようと思った次第です。

popしてから、メールの送信が許可されるまでの遅延が気にならなければ、 perl ベースの pop-before-smtp が簡単で良いかもしれません。



DRAC と dovecot、postfixの関係はこんな感じです

  1. dovecotでpop/imapの認証が成功
  2. dovecotからdrac_pluginが呼び出される
  3. drac_pluginはdracdにデータベースの更新を依頼
  • postfixはdracdが作成したデータベースを、中継可否を判断するデータベースとして利用する
動きは単純ですね。


導入の流れはこんな感じ

  1. BerkeleyDBの導入
  2. Dovecot-develの導入
  3. DRACの導入
  4. dovecot drac_pluginの導入
  5. dovecot がdrac_pluginを使うように設定
  6. postfix が、DRACが管理しているデータベースを参照するように設定

手順はこんな感じです

BerkeleyDB/Dovecot-develの導入
[root@cent6 ~]# yum install db4-devel dovecot-devel

DRACの導入
[root@cent6 ~]# mkdir drac
[root@cent6 ~]# mv drac.tar.Z drac
[root@cent6 ~]# cd drac
[root@cent6 drac]# tar zxf drac.tar.Z
[root@cent6 drac]# vi Makefile

#### Makefile for drac

## Tuneables

# Paths

##INSTALL = /usr/ucb/install
INSTALL = install
EBIN = /usr/local/sbin
MAN = /usr/local/man/man

# OS-Dependant settings

# Choose one of this pair...
# -DTI_RPC # Transport-independant RPC
# -DSOCK_RPC # Socket RPC

# Choose one of this pair...
# -DFCNTL_LOCK # fcntl() locking
# -DFLOCK_LOCK # flock() locking

# Choose one of this pair...
# -DSYSINFO # hostname from sysinfo()
# -DGETHOST # hostname from gethostname()

# If rpcgen -C is specified below...
# -DDASH_C # ANSI-C mode

# Settings for postfix and exim

# Do not set these for sendmail
# -DREQ_HASH # requires hash format
# -DCIDR_KEY # keys in CIDR format
# -DTERM_KD # keys and data nul-terminated

##DEFS = -DTI_RPC -DFCNTL_LOCK -DSYSINFO
DEFS = -DSOCK_RPC -DFCNTL_LOCK -DGETHOST -DDASH_C -DTERM_KD

# Compiler flags
CC = gcc
RANLIB = :
##CFLAGS = $(DEFS) -g -I/usr/local/src/db/db-4.1.25/build_unix
CFLAGS = $(DEFS) -g -fPIC
#CFLAGS = $(DEFS) -g -I/usr/local/src/db/db-3.1.17/build_unix
#CFLAGS = $(DEFS) -g -I/usr/local/src/db/db-2.4.14/Unix
#CFLAGS = $(DEFS) -g -I/usr/local/src/db/db.1.85/PORT/sunos.5.2/include
##LDLIBS = -L/usr/local/src/db/db-4.1.25/build_unix -lnsl -ldb-4.1
LDLIBS = -ldb
#LDLIBS = -L/usr/local/src/db/db-3.1.17/build_unix -lnsl -ldb
#LDLIBS = -L/usr/local/src/db/db-2.4.14/Unix -lnsl -ldb
#LDLIBS = -L/usr/local/src/db/db.1.85/PORT/sunos.5.2 -lnsl -ldb
##TSTLIBS = -L. -ldrac -lnsl
TSTLIBS = -L. -ldrac
##RPCGENFLAGS =
RPCGENFLAGS = -C -I
#RPCGENFLAGS = -C

# Man sections
MANLIB = 3
##MANADM = 1m
MANADM = 8

~~~~~~~~~~~~~~~~~

[root@cent6 drac]# make
[root@cent6 drac]# make install
install -c -o bin -g bin -m 0755 rpc.dracd /usr/local/sbin
[root@cent6 drac]# cp drac.h /usr/local/include/
[root@cent6 drac]# cp libdrac.a /usr/local/lib

dovecot drac_pluginの導入
[root@cent6 drac]# cd ../dovecot2-drac
[root@cent6 dovecot2-drac]# vi Makefile

##DOVDIR:=../dovecot-2.0.13
DOVDIR:= /usr/include/dovecot
LIBS:=-ldrac
LDFLAGS:=-L/usr/local/lib

CFLAGS=-Wall -W -shared -fPIC -DHAVE_CONFIG_H -I$(DOVDIR) \
        -I$(DOVDIR)/src/lib \
        -I$(DOVDIR)/src/lib-index \
        -I$(DOVDIR)/src/lib-mail \
        -I$(DOVDIR)/src/lib-storage \
        -I$(DOVDIR)/src/lib-storage/index \
        -I$(DOVDIR)/src/lib-storage/index/maildir

all: drac_plugin.so

drac_plugin.so: drac-plugin.c
        $(CC) $(CFLAGS) $(LDFLAGS) $< -o $@ $(LIBS)

clean:
        @rm -f *.so *.o

[root@cent6 dovecot2-drac]# make

cc -Wall -W -shared -fPIC -DHAVE_CONFIG_H -I/usr/include/dovecot -I/usr/include/dovecot/src/lib -I/usr/include/dovecot/src/lib-index -I/usr/include/dovecot/src/lib-mail -I/usr/include/dovecot/src/lib-storage -I/usr/include/dovecot/src/lib-storage/index -I/usr/include/dovecot/src/lib-storage/index/maildir -L/usr/local/lib drac-plugin.c -o drac_plugin.so -ldrac

32bitの場合
[root@cent6 dovecot2-drac]# cp -pi drac_plugin.so /usr/lib/dovecot/

64bitの場合
[root@cent6 dovecot2-drac]# cp -pi drac_plugin.so /usr/lib64/dovecot/


dovecotの設定変更
[root@cent6 dovecot2-drac]# vi /etc/dovecot/conf.d/10-mail.conf

# Space separated list of plugins to load for all services. Plugins specific to
# IMAP, LDA, etc. are added to this list in their own .conf files.
#mail_plugins =
mail_plugins = drac


[root@cent6 dovecot2-drac]# vi /etc/dovecot/conf.d/90-plugin.conf

plugin {
  #setting_name = value
dracdserver = localhost
dracdtimeout = 60
}

[root@cent6 dovecot2-drac]#

dracの起動
[root@cent6 dovecot2-drac]# /usr/local/sbin/rpc.dracd -e 5 /etc/postfix/drac.db

-e 5 : DRACのデータベースでの存在期間(min)
/etc/postfix/drac.db : データベースファイルの場所
※rpc.dracdが起動できない場合、rpcbindが導入・起動されていることを確認してください。

dracd起動ファイルの例
#!/bin/bash
# chkconfig: - 90 25
### BEGIN INIT INFO
# Provides: rpcdrac
# Short-Description: Dynamic Relay Authorization Control
# Description: Dynamic Relay Authorization Control
### END INIT INFO

. /etc/rc.d/init.d/functions
prog="/usr/local/sbin/rpc.dracd"
timeout="5"
conf="/etc/postfix/drac.db"
pidfile="/var/run/rpc.dracd.pid"

RETVAL=0

start() {
echo -n "Starting $prog:"
daemon $prog -e $timeout $conf
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch $pidfile
return $RETVAL
}
stop() {
echo -n "Stopping $prog:"
killproc $prog
RETVAL=$?
echo
rm -f $pidfile
return $RETVAL
}
case $1 in
start ) start ;;
stop ) stop ;;
restart) stop && start ;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac


postfixの設定変更
※下の方法だけじゃなくて、いろんな参照のさせ方があると思います。
[root@cent6 dovecot2-drac]#  vi /etc/postfix/main.cf


mynetworks = check_client_access btree:/etc/postfix/drac


[root@cent6 dovecot2-drac]#

と、こんな感じでした。


2015/7/12 追記
・以下のエラーに対応

[root@cent6-64 dovecot2-drac]# make
cc -Wall -W -shared -fPIC -DHAVE_CONFIG_H -I/usr/include/dovecot -I/usr/include/dovecot/src/lib -I/usr/include/dovecot/src/lib-index -I/usr/include/dovecot/src/lib-mail -I/usr/include/dovecot/src/lib-storage -I/usr/include/dovecot/src/lib-storage/index -I/usr/include/dovecot/src/lib-storage/index/maildir -L/usr/local/lib drac-plugin.c -o drac_plugin.so -ldrac
/usr/bin/ld: /usr/local/lib/libdrac.a(dracauth.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libdrac.a: could not read symbols: Bad value
collect2: ld はステータス 1 で終了しました
make: *** [drac_plugin.so] エラー 1
[root@cent6-64 dovecot2-drac]#

・起動ファイルサンプル追加