Ryo.Fの日記: Spamass-milter: メーリングリストサーバとは
SpamassassinをsendmailのMILTERで動作させる、Spamass-milterの話の続き。Spamass-milterを導入したマシンで、メーリングリストをMajordomoで運用している。こいつ(に限らず、MLドライバ全般は、だけど)と、spamass-milterの相性がよくない、という話。
Majordomoを運用していると、/etc/aliasesあたりに、次のように別名を記述することになる。
majordomo: "|/path/to/majordomo/wrapper majordomo"
つまり、majordomo@example.com宛に送られたメールは、この別名によってMLドライバで処理されることになるわけだ。
しかし、このmajordomo@example.com宛にメールが届くと、syslogには次のようなメッセージが出力される。
May 10 10:25:16 ホスト名 spamd[29133]: handle_user: unable to find user '"|/path/to/majordomo/wrapper majordomo"'!
May 10 10:25:16 ホスト名 spamd[29133]: Still running as root: user not specified with -u, not found, or set to root. Fall back to nobody.
Spamass-milterのオプションに、`-x -u sa-milt'と指定しているので、こちらとしては、ユーザsa-miltにsetuidしてもらいたいのだが、実際にはそうならない。これは、spamass-milterが宛先メールアドレスから、ユーザ名を解析する部分が間違っているからだ。
Spamass-milterは、`sendmail -bv'を実行して、ユーザ名を展開するが、spamass-milterは、これを次の部分で解析している。以下は、spamass-milter-0.3.1の、spamass-milter.cppの一部(インデントは適宜修正した)。
while (fgets(buf, sizeof(buf), p) != NULL)
{
int i = strlen(buf);
/* strip trailing EOLs */
while (i > 0 && buf[i - 1] <= ' ')
i--;
buf[i] = '\0';
debug(D_RCPT, "sendmail output: %s", buf);
/* From a quick scan of the sendmail source, a valid email
address gets printed via either
"deliverable: mailer %s, host %s, user %s"
or "deliverable: mailer %s, user %s"
*/
if (strstr(buf, "... deliverable: mailer "))
{
char *p=strstr(buf,", user ");
/* anything after ", user " is the email address */
debug(D_RCPT, "user: %s", p+7);
assassin->expandedrcpt.push_back(p+7);
}
}
これは、宛先メールアドレスがローカルユーザに展開される場合はうまく動作する。たとえば、次のような出力を得られる場合には問題ない。
$ /usr/sbin/sendmail -bv Full.Name@example.com
Notice: -bv may give misleading output for non-privileged user
username... deliverable: mailer local, user username
$
しかし、MLドライバの場合だと、次のように展開される。
$ /usr/sbin/sendmail -bv majordomo
Notice: -bv may give misleading output for non-privileged user
"|/path/to/majordomo/wrapper majordomo"... deliverable: mailer prog, user "|/path/to/majordomo/wrapper majordomo"
$
本来であれば、`mailer prog'の部分を見て、ローカルユーザではないので、`-u'オプションで指定されたユーザにsetuidすべきだ。
さて、パッチでも作ってみるか…こんな感じでいいんじゃなかろうか?
885c885
< if (strstr(buf, "... deliverable: mailer local "))
---
> if (strstr(buf, "... deliverable: mailer "))
まだ試してないので、試したらまた報告します。
#もしかしたら、smtpメーラとかで転送される仮想ユーザなんかの場合には、うまく動かなかったりするのかな??
Spamass-milter: メーリングリストサーバとは More ログイン