必要パッケージ: qmail-1.03.tar.gz + qmail-0.0.0.0.patch + qmail-smtpd-relay-reject.patch + qmail-date-localtime.patch + qmail-smtpd-auth-0.31 daemontools,tcpserver,vpopmailをあらかじめインストールしていること。 qmail + vpopmailにて以下の機能を実現します。 ・バーチャルドメイン対応 SMTPサーバ ・バーチャルユーザ対応 POPサーバ ログインアカウントと独立したPOPアカウント。loginアカウント無しでPOPが利用可能。 ・APOP,SMTP-AUTH対応 実現される環境は、例えば以下のとおり メイルアドレス : takemru@e-doraku.com SMTPサーバ : mail.e-doraku.com POPサーバ : mail.e-doraku.com POP/SMTP-AUTHユーザ名 : takemaru%e-doraku.com (ユーザ名+"%"+ドメイン名) /// qmail用のUID,GIDを準備 /// % su root # groupadd nofiles # useradd alias -g nofiles -d /var/qmail/alias -s /sbin/nologin # useradd qmaild -g nofiles -d /var/qmail -s /sbin/nologin # useradd qmaill -g nofiles -d /var/qmail -s /sbin/nologin # useradd qmailp -g nofiles -d /var/qmail -s /sbin/nologin # groupadd qmail # useradd qmailq -g qmail -d /var/qmail -s /sbin/nologin # useradd qmailr -g qmail -d /var/qmail -s /sbin/nologin # useradd qmails -g qmail -d /var/qmail -s /sbin/nologin # mkdir /var/qmail # exit /// source 展開、パッチをあてる /// % tar zxvf qmail-1.03.tar.gz % cd qmail-1.03 Bug対応リコメンドパッチ % patch -s -p1 < ../qmail-0.0.0.0.patch 宛て先アドレスのユーザ名部(@domain.nameの左値)に"@","%","!"が 含まれている場合の対応パッチ % patch < ../qmail-smtpd-relay-reject.patch ヘッダにJST時間帯にするパッチ % patch -s -p1 < ../qmail-date-localtime.patch SMTP-AUTH対応パッチ % tar zxvf qmail-smtpd-auth-0.31.tar.gz % cp qmail-smtpd-auth-0.31/base64.* qmail-1.03 % cp qmail-smtpd-auth-0.31/README.auth qmail-1.03 % cp ../qmail-smtpd-auth-0.31/base64.* . % patch < ../qmail-smtpd-auth-0.31/auth.patch "@","%","!"パッチ対応分に手動で1行追加 ユーザ名部にコントロールコードが入れられた場合の対応 実際にこのようなメイル攻撃を受けたので。 % cd qmail-smtpd.c qmail-smtpd.c.org % vi qmail-smtpd.c ----- ... int addrrelay() { int j; j = addr.len; while(--j >= 0) if (addr.s[j] == '@') break; if (j < 0) j = addr.len; while(--j >= 0) { if (addr.s[j] == '@') return 1; if (addr.s[j] == '%') return 1; if (addr.s[j] == '!') return 1; if (addr.s[j] <= 0x20) return 1; <-- 追加 } return 0; } ... ----- デフォルトのまま/var/qmailにインストールします % make % make man % su root # make setup # make check /// 設定ファイル作成 /// # ./config-fast micropc.e-doraku.com Putting micropc.e-doraku.com into control/me... Putting e-doraku.com into control/defaultdomain... Putting e-doraku.com into control/plusdomain... Putting micropc.e-doraku.com into control/locals... Putting micropc.e-doraku.com into control/rcpthosts... # cd ~alias # foreach FILE (.qmail-postmaster .qmail-mailer-daemon .qmail-root) ? echo "&takemaru@e-doraku.com" > $FILE ? end # chown alias .qmail-* # chgrp qmail .qmail-* # chmod 644 .qmail-* # cd ~root # /var/qmail/bin/maildirmake Maildir /// 起動の準備 /// ディレクトリの整理。以下のディレクトリがポイントです。 /var/qmail/supervise/qmail-send -> /service/qmail-send /var/qmail/supervise/qmail-smtpd -> /service/qmail-smtpd /var/qmail/supervise/qmail-send/log/main /var/qmail/supervise/qmail-smtpd/log/main # mkdir /service # chmod 755 /service # mkdir /var/qmail/supervise qmail-sendの起動準備 # mkdir /var/qmail/supervise/qmail-send # vi /var/qmail/supervise/qmail-send/run ----- #!/bin/sh exec env - PATH="/var/qmail/bin:/usr/local/bin" qmail-start ./Maildir/ ----- # mkdir /var/qmail/supervise/qmail-send/log # vi /var/qmail/supervise/qmail-send/log/run ----- #!/bin/sh exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t s100000 n20 ./main ----- # chown -R qmaill.nofiles /var/qmail/supervise/qmail-send # chmod +t /var/qmail/supervise/qmail-send # chmod 751 /var/qmail/supervise/qmail-send/run # chmod 751 /var/qmail/supervise/qmail-send/log/run # ln -s /var/qmail/supervise/qmail-send/log/main /var/log/qmail-send qmail-smtpd (with smtp-auth) の起動準備 # mkdir /var/qmail/supervise/qmail-smtpd # vi /var/qmail/supervise/qmail-smtpd/run ----- #!/bin/sh exec /usr/local/bin/tcpserver -v -p -R -u vpopmail -g vchkpw \ -x /var/qmail/tcprules/smtp.cdb 0 smtp /var/qmail/bin/qmail-smtpd \ e-doraku.com /var/vpopmail/bin/vchkpw /usr/bin/true 2>&1 ----- smtp-auth対応済みqmail-smtpdの認証方式として、vpopmailの認証プログラムを 利用するのがポイントです。 # mkdir /var/qmail/supervise/qmail-smtpd/log # vi /var/qmail/supervise/qmail-smtpd/log/run ----- #!/bin/sh exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t s100000 n20 ./main ----- # chown -R qmaill.nofiles /var/qmail/supervise/qmail-smtpd # chmod +t /var/qmail/supervise/qmail-smtpd # chmod 751 /var/qmail/supervise/qmail-smtpd/log/run # chmod 751 /var/qmail/supervise/qmail-smtpd/run # ln -s /var/qmail/supervise/qmail-send/log/main /var/log/qmail-smtpd /// アクセスコントロール /// qmailのリレイコントロールはtcpserverの協力によって実現します # mkdir /var/qmail/tcprules # vi /var/qmail/tcprules/smtp ----- 127.0.0.1:allow,RELAYCLIENT="" AAA.BBB.CCC.DDD:allow,RELAYCLIENT="" (自分のIPアドレス) EEE.FFF.GGG.HHH:allow,RELAYCLIENT="" (リレイを許すホストのアドレス) all:allow ----- # tcprules /var/qmail/tcprules/smtp.cdb /var/qmail/tcprules/smtp.tmp < /var/qmail/tcprules/smtp # tcprulescheck /var/qmail/tcprules/smtp.cdb AAA.BBB.CCC.DDD ( access check ) tcpserver自身でアクセスを拒否するわけではないので最後は"all:allow"でOKです。 qmailは変数RELAYCLIENTが設定されているか否かでリレイ可能かどうかを判断します。 /// sendmailの停止 for NetBSD /// # vi /etc/rc.conf ----- ... # sendmail=NO ----- # killall -HUP sendmail # /usr/sbin/sendmail -q # chmod 0 /usr/sbin/sendmail # mv /usr/sbin/sendmail /usr/sbin/sendmail.org # chmod 0 /usr/bin/mail # ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail /// qmailの起動 /// /service 以下にリンクを張ることによって daemontoolsの管理下に 入り、自動的に起動されます。 # ln -s /var/qmail/supervise/qmail-send /service/qmail-send # ln -s /var/qmail/supervise/qmail-smtpd /service/qmail-smtpd /// 動作確認 /// % ps -auxw | grep qmail % telnet localhost smtp | Trying 127.0.0.1... | Connected to localhost. | Escape character is '^]'. | 220 micropc.e-doraku.com ESMTP | EHLO localhost | 250-micropc.e-doraku.com | 250-AUTH LOGIN CRAM-MD5 PLAIN | 250-AUTH=LOGIN CRAM-MD5 PLAIN | 250-PIPELINING | 250 8BITMIME | mail | 250 ok | rcpt | 250 ok | data | 354 go ahead | Subject: test | | This is a test. | . | 250 ok 1046485141 qp 26782 | quit | 221 micropc.e-doraku.com | Connection closed by foreign host. /// 運用メモ /// svscan -> /servive/qmail-smtpd (supervise-qmail-smtpd) -> /servive/qmail-send (supervise-qmail-send) /usr/local/bin/supervise /service/qmail-smtpd & (サービス開始) /usr/local/bin/svstat /service/qmail-smtpd (stat) /usr/local/bin/svc -u /service/qmail-smtpd (up) /usr/local/bin/svc -d /service/qmail-smtpd (down) /usr/local/bin/svc -dx /service/qmail-smtpd (サービス停止。その5秒後に起動) サービス完全停止 # cd /service/qmail-smtpd # mv /service/qmail-smtpd /service/.qmail-smtpd # svc -dx . log