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)は, 本サイトをご利用の際に起きるかもしれない不利益に対し, 一切責任を負いません.