パスワードを忘れた? アカウント作成
529645 journal

Ryo.Fの日記: Spamass-milter: メーリングリストサーバとは

日記 by Ryo.F

Spamassassinsendmailの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メーラとかで転送される仮想ユーザなんかの場合には、うまく動かなかったりするのかな??

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

弘法筆を選ばず、アレゲはキーボードを選ぶ -- アレゲ研究家

読み込み中...