В разрешении OpenDKIM отказано

Я установил opendkim на CentOS 6 и установить TemporaryDirectory в /var/tmp в opendkim.conf конфигурационный файл. После перезапуска службы и попытки отправить электронное письмо я получаю сообщение об ошибке в журнале постфикса, в котором говорится

opendkim[27392]: F2C3E20509: dkim_eoh(): resource unavailable: can't create temporary file at /var/tmp/dkim.F2C3E20509.FiOvYB: Permission denied

Итак, я посмотрел в разрешениях папки tmp (ls -l /var/) и они

drwxrwxrwt.  2 root root 4096 Nov 23 20:42 tmp

Насколько я понимаю, каждый должен иметь возможность писать в /var/tmp папка. Почему Permission denied сообщение об ошибке возвращается?

3 ответа

  • Обновленный ответ *

Перейдите в /etc/opendkim.conf и измените эту строку:

TemporaryDirectory /var/tmp

чтобы:

TemporaryDirectory /var/run/opendkim

И перезапустите ваши почтовые сервисы (например,

# service opendkim restart
# chkconfig opendkim on
# service postfix restart

Вопрос уже имел решение здесь

Нет необходимости разрешать OpenDKIM писать в любые другие каталоги. Просто запишите временный каталог по умолчанию, /var/run/opendkim, который уже должен существовать и иметь правильный контекст SELinux, чтобы он мог быть записан.

Mark Johnson решение, чтобы избежать этой проблемы в SELinux.)

Так. Очень старая тема, которая не поддается разрешению. И несколько дней назад я нашел эту тему, поскольку у меня возникла та же проблема, и она была решена с помощью решения Дедгара.

И вы можете попробовать ниже, что, если вы действительно хотите установить Temporary в /var/tmp

журнал выглядит так:

opendkim[46233]: E9A563F480: dkim_eoh(): resource unavailable: can't create temporary file at /var/tmp/dkim.E9A563F480.IjgWhi: Permission denied

И как сказала Хлоя. это ошибка SELinux, потому что everbody should be able to write into the /var/tmp folder

Проверьте файл журнала # grep opendkim /var/log/audit/audit.log Получил:

...
type=SYSCALL msg=audit(1484968513.231:1415886): arch=c000003e syscall=2 success=no exit=-13 a0=7fc21e6e4910 a1=c2 a2=180 a3=0 items=0 ppid=46231 pid=14906 auid=500 uid=497 gid=497 euid=497 suid=497 fsuid=497 egid=497 sgid=497 fsgid=497 tty=(none) ses=3274 comm="opendkim" exe=2F7573722F7362696E2F6F70656E646B696D202864656C6574656429 subj=unconfined_u:system_r:dkim_milter_t:s0 key=(null)
type=AVC msg=audit(1484968573.318:1415887): avc:  denied  { write } for  pid=14916 comm="opendkim" name="tmp" dev=dm-0 ino=129564 scontext=unconfined_u:system_r:dkim_milter_t:s0 tcontext=system_u:object_r:tmp_t:s0 tclass=dir
...

Как сказал Дедгар, кажется, что Опендким не хватает политики, которая может создавать файлы из tmp файл. Итак, сначала проверьте тип каталога

# ll -Zd /var/tmp/
drwxrwxrwt. root root system_u:object_r:tmp_t:s0       /var/tmp/

затем проверьте, если opendkim иметь разрешение на доступ /var/tmp

# ll -Z /usr/sbin/opendkim 
-rwxr-xr-x. root root system_u:object_r:dkim_milter_exec_t:s0 /usr/sbin/opendkim
# sesearch -A -s dkim_milter_t| grep tmp_t

Вывод может выглядеть так:

... allow daemon puppet_tmp_t: file {ioctl read write getattr lock append}; allow dkim_milter_t tmp_t: file {write create unlink open}; allow dkim_milter_t tmp_t: dir {запись add_name имя_удаления}; разрешить домен tmp_t: dir { getattr search open }; ...

Уведомление о линии

allow dkim_milter_t tmp_t : file { write create unlink open } ; 
allow dkim_milter_t tmp_t : dir { write add_name remove_name } ; 

Это почти скажите использовать dkim_milter_t иметь разрешение на доступ к каталогам с типом tmp_t лайк /var/tmp,

Но в большинстве случаев у нас нет этого строкового вывода, или этот conf не работает вообще, или другой случай...

Итак, нам нужно добавить политику, которая дает разрешение на политику dkim_milter_t который opendkim использовать для доступа к файлу или директории typetmp_t, И самый простой способ - использовать audit2allow, например, Dedgar:

grep opendkim /var/log/audit/audit.log | audit2allow -M opendkim
semodule -i opendkim.pp

он сгенерирует политику SELinux, чтобы сделать что-то раньше. Но точно не знаю, что это не сработает в случае с Хлоей. Поставь мой opendkim.te:

module opendkim 1.0;

require {
        type tmp_t;
        type dkim_milter_t;
        class dir { write remove_name add_name };
        class file { write create unlink open };
}
allow dkim_milter_t tmp_t:dir { write remove_name add_name };
allow dkim_milter_t tmp_t:file { write create unlink open };

И что, если вам нужно восстановить файл (opendkim.pp для этого) вручную.

checkmodule -M -m -o opendkim.mod opendkim.te
semodule_package -o opendkim.pp -m opendkim.mod

А также semodule -i opendkim.pp за то что тебе нужно.

По моему опыту, это вызвано отсутствием политики SELinux. Вы можете получить ошибку, детализирующую отсутствующие разрешения из журнала аудита, и использовать ее для генерации пакета модуля SELinux с помощью:

grep opendkim /var/log/audit/audit.log | audit2allow -M opendkim

Опция -M обозначает имя пакета модуля, вы можете назвать его как-нибудь еще, если хотите. Эта команда сгенерирует два файла: opendkim.pp, который является фактическим пакетом модуля selinux, и opendkim.te, текстовый файл, показывающий, какие политики содержит пакет модуля.

Если политики выглядят хорошо, импортируйте пакет модуля с:

semodule -i opendkim.pp
Другие вопросы по тегам