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

我正在尝试实施一个反垃圾邮件解决scheme,根据我在其他问题的回答中得到的build议,我决定去sendmail + mimedefang + spamassassin。

但目前我坚持一个相当简单的权限问题:

  1. 默认情况下,MIMEdefang作为“defang”用户运行,所以创build它的socket具有以下权限:

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

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

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

我已经为此问题尝试了以下解决scheme:

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

  2. 运行sendmail作为defang,或者像sendmail一样运行mimedefang。 似乎没问题,但也想避免这种情况,因为有太多的configuration文件,目录等,这将需要更改权限和/或所有权,所以整个过程变得非常容易出错。

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

你可以build议任何其他解决scheme? 在sendmail或mimedefang中有没有可用的选项,它们与权限有关?

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

编辑:(在阅读以下注释之后)要使套接字组可读写,必须在启动milter之前正确使用umask (请参阅提供的链接中的“注释”部分)。

在我的情况下,我不需要设置umask来创build套接字。 我只需要运行与sendmail( RunAsUidRunAsGid )相同的用户和组的RunAsUid ,并拥有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