В разрешении 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
использовать для доступа к файлу или директории type
tmp_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