Назад | Перейти на главную страницу

Проблема, когда и sendmail, и mimedefang работают от имени непривилегированного пользователя

Я пытаюсь реализовать решение для защиты от спама, и, согласно советам, которые я получил здесь из ответов на мои другие вопросы, я решил перейти на sendmail + mimedefang + spamassassin.

Но в настоящее время я застрял с довольно простой проблемой разрешения:

  1. По умолчанию MIMEdefang запускается от имени пользователя defang, поэтому он создает сокет со следующими разрешениями:

    srwxr-x --- 1 defang defang 0 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 unsafe: Permission denied

Я уже пробовал следующие решения этой проблемы:

  1. запустите sendmail от имени root. Работает нормально, но довольно неприемлемо, так как я не хочу запускать свои демоны от имени root

  2. запустите sendmail как defang или запустите mimedefang от имени того же пользователя, что и sendmail. Вроде нормально, но этого также хочется избежать, так как существует слишком много файлов конфигурации, каталогов и т.д., что потребует изменения разрешений и / или прав собственности, поэтому весь процесс стал подвержен ошибкам.

  3. Просто измените разрешение файла сокета, но оно воссоздается каждый раз при запуске mimedefang. Я мог бы соответствующим образом изменить соответствующие сценарии в /etc/init.d, но опять же не хочу этого избегать, потому что мои изменения могут быть потеряны с будущими обновлениями этих пакетов.

Не могли бы вы предложить другое решение? Доступны ли какие-либо параметры в sendmail или mimedefang, связанные с разрешениями?

Sendmail запускается от имени пользователя root и разветвляется всякий раз, когда необходимы процессы для запуска от имени другого пользователя (smmsp, smmta и т. Д.). Так что да, запустите его как root и убедитесь, что у вас установлена ​​последняя версия. Если вы хотите запустить sendmail без полномочий root, сделайте этого пользователя частью группы defang. Обратите внимание, что группа defang также имеет права на чтение сокета.

РЕДАКТИРОВАТЬ: (после прочтения комментариев ниже) Сделать чтение-запись группы сокетов вы должны использовать umask перед запуском milter (см. раздел «Примечания» по предоставленной ссылке).

В моем случае мне не нужно было устанавливать umask для создания сокета. Мне просто нужно запустить opendkim с тем же пользователем и группой, что и sendmail (RunAsUid, RunAsGid) и иметь каталог, используемый для сокета с 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