Я установил 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
сообщение об ошибке вернулось?
Перейти к /etc/opendkim.conf и измените эту строку:
TemporaryDirectory /var/tmp
кому:
TemporaryDirectory /var/run/opendkim
И перезапустите свои почтовые службы (например
# service opendkim restart
# chkconfig opendkim on
# service postfix restart
У вопроса уже было решение Вот
Нет необходимости разрешать OpenDKIM писать в любые другие каталоги. Просто напишите во временный каталог по умолчанию, / var / run / opendkim, который уже должен существовать и иметь правильный контекст SELinux, чтобы разрешить запись.
(И Вот это решение избегать эта проблема в SELinux.)
Так. Очень старая ветка, не поддающаяся разрешению. И примерно несколько дней назад я нашел эту тему, так как ive столкнулся с той же проблемой и решил ее с помощью решения Дедгара.
И вы можете попробовать ниже, что, если вы действительно хотите установить 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
...
Как сказал Дедгар, похоже, что у opendkim отсутствует политика, которая может создавать файл из 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
Результат может выглядеть так:
... разрешить демону puppet_tmp_t: file {ioctl read write getattr lock append}; разрешить dkim_milter_t tmp_t: file {написать создать удалить ссылку открыть}; разрешить dkim_milter_t tmp_t: dir {написать add_name remove_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
,
Но в большинстве случаев у нас нет этого строкового вывода, или эта конфигурация вообще не работает, или другой случай ...
Итак, нам нужно добавить политику, которая дает разрешение на политику dkim_milter_t
который opendkim
использовать для доступа к файлу или каталогам type
tmp_t
. И самый простой способ - использовать audit2allow как выразился Дедгар:
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