sendmail 和 mimedefang 都以非特权用户身份运行时出现问题

sendmail 和 mimedefang 都以非特权用户身份运行时出现问题

我正在尝试实施反垃圾邮件解决方案,并根据我从其他问题的答案中获得的建议,我决定采用 sendmail+mimedefang+spamassassin。

但目前我遇到了相当简单的权限问题:

  1. 默认情况下,MIMEdefang 以“defang”用户身份运行,因此它使用以下权限创建套接字:

    srwxr-x--- 1 defang defang 0 3月3日 16:42 /var/spool/MIMEDefang/mimedefang.sock

  2. 如果 sendmail 以 root 身份运行,则没有问题,但如果以非特权用户身份运行,则它会抱怨 mimedefang 套接字缺乏权限:

    NOQUEUE:SYSERR(root):/etc/mail/sendmail.cf:第 1870 行:Xmimedefang:本地套接字名称 /var/spool/MIMEDefang/mimedefang.sock 不安全:权限被拒绝

我已经尝试过以下解决方案来解决这个问题:

  1. 以 root 身份运行 sendmail。工作正常,但不太可接受,因为我想避免以 root 身份运行守护进程

  2. 以 defang 身份运行 sendmail 或以与 sendmail 相同的用户身份运行 mimedefang。这似乎没问题,但也希望避免这种情况,因为配置文件、目录等太多,需要更改权限和/或所有权,因此整个过程很容易出错。

  3. 只需更改套接字文件的权限,但每次启动 mimedefang 时都会重新创建它。我可以相应地修改 /etc/init.d 中的相应脚本,但我还是不想避免这种情况,因为我的更改可能会随着这些软件包的未来更新而丢失。

您能建议其他解决方案吗?sendmail 或 mimedefang 中是否有与权限相关的可用选项?

答案1

Sendmail 以 root 身份运行,并在需要以其他用户身份运行进程时分叉(smmsp、smmta 等)。所以,是的,以 root 身份运行它,并确保您正在运行最新版本。如果您想以非 root 身份运行 sendmail,请将该用户设为 defang 组的一部分。请注意,defang 组还具有套接字的读取权限。

编辑:(阅读下面的评论后)使套接字组可读写你必须使用 umask在启动搅拌器之前进行适当的操作(请参阅所提供链接中的注释部分)。

答案2

就我而言,我不需要设置创建套接字的 umask。我只需要使用与 sendmail 相同的用户和组运行 opendkim(RunAsUidRunAsGid),并让用于套接字的目录具有600权限(S_IRUSR|S_IWUSR)。

你可以在 sendmail 源中检查一下[1]:

  • sendmail/milter.c
errno = safefile(colon, RunAsUid, RunAsGid, RunAsUserName, sff,
         S_IRUSR|S_IWUSR, NULL);
...
else if (errno != 0)
{
    /* if not safe, don't create */
    save_errno = errno;
    if (tTd(64, 5))
        sm_dprintf("X%s: local socket name %s unsafe\n",
            m->mf_name, colon);
  • libsmutil/safefile.c
/*
**  SAFEFILE -- return 0 if a file exists and is safe for a user.
**
**  Parameters:
**      fn -- filename to check.
**      uid -- user id to compare against.
**      gid -- group id to compare against.
**      user -- user name to compare against (used for group
**          sets).
**      flags -- modifiers:
**          SFF_MUSTOWN -- "uid" must own this file.
**          SFF_NOSLINK -- file cannot be a symbolic link.
**      mode -- mode bits that must match.
**      st -- if set, points to a stat structure that will
**          get the stat info for the file.
**
**  Returns:
**      0 if fn exists, is owned by uid, and matches mode.
**      An errno otherwise.  The actual errno is cleared.
**
**  Side Effects:
**      none.
*/

int
safefile(fn, uid, gid, user, flags, mode, st)

[1]:ftp://ftp.sendmail.org/pub/sendmail/sendmail.8.15.2.tar.gz

相关内容