qmail+vpopmai+ClamAV+SpamAssassin+simscanでメールサーバ構築[インストール編]

FreeBSD, mail No Comments

メールサーバの運営って難しいですよね?SPAM攻撃にさらされますし、ちょっとした設定ミスでメールの受け取りや送信が出来なくなるし、受信が出来なくなるだけならまだしもSPAM発信基地となってしまう可能性もあるわけです。そのため高額なメールアプライアンスサーバーいろんな場所で活躍しています。

しかしながら個人用途でそのような専用の機器はなかなか利用出来ません。ですがFreeBSDやLinuxでも「がんばれば!」負けないくらいのメールサーバが構築出来るハズ、と自分を励ましつつ構築・運営を行ってきました。そこでせっかくですから自分なりのノウハウというかメールサーバ構築方法を公開?したいと思います。

今回の構築に当たって使用するソフトウェアは
qmail+vpopmai+ClamAV+SpamAssassin+simscan
を利用します。最近ではpostfixを用いてサーバ構築を行っているのですが今回は過去経緯よりqmailを用います。もう一点、自分がvpopmailが好きであるという理由も大きいのですが。

まずqmailの弱点を考えてみましょう。自分が考えるqmailの弱点は、

その1 ・指定されたメールアドレスを有するユーザがサーバ上に存在するかしないかにかかわらず
        「とりあえず」 受け取ってしまう。
       ・受け取ったメールに対してエラーメールを発信してしまう。
     ・SPAMの場合、偽装された送り主にエラーメールが送られてしまう。
その2 ・double bounce (ダブルバウンス)が #@[] という不正なメールアドレスで送信される。
その3 ・メール1つに対してTCP接続/切断が1回起こる。
その4 ・同一ドメインに対して何度も接続/切断が発生する。
その5 ・同一ドメインに対する同時接続数の制限がない。
その6 ・SMTP Auth に非対応
その7 ・TLS 非対応
その8 ・IPv6 非対応

特に問題なのが1で、qmailサーバでディクショナリーアタックを受けるとサーバのCPUパワーを空費し、バウンズ不可能な不達通知メールでキュー溢れをおこしてしまいます。実際、過去何回か痛い目を見ました。。。。。

そこで現在のネット環境に合わせて

・SUBMISSIONポートによるメール送信をサポート。
・SUBMISSION利用時はSMTP認証を必須。
・POP before SMTPをサポート[25番ポート利用時]
・アカウント管理はmysqlで行う。
・ドメイン単位でのSPAMフィルタ及びウィルスチェックの利用可否設定
・ディクショナリーアタック対策

以上の機能をサポート出来るようにインストール及びソフトウェア設定を行っていきます。オリジナルのqmailでは対応していなのでパッチを当てて機能拡張を行います。その3とその4とその5、及びその8の弱点は今回は無視することとします。

それでは当てるパッチの紹介です。

qmail-1.03.errno.patch
glibc-2.3.1以降に対応するためのパッチ。FreeBSDでは不要だが念のため。

netqmail-1.05-09-msp.patch
RFC2476に従ってSUBMISSIONポートを使用するためのパッチ。

netqmail-qregex-20040601-vrt.patch
qregex-20040601とvalidrcpttoを併用できるように修正されたパッチ。validrcptto ファイルにも正規表現を使えるように拡張されており、今回の肝になるパッチ。Stray Penguin様のサイト(http://www.asahi-net.or.jp/~AA4T-NNGK/index.html)で公開されているのを発見しまして、このたび有り難く使用することにしました。本当に感謝しています。
(qregex-20040601・・・・・badmailfromというファイルを用いてfromヘッダで通知されたメールアドレスを判定、リストにメールアドレスが存在した場合にメール受け取りを拒否するが、そのリストの記入に正規表現が利用できるようにしたパッチ。badmailtoファイルにtoヘッダで通知されたメールアドレスの場合受け取りを拒否出来るようにもなる。むろん正規表現が利用可能)
(validrcptto・・・・・メールサーバでメールを受け取るユーザをvalidrcpttoファイルに記載、記載がないユーザの場合はメールの受け取りを拒否するためのパッチ。今回利用するパッチを使った場合、正規表現が利用可能になる。)

qmail-date-localtime.patch
Received などの行の時刻をローカルタイムにするパッチ。

qmailqueue-patch
境変数QMAILQUEUEを使えるようにするパッチ。simscanでウィルス判定及びSPAM判定を行うため
に必要です。

netqmail-1.05-smtpd-auth-0.31.patch
SMTP認証機能を追加します。 オリジナルのパッチではqmail-smtpd-auth-0.31 を解凍するとできる base64.c, base64.h, README.auth を qmail のソースdir にコピーしてからパッチを行うのですが、一つ一つ当てていくのは大変なのでStray Penguin様のサイトで配布されている、いきなりパッチだけで済むパッチを利用させて頂きます。

FreeBSDで元々あたるパッチ
sendmail-flagf.patch
qmail 付属の sendmail ラッパーを、”-f” オプションで呼んだ時に sendmail 同様に From:ヘッダを設定するように修正するパッチ

qmail-103.patch
DNSに関するUDPパケットが512バイトを超えると処理できなくなる問題の修正パッチ

patch-qmail-1.03-rfc2821.diff
RFC2821 に準拠するようにするパッチ。挨拶時(接続直後とHELO)が結果コード 5xx の場合、永続エラーにしたり、挨拶時(接続直後とHELO)エラーの場合、複数の MX があるなら別の MX を試すようにするらしいです。

事前準備として必要とするパッチをダウンロードしましょう。パッチダウンロード用のフォルダは[/root/qmail-patch]とします。

# mkdir /root/qmail-patch
# cd /root/qmail-patch

# fetch http://pub.kaone.net/public/qmail-1.03.errno.patch
# fetch http://www.ksknet.net/sample/qmail-date-localtime.patch
# fetch http://www.qmail.org/qmailqueue-patch
# fetch http://www.aripollak.com/files/netqmail-1.05-09-msp.patch.txt
# fetch http://www.asahi-net.or.jp/~AA4T-NNGK/codes/netqmail-qregex-20040601-vrt.patch
# fetch http://www.asahi-net.or.jp/~AA4T-NNGK/codes/netqmail-1.05-smtpd-auth-0.31.patch
# mv netqmail-1.05-09-msp.patch.txt netqmail-1.05-09-msp.patch

 

早速、portsを利用してインストールを行っていきましょう。パッチを当ててインストールを行うためにいつもの「make install」ではなく「make patch」コマンドを実行します。
また、コマンド実行時にオプション選択を聞いてきますが「RCDLINK」、つまりリンクを自動で作成するオプション以外はすべて無効にして下さい。一つ一つ手でパッチを当てていきます。

# cd /usr/ports/mail/qmail
# make patch

上記コマンドを実行すると、qmailのソースコードとFreeBSD標準で適応されるパッチをダウンロード、workフォルダに解凍されソースにパッチが適応された状態で中断します。
一つ一つパッチを適応していくこととします。

 

# cd work/qmail-1.03/
# patch -p1 < /root/qmail-patch/netqmail-1.05-09-msp.patch
# patch -p1 < /root/qmail-patch/qmail-date-localtime.patch
# patch -p1 < /root/qmail-patch/netqmail-qregex-20040601-vrt.patch
# patch -p1 < /root/qmail-patch/qmailqueue-patch
# patch -p1 < /root/qmail-patch/qmail-1.03.errno.patch
portsに展開されたファイルへのパッチの適用が終わったら、コンパイルとインストールを続けて行います。

# cd ../..
# make
# make install

インストールが完了したら下記の通りコマンドを入力してsendamilを無効に、qmailを有効にします。
その後「make clean」を実行しましょう。

# /var/qmail/scripts/enable-qmail
# make clean

SUBMISSION用のqmailをビルドします。作業フォルダは[/root/qmail-1.03]とします。上記手順でqmailのインストールを行った場合[/usr/ports/distfiles]配下にqmail用のソースがダウンロードされていますのでそのまま利用します。
# cd /root/
# tar xvzf /usr/ports/distfiles/qmail/qmail-1.03.tar.gz
# cd qmail-1.03/
# patch -p1 < /root/qmail-patch/netqmail-1.05-09-msp.patch
# patch -p1 < /root/qmail-patch/qmail-date-localtime.patch
# patch -p1 < /usr/ports/distfiles/qmail/patch-qmail-1.03-rfc2821.diff
# patch -p1 < /usr/ports/distfiles/qmail/qmail-103.patch
# patch -p1 < /root/qmail-patch/netqmail-1.05-smtpd-auth-0.31.patch

FreeBSDのportsインストールでqmailのインストールを行った場合、「qnofiles」というグループが作成されています。なのでFreeBSD環境に合わせてグループ名を下記の通り書き換えます。

# cp conf-groups conf-groups.org
# ee conf-groups

——————————————————————
qmail    ←1行目
nofiles  ←2行目
——————————————————————
       ↓
——————————————————————
qmail    ←1行目
qnofiles ←2行目
——————————————————————

書き換えが完了したらビルド及びインストールを行います。

# make
# cp -i qmail-smtpd /var/qmail/bin/qmail-smtpd-submission

以上でqmailのインストールは完了しました。続いてウィルスチェックソフトやSPAMフィルターのインストール、POP3サーバのインストール等々、必要とするソフトをインストールしていきます。ここからは手作業でのパッチ当てがないので(多分)幾分、作業が楽です。

最初に「tcpserver」のインストールを行います。tcpserver はqmailを実行するのに使用します。
# cd /usr/ports/sysutils/ucspi-tcp/
# make install clean
ウィルスチェックの為、ClamAV のインストールを行います。
# cd /usr/ports/security/clamav
# make install clean

SPAMフィルターのインストールを行います。
# cd /usr/ports/japanese/p5-Mail-SpamAssassin
# make
# make install clean

オプションは下記の通りです。
WITH_AS_ROOT=true
WITH_SPAMC=true
WITHOUT_SACOMPILE=true
WITHOUT_DKIM=true
WITH_SSL=true
WITH_GNUPG=true
WITHOUT_MYSQL=true
WITHOUT_PGSQL=true
WITH_RAZOR=true
WITHOUT_SPF_QUERY=true
WITHOUT_RELAY_COUNTRY=true

 

# cd /usr/ports/mail/simscan
# make install clean

オプションは下記の通りです。
WITH_CLAMAV=true
WITH_RIPMIME=true
WITH_SPAMD=true
WITHOUT_USER=true
WITH_DOMAIN=true
WITH_ATTACH=true
WITHOUT_DROPMSG=true
WITHOUT_PASSTHRU=true
WITH_HEADERS=true

インストールが完了と同時にspamassassin作業用のディレクトリを作成します。FreeBSDではユーザーnobodyのホームディレクトリが”/nonexistent/”に設定されています。しかしながら実際にはそんなディレクトリは存在しません。単にログインさせないユーザーのホームディレクトリという意味で使用しているようです。(nonexistentは実在しないという意味ですし)

そのままSpamAssassinを実行するとエラーが出ますので下記のようにディレクトリを作成してspamassassinプログラムが読み書き出来るようにディレクトリに権限を付与します。

(ちなみにCentOS5.3ではユーザーnobodyのホームディレクトリは[/]、つまりドキュメントルートに設定されてました。よってLinuxでは下記のディレクトリを作成しなくとも動作可能と思われます)

# mkdir /nonexistent/
# mkdir /nonexistent/.spamassassin/
# chown -R simscan:spamd /nonexistent/.spamassassin

 

引き続きvpopmail のインストールを行います。

vpopmailのセットアップですが、下記2つの要件に対応出来るように設定します。

・アカウント管理にmysqlを利用する
・POP before SMTP が利用できるようにする

ただし現在のインターネット環境を考えるに、SUBMISSION+SMTP認証をためらう理由が見あたらないことから新規にメールサーバを構築する場合は[POP before SMTP]は利用できないようにすべきでしょう。自分が管理しているサーバは過去の経緯よりどうしてもサポートしなければならないのでサポートするようにしているだけです。

また、mysqlの利用も一般ユーザが利用する位で有れば使用しない方が良いかもしれませんね。ここら辺は一長一短だとは思いますが。。。。。ただ、SMTP認証はmysqlを利用した環境でしか自分はチェックしていません。

MySQLにてユーザ管理を行うために、当然ですがmysqlのインストールが必要です。サクッとインストールを行いましょう。
# cd /usr/ports/databases/mysql50-server/
# make WITH_CHARSET=utf8 WITH_XCHARSET=all
# make install clean

続いてvpopmailをインストールします。APOPを利用出来るようにするのとドメインごとにクォータ制御を行うので下記のようなmakeを発行、インストールを行います。
# cd /usr/ports/mail/vpopmail
# make WITH_MYSQL=yes WITH_CLEAR_PASSWD=yes WITH_DOMAIN_QUOTAS=yes
# make install clean

[mysqlを利用しない場合 : makeのみ]
[POP before SMTPを利用しない場合 : make WITHOUT_ROAMING=yes]
[APOPを利用する場合 : make WITH_CLEAR_PASSWD=yes]
[ドメイン単位でquotaを行う場合 : make WITH_DOMAIN_QUOTAS=yes]

以上でソフトウェアのインストールが完了しました。

引き続き、ソフトウェアの設定が必要ですが、まずはインストールそのものは上記手順にて完了です。

設定編は時間を見計らって後日記載したいと思います。

MaxloginsでSSH不正アクセス対策

FreeBSD No Comments

謹賀新年のコメントをPOSTしてからはや一ヶ月。そろそろ更新しなきゃな~~と思ってましたが身近な後輩から

「dorakenさん、謹賀新年から1ヶ月も更新されてないっすよ~~、早く更新して下さいよ♪(* ̄ー ̄)v」

という突っ込みが。

「・・・・・・・・ ( ̄  ̄;) うーん 時間がねぇ」と思いつつもさすがにこのまま放置というわけにも行かないので今回は小技にあたるSSHアタック対策の一つ、MaxloginsでSSH不正アクセス対策を行ってみたいと思います。

このソフトを使うと何が出来るかというと「パスワードを規定回数間違えたIPアドレスからのアクセスを一定時間アクセス禁止にする」事が可能です。過去に紹介した日本国内からSSHsshでログインできるユーザーを決めましょうと併せて対策を行うことでFreeBSD単体で強固な対策が可能になります。出来ればルータでアクセスできるIPアドレスを制限したり、ポート番号を変更したりなどの対策を施せばベストなのですけどね。

Maxloginsはperlで記述されています。オフシャルサイトを見ると「Tested under Perl 5.8.4 and 5.6.1, and FreeBSD 4.7.」と記載がありますのでperl5であればLinuxであっても問題なく使用可能と思います。dorakenはFreeBSD6.4Rで使用しています。

rootでログインした後、オフシャルサイトからプログラム本体をダウンロードするところから始めまてインストール及び調整を行っていきましょう。ディレクトリは何処を使用しても問題有りません。dorakenは「/root」フォルダ直下にダウンロードしました。

fetch http://www.teamits.com/resources/maxlogins.txt

 

次にダウンロードしたプログラムを[/usr/local/bin]にコピーして、syslogからmaxlogins.plを読み出し、利用できるように調整します。

# cp maxlogins.txt /usr/local/bin/maxlogins.pl
# chown root:wheel /usr/local/bin/maxlogins.pl
# chmod 750 /usr/local/bin/maxlogins.pl
# vi /etc/syslog.conf
auth.info;authpriv.info /var/log/auth.log       # 元々記述されている
auth.info;authpriv.info |exec /usr/local/bin/maxlogins.pl  # 上記直下に追記する。

最後に[/etc/hosts.allow]にmaxloginsで書き出しされたIPをブロックする設定を記述します。ローカルホストからのログインは常に有効にしたいので下記のようにループバックアドレスの直下に起きましょう。

# vi /etc/hosts.allow
sshd : 127.0.0.1 : allow
sshd : /var/log/maxlogins : deny

最後にsyslogdの再起動を行ってmaxlogins.plがsyslogdから自動的に呼ばれる設定を有効にします。

# killall -HUP syslogd

以上で対策は完了しました。dorakenは最初に説明したとおり、日本国内からのSSHアクセス以外はすべて不許可の設定にしていますので

sshd : 127.0.0.1 : allow
sshd : 常に許可したい接続IPアドレス : allow
sshd : /var/log/maxlogins : deny
sshd : 日本国内のIPアドレス : allow
sshd : ALL : deny

になっています。つまりlocalhostと自分が使用しているプライベートIPアドレスは何があってもSSH接続を許可、maxloginsに記述されたIPはすべてアクセス禁止、日本国内からのアクセスは(基本的に)許可、それ以外は禁止、という設定です。

maxloginsは何日アクセスを禁止するか、何回パスワード認証に失敗したらアクセス禁止IPとするかなどを決めることが可能ですが、それらは後日追記したいと思います。

ZABBIX設定・メール送信内容をカスタマイズ

FreeBSD, zabbix No Comments

 zabbixで監視しているサーバでサービスがダウンしたりした場合、E-Mailでメッセージが送信できます。が、標準のメッセージは分かりづらいです。また細かく細かく設定できますし日本語でメールを送信する方法も雑誌で紹介されていますがdoraken的には、いつ、どのような時に、どんな場所でメールを受け取るか分かりませんので、どんな環境でもメールの内容が確認できるように英語でメッセージを受け取りたいと考えてました。

 下記設定はサービスがダウンしたときには「サービス名 server is down on [サーバ名]: Failure Report!」、回復したときには「Trouble retuen Report: サービス名 server is down on サーバ名」という件名でメールを送信します。

サービスがダウンした時のメール設定
send-down-message

サービスが回復した時のメール設定
send-up-message

注意点としてはNewConditionにてターゲットを設定したときに「追加」ボタンをおして設定を確定することでしょうか?あと、E-mailアドレスの設定などありますがそれらはまた今度。

FreeBSDでOMRON BX50Fを使用する

FreeBSD No Comments

 サーバ管理を行っていると電源管理はさけて通れませんよね。企業で使用する分には高額なUPSが使用できたり自家発電機がはいっているサーバルームへサーバを設置したりできますが一個人で、さらには趣味で使用しているサーバにそんなお金はかけません。なので一般に流通しているUPSより、

要件1 価格が安いこと
要件2 長寿命バッテリを搭載していること
要件3 FreeBSDで使用できること

という要件を満たす商品を購入&セットアップしてみました。入手しやすく出来る限りコンパクトサイズなUPSであれば言うこと無いなぁと思っていたところ期待通りのUPSを発見、それが今回紹介するOMRON BX50Fです。有限会社オングス様よりFreeBSD用のシャットダウンアプリケーションが無償で公開されています。ソフトウェアはここよりダウンロードできます。最初にHPでライセンスを確認してくださいね。

# fetch http://www.ongs.co.jp/products/omronupsd/omronupsd-0.3.1-F6R-amd64.tbz
# pkg_add omronupsd-0.3.1-F6R-amd64.tbz

上記2ステップでUPSの導入は完了です。導入完了したらソフトの設定を行って自動起動設定を有効にしましょう。

# cp /usr/local/etc/omronupsd/omronupsd.conf.sample /usr/local/etc/omronupsd/omronupsd.conf
# vi /usr/local/etc/omronupsd/omronupsd.conf

# vi /etc/rc.conf
omronupsd_enable=”YES”
omronupsd_devices=”BZ”
omronupsd_BZ_flags=”-D”
omronupsd_BZ_conf=”/usr/local/etc/omronupsd/omronupsd.conf”
omronupsd_BZ_pid=”/var/run/omronupsd.pid”

# /usr/local/etc/rc.d/omronupsd.sh start

上記で設定が完了します。設定も特に迷うところなく行えると思いますので一つだけ自分なりの設定方法を。こちらのシャットダウンソフトは下記の通りシャットダウンコマンドを使用できます。

# 通常のシャットダウンコマンドを指定します。
shutdown_cmd=/sbin/shutdown -p now
# 緊急時のシャットダウンコマンドを指定します。
em_shutdown_cmd=/sbin/halt -p

シャットダウン時に実行したいバッチ処理を記述したシェルスプリクトを、実行するように設定できます。最近はVMware ESXi にはまっているせいもあり、どのように転用できるかを考えているので良い運用方法なぞを思いついたら紹介したいと思います。

ちょっとした小技

FreeBSD, Linux No Comments

小技 その1

サーバ管理をしていているとroot宛のメールを自分がメインで使用しているメールアドレスへ転送したくなってきますよね?なのでエイリアス設定を行って転送されるように設定しましょう。

エイリアス設定は標準MTA(sendmail)の場合、「/etc/mail」フォルダ内にある「aliases」ファイルで設定を行います。設定を行った後は.dbファイルを更新する必要がありますので、ディレクトリチェンジを行ってからファイル編集を行いましょう。

%cd /etc/mail/
%vi aliases

テキストファイルをエディタで開くと17行目付近に

# root’s email from here.
root: メールアドレス

という記述があると思います。「root: 」の行に転送したいメールアドレスを記述してファイルセーブ&エディタを終了してください。その後

%make

コマンドを発行して.dbファイルを更新、設定を有効にします。以上でメール転送設定が完了しました。

 

小技 その2

findってとっても便利なコマンドですよね。でも使い方がちょっと難しいと思いませんか?自分が良く迷うのは「-mtime」 や「-mmin 」の「+、-」の部分です。もう一つカレントディレクトリ以下を検索する方法と指定のディレクトリのみ検索したい場合の切り分けですね。パスにピリオド(.)を使用するとカレントディレクトリ以下を検索するという意味になります。なので下記のようなコマンドを発行すると

# 7日以上前のカレントディレクトリ以下にあるファイルを検索する
find . -mtime +7
# 7日前(7*24h - 8*24h)のカレントディレクトリ以下にあるファイルを検索する
find . -mtime  7
# 7日以内のカレントディレクトリ以下にあるファイルを検索する
find . -mtime -7

ちなみに「/tmp」フォルダ内にある7日以上前のファイルを一気に削除を行い対場合は「find /tmp -mtime +7 -exec rm -f {} \;」のような使い方になります。

その他、便利な小技があればちょっとずつ公開していきたいと思います。逆にこのようにコマンドを利用すれば便利だよって技があれば是非是非教えてくださいね。

« Previous Entries