SMTP AUTH 関連

SMTP AUTH をやろう! ( その 2 )

SMTP AUTH な送信サーバでログをとりたい

SMTP Authentication log with qmail on Debian GNU/Linux Woody by SHIBATA Akira
作成 2004/04/19

ログをとりたい

Debian GNU/Linux woody のおかげで、非常に簡単に OS から qmail までインストールできた。

パスワードファイルの権限、起動スクリプトの変更などを経て、 SMTP AUTH な送信サーバはできた。

ところが送信できるけど誰が送信しているかわからない。(下図参照)

Apr 19 16:54:45 fletsmail qmail: 1082361285.151279 new msg 3025154
Apr 19 16:54:45 fletsmail qmail: 1082361285.151358 info msg 3025154: bytes 996 from  qp 6495 uid 64011
Apr 19 16:54:45 fletsmail qmail: 1082361285.214791 starting delivery 17: msg 3025154 to remote hogehoge@example.com
Apr 19 16:54:45 fletsmail qmail: 1082361285.217170 status: local 0/10 remote 1/20
Apr 19 16:54:45 fletsmail qmail: 1082361285.479015 delivery 17: success: 203.165.10.71_accepted_message./Remote_host_said:_250_2.0.0_i3J7sjfV00031_Message_accepted_for_delivery/
Apr 19 16:54:45 fletsmail qmail: 1082361285.479090 status: local 0/10 remote 0/20
Apr 19 16:54:45 fletsmail qmail: 1082361285.479117 end msg 3025154

このログは fugafuga@example.com から hogehoge@example.com のログだが、ヘッダに書かれているものであり、こんなの簡単に偽装できるから信用できない。そもそも SMTP AUTH で authenticate したのはどのユーザ?って疑問がわく。しかし標準ではこの情報はログには一切吐かれないのでした。いっぱいさがしちゃった。

Authenticating log が出ないなら出るように改造したい!とプログラミングもわからんのにいじってみたが、 MUA (メイルを出すほうのソフト) へはユーザ名を返すことが可能だが、サーバ自身のログには出てこなかった。そこで気軽に聞ける人達に相談したら、なんと解決できるコードを書いてくれる人が現れたのだった。

改造対象

当初 qmail-smtpd.c をいじっていたが、『 qmail-smtpd を hack するのではなく、 認証を担当している /usr/local/bin/cmd5checkpw を hack するのが、 妥当かと。』という指摘があり、 cmd5checkpw(CRAM-MD5認証用) | 今回使ったモノのローカルコピーを改造するパッチまで書いてもらっちゃった (*^v^*)

$ diff -u cmd5checkpw-0.22-orig/main.c cmd5checkpw-0.22/main.c
--- cmd5checkpw-0.22-orig/main.c        Mon Oct  9 18:07:21 2000
+++ cmd5checkpw-0.22/main.c     Sun Apr 18 14:48:52 2004
@@ -5,9 +5,11 @@
 #include <pwd.h>
 #include <stdio.h>
 #include <unistd.h>
+#include <syslog.h>

 #define LINE_MAX 256
 #define SMTP_PASSWD_FILE "/etc/poppasswd"
+#define SYSLOG_IDENT "cmd5checkpw"
 char up[513];
 int uplen;
 static char hextab[]="0123456789abcdef";
@@ -56,6 +58,16 @@
    return(strcmp(digascii,response) && strcmp(password,challenge));
 }

+void auth_syslog(int accepted, const unsigned char *login) {
+  openlog(SYSLOG_IDENT, LOG_NOWAIT | LOG_PID, LOG_AUTHPRIV);
+  if (accepted) {
+    syslog(LOG_WARNING, "authentication failure; logname=%s", login);
+  } else {
+    syslog(LOG_INFO, "authentication success; logname=%s", login);
+  }
+  closelog();
+}
+
 void main(int argc,char **argv)
 {
   char *login;
@@ -89,6 +101,7 @@
   response = up + i;

   accepted=doit(login,challenge,response);
+  auth_syslog(accepted,login);

   for (i = 0;i < sizeof(up);++i) up[i] = 0;

このパッチをあててコンパイルとインストールしなおすだけでログが取れるようになった。

$ make
gcc -c -g -Wall -O3   -c -o main.o main.c
main.c:72: warning: return type of `main' is not `int'
gcc -g -o cmd5checkpw main.o md5c.o hmac_md5.o
$ sudo make install
cp cmd5checkpw /bin/ ; cp cmd5checkpw.8 /usr/man/man8/
$ ls -l /bin/cmd5checkpw
-rwxr-xr-x    1 root     root        33689 Apr 18 15:07 /bin/cmd5checkpw
$ sudo useradd smtpauth
$ sudo chown smtpauth /bin/cmd5checkpw
$ sudo chmod a+s /bin/cmd5checkpw
$ ls -l /bin/cmd5checkpw
-rwsr-sr-x    1 smtpauth root        33689 Apr 18 15:07 /bin/cmd5checkpw

実際のログはこんな感じ

Apr 18 14:00:09 fletsmail cmd5checkpw[3232]: authentication failure; logname=abc319
Apr 18 14:00:22 fletsmail cmd5checkpw[3234]: authentication success; logname=abc319
Apr 18 14:03:19 fletsmail cmd5checkpw[3238]: authentication failure; logname=sbt
Apr 18 14:03:38 fletsmail cmd5checkpw[3240]: authentication success; logname=sitafu
Apr 18 14:15:24 fletsmail cmd5checkpw[3244]: authentication failure; logname=sitafu
Apr 18 14:16:11 fletsmail cmd5checkpw[3246]: authentication success; logname=abc319
Apr 18 14:17:18 fletsmail cmd5checkpw[3250]: authentication failure; logname=abc319
Apr 18 14:17:34 fletsmail cmd5checkpw[3252]: authentication failure; logname=abc319
Apr 18 14:17:55 fletsmail cmd5checkpw[3254]: authentication success; logname=abc319
Apr 18 14:32:31 fletsmail cmd5checkpw[3270]: authentication success; logname=abc319
これで、異常に「 authentication failure; 」で送信失敗しているのもわかるし、大量に「 authentication success; 」を吐かせてメイル送信しているのも見つけられるようになった・・・ハズ。

SMTP AUTH をやろう! ( その 1 )  
Memorandum about Linux and Network | ほかのジャンルを見てみる | サイトマップ

免責

beacon

当方(SHIBATA Akira)は, 本サイトをご利用の際に起きるかもしれない不利益に対し, 一切責任を負いません.