SMTP AUTH な送信サーバでログをとりたい
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 fromqp 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
実際のログはこんな感じ
これで、異常に「 authentication failure; 」で送信失敗しているのもわかるし、大量に「 authentication success; 」を吐かせてメイル送信しているのも見つけられるようになった・・・ハズ。 SMTP AUTH をやろう! ( その 1 )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
当方(SHIBATA Akira)は, 本サイトをご利用の際に起きるかもしれない不利益に対し, 一切責任を負いません.