第三者不正中継ってなに?
メールサーバー(SMTP)には、メールが送られてきたときに、自分のドメイン宛のメールではなかった場合、別のメールサーバーに転送する機能がある。この機能を利用して、悪意の第三者が他人のサーバーを中継して、送信元の身元を隠蔽し、大量の迷惑メールを送信する行為を「メール不正中継」という。
商用メールを大量送信する業者側には、メールサーバーを自前で運用するにはコストがかかり、また、身元(発信元)が特的できないように隠匿したいという事情があり、他人のサーバーを踏み台にできるメール不正中継は、迷惑メールの代表的な手口とされる。
通常は、メールサーバー側で不正中継チェックを行ったり、また、迷惑メールを送信するドメインをブラックリストとしてデータベース化、登録されているドメインのアドレスからのメールを受信拒否したりするサービスなどもある。
最近では、Webサイト上の問い合わせフォームなどのように、あらかじめ設定されたアドレス宛にメールを送信する機能(Webアプリケーション)の脆弱性につけ込み、設定されていない(不特定多数の)アドレス宛に迷惑メールを送信するという手口が見受けられる。このように、メールの不正中継は、問題のあるWebサイトを中継して不正に迷惑メールを送信する行為を指す場合がある。
善意のバケツリレー
どうしてメールサーバー(SMTP)にスパム業者を助けるようなリレー(中継)機能があるのかというと、メールが生まれて暫くの間の通信はバケツリレー形式だったからです。つまり当時のメールは現実のハガキのようなもので、郵便屋さんが内容をみようと思えば見れるものでした。さらにIP方式に通信が整備され送信先本人に直接届くようになり、メールに秘匿性が生まれ企業も使うようになります。ある人がそこでチラシやDMを使う代わりにメールで広告や営業をしたら宣伝費も切手代もかからないと目をつけ、企業宛に広告メールを送るうちは営業の範囲になりますが、次第に一般の人へ向けて・・これがスパムの起源です。つまり、メールサーバーのリレー機能はスパムが存在せず、善意のバケツリレー方式でメールが届けられていた当時の名残なのですね。
新世代MTAへの移行が進むも根強いqmail
ところで、善意の時代に生まれたqmailのそのままの状態だとSMTPしかサポートしていません。SMTPはパスワード認証がないので誰でもサーバーのリレー機能を使える状態になります、もはや正規のメールよりスパム広告の数の方が多い暗黒時代ではSMTP-AUTHとしてパスワード認証が必要です。その為まともに使うにはSMTP-AUTHに対応する有志のパッチをつけてコンパイルするのですが、他にも色々足りないのでqmailはパッチ、パッチのフランケンシュタイン状態でやっと使えるようになります。
というのもqmailは1998年に開発終了しており、2002-2006年あたりにPostfixへのメールサーバー移行の動きが進みました。そんなわけで、現在はメールサーバーというとPostfixが主流ですが、それでもエンジニアの中には根強いqmailファンもおり、当時建てられたqmailメールサーバーが今も企業で稼働しています。
━─━─━─━─━─━─━─━─━─━─━─━─━
Postfixなどメールサーバの構築を有償で承ります。
SMTP,POP3,IMAP,SSL,s25R対応
スパム,ウィルスにもフィルター対応
WEBブラウザでのアカウント管理対応
>>お問い合わせ
━─━─━─━─━─━─━─━─━─━─━─━─━
不正中継対策サマリー
既にqmailがインストールされて稼働している事が前提条件です。
1. qmailやパッチをソースでダウンロード
2. 不正中継パッチを含む各種パッチを当てる
3. makeしてコンパイル
4. 生成された不正中継対策済みのqmail-smtpdファイルと
/var/qmail/bin/qmail-smtpdを差し替える
5. 不正中継チェックサイトでチェックhttp://www.rbl.jp/svcheck.php
不正中継チェックサイトでまずは確認
すべてクリアされたあなたはこの記事を見る価値がありません。
すみません(੭ ˃̣̣̥ ω˂̣̣̥)
脆弱性のあるあなたへ
または、qmailサーバー構築中のあなたへ向けてこの記事を書いています。
では以下のコマンドを打ってください。
# mailq | wc
どうでしょう?
0 0 0 の場合 まだ攻撃されていません。
1 5 20 の場合 まだ大丈夫でしょう。
2334 15876 168321 の場合 公衆スパム発射台と認定
スパムの発射台になっていないと思って安心しているあなた、ここにたどり着いている時点で予備軍です。
予想される未来とその可能性
- サーバーが遅い、通信も遅い、何かがおかしい
- サーバーの容量ぱんぱん村になっていた
- メールログを見たらログが止まらなくなった
- 相手にメールが届かなくなってきた
- 相手のスパムフィルタに弾かれるらしい
- ドメインがブラックリストに載っていた
- スパムを送るのをやめてくださいというメールが届く
- 取引先にも迷惑メールをおくっていたらしい!
- アフリカの掲示板でスパム発射台と認定され晒されていた
・・・(੭ ˃̣̣̥ ω˂̣̣̥)
MXLookup ブラックリストに載ってないか確認
http://mxtoolbox.com/blacklists.aspx
ブラックリストに自身のドメインが載ってないか確認してください。
載っていた場合は不正中継対策を行い、自身のサーバーからスパムを発射することがないことを確認しリスト管理している組織に解除申請を行ってください。
※入力から結果まで時間差があります。
qmailの場合の不正中継対策
qmailの場合公式そのままでは不正中継される脆弱性があります。スパムなんてなかった平和な時代に開発されたMTAなので仕様がありません。
まずはダウンロードディレクトリの作成
# mkdir /usr/local/src
作ったディレクトリに移動します。
# cd /usr/local/src
本体のダウンロード
# fetch http://tomclegg.net/qmail/qmail-1.03.tar.gz
外部SMTP-authパッチダウンロード
# fetch http://tomclegg.net/qmail/qmail-remote-auth.patch
SMTP-Auth対応パッチダウンロード
# fetch http://tomclegg.net/qmail/qmail-smtpd-auth-0.31.tar.gz
日本標準時間対応パッチダウンロード
# fetch http://www.itheart.com/phpgw/qmail-date-localtime.patch
不正中継拒否パッチダウンロード
# fetch http://www.qmail.org/qmail-smtpd-relay-reject
エラー対策パッチダウンロード
# fetch http://www.qmail.org/moni.csi.hu/pub/glibc-2.3.1/qmail-1.03.errno.patch
本体の展開
[root@ src]# tar xvfz qmail-1.03.tar.gz
SMTP-Auth対応パッチ展開
[root@ src]# tar zxvf qmail-smtpd-auth-0.31.tar.gz
x qmail-smtpd-auth-0.31/
x qmail-smtpd-auth-0.31/auth.patch
x qmail-smtpd-auth-0.31/CHANGES
x qmail-smtpd-auth-0.31/base64.c
x qmail-smtpd-auth-0.31/base64.h
x qmail-smtpd-auth-0.31/README.auth
展開したSMTP-Auth対応パッチを本体へ移動
[root@ src]# mv qmail-smtpd-auth-0.31/* ./qmail-1.03/
qmailに移動
[root@ src]# cd /usr/local/src/qmail-1.03
日本時間対応パッチを当てます
# patch -p1 < ../qmail-date-localtime.patch
patching file date822fmt.c
SMTP-Authパッチを当てます
qmail-1.03]# patch < auth.patch
patching file Makefile
patching file TARGETS
patching file qmail-smtpd.8
patching file qmail-smtpd.c
外部SMTP-Authパッチを当てます
qmail-1.03]# patch < ../qmail-remote-auth.patch
patching file qmail-remote.c
patching file Makefile
不正中継拒否パッチを当てます
# patch < ../qmail-smtpd-relay-reject
patching file qmail-smtpd.c
Hunk #1 succeeded at 56 (offset 3 lines).
Hunk #2 succeeded at 229 (offset 12 lines).
Hunk #3 succeeded at 286 (offset 20 lines).
エラー対策パッチを当てます。
qmail-1.03]# patch < ../qmail-1.03.errno.patch
patching file cdb_seek.c
patching file dns.c
patching file error.3
patching file error.h
ソースからqmailをコンパイルする場合はnofilesグループが必要
# pw groupadd nofiles
コンパイルを行います。
# make
[bash] qbiff.c:95: error: invalid application of ‘sizeof’ to incomplete type ‘struct utmp’
qbiff.c:95: error: invalid application of ‘sizeof’ to incomplete type ‘struct utmp’
qbiff.c:96: error: invalid use of undefined type ‘struct utmp’
qbiff.c:96: error: invalid use of undefined type ‘struct utmp’
qbiff.c:98: error: invalid use of undefined type ‘struct utmp’
qbiff.c:98: error: invalid use of undefined type ‘struct utmp’
qbiff.c:99: error: invalid use of undefined type ‘struct utmp’
qbiff.c:54: warning: return type of ‘main’ is not ‘int’
*** [qbiff.o] Error code 1
Stop in /usr/local/src/qmail-1.03.
[/bash]
エラー大発生。
FreeBSD9.0以降で発生するエラーのようです。
http://dokuosan.net/zousan/nikki291.html
9.0の/usr/include内ではutmp.hが無くなっていて、utmpx.hしかありません。
1年以上前になりますが、こちらの記事に経緯が書かれていました。
「アカウントデータベースインターフェース」というのがどういうものなのか 判りませんが、それがFreeBSD固有のものからPOSIX標準のものに置き換わった
という事です。で、今までは8.2R等ではutmp.hが/usr/includeに残っていて
コンパイルできていたのですが、8-stableや9-currentでは無くなっています。
qmailとかのソフトウェアをportsからインストールされている人はports側の方で
対応しているので大丈夫ですが、ソースからインストールしている人はちょっと
qmailのソースのqbiff.cを修正しないといけません。
パッチファイルを手に入れましたのでこちら(http://dokuosan.net/zousan/extra-patch-utmpx)に置いておきます。
中身は以下の通りです。— qbiff.c
+++ qbiff.c
@@ -1,13 +1,6 @@
#include lt;sys/types.hgt;
#include lt;sys/stat.hgt;
-#include lt;utmp.hgt;
-#ifndef UTMP_FILE
-#ifdef _PATH_UTMP
-#define UTMP_FILE _PATH_UTMP
-#else
-#define UTMP_FILE “/etc/utmp”
-#endif
-#endif
+#include lt;utmpx.hgt;
#include “readwrite.h”
#include “stralloc.h”
#include “substdio.h”
@@ -20,15 +13,12 @@
#include “env.h”
#include “exit.h”-substdio ssutmp;
-char bufutmp[sizeof(struct utmp) * 16];
-int fdutmp;
substdio sstty;
char buftty[1024];
int fdtty;-struct utmp ut;
-char line[sizeof(ut.ut_line) + 1];
+struct utmpx *ut;
+char line[sizeof(ut->ut_line) + 1];
stralloc woof = {0};
stralloc tofrom = {0};
stralloc text = {0};
@@ -63,7 +53,7 @@
if (!(user = env_get(“USER”))) _exit(0);
if (!(sender = env_get(“SENDER”))) _exit(0);
if (!(userext = env_get(“LOCAL”))) _exit(0);
– if (str_len(user) > sizeof(ut.ut_name)) _exit(0);
+ if (str_len(user) > sizeof(ut->ut_user)) _exit(0);if (!stralloc_copys(&tofrom,”*** TO lt;”)) _exit(0);
if (!stralloc_cats(&tofrom,userext)) _exit(0);
@@ -88,15 +78,11 @@
if (!stralloc_cat(&woof,&text)) _exit(0);
if (!stralloc_cats(&woof,”\015\n”)) _exit(0);– fdutmp = open_read(UTMP_FILE);
– if (fdutmp == -1) _exit(0);
– substdio_fdbuf(&ssutmp,read,fdutmp,bufutmp,sizeof(bufutmp));
–
– while (substdio_get(&ssutmp,&ut,sizeof(ut)) == sizeof(ut))
– if (!str_diffn(ut.ut_name,user,sizeof(ut.ut_name)))
+ while ((ut = getutxent()) != NULL)
+ if (ut->ut_type == USER_PROCESS && !str_diffn(ut->ut_user,user,sizeof(ut->ut_user)))
{
– byte_copy(line,sizeof(ut.ut_line),ut.ut_line);
– line[sizeof(ut.ut_line)] = 0;
+ byte_copy(line,sizeof(ut->ut_line),ut->ut_line);
+ line[sizeof(ut->ut_line)] = 0;
if (line[0] == ‘/’) continue;
if (!line[0]) continue;
if (line[str_chr(line,’.’)]) continue;
上記のパッチをありがたく取得
[root@ qmail-1.03]# fetch http://dokuosan.net/zousan/extra-patch-utmpx
パッチを適応
[root@ qmail-1.03]# patch < /usr/local/src/qmail-1.03/extra-patch-utmpx
改めてコンパイル
qmail-1.03]# make
qmail-smtpdがあるかたくさんのファイルの中から確認してください。
それが今回の目的の不正中継対策されたqmail-smtpdファイルです。
# ls
qmail-smtpd
qmailを停止させます。
# /usr/local/etc/init.d/qmail.sh stop
一応差し替える前に古いのをリネームして残しておきましょう。こういう癖で助かる未来もあります。
# mv /var/qmail/bin/qmail-smtpd /var/qmail/bin/qmail-smtpd.notReject
移動させて差し替えます。
# cp /usr/local/src/qmail-1.03/qmail-smtpd /var/qmail/bin/qmail-smtpd
起動させます。
# /usr/local/etc/init.d/qmail.sh start
ログを見て正常に稼働しているかチェックします。
# cat /var/log/maillog
不正中継チェックサイトで再確認
すべて青なら大丈夫
お疲れ様です☆