我在CentOS 6上安装了opendkim,并在opendkim.conf
configuration文件中将TemporaryDirectory
设置为/var/tmp
。 重新启动服务并尝试发送电子邮件后,我在后缀日志中读取错误
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
错误消息?
根据我的经验,这是由于缺lessSELinux策略造成的。 您可以从审核日志中获取详细说明缺less的权限的错误,并使用该错误生成一个SELinux模块包:
grep opendkim /var/log/audit/audit.log | audit2allow -M opendkim
-M选项指定模块包的名称,如果你喜欢,你可以命名它。 该命令将生成两个文件:opendkim.pp(实际的selinux模块包)和opendkim.te(一个文本文件,显示模块包所包含的策略)。
如果策略看起来不错,那么导入模块包:
semodule -i opendkim.pp
这个问题已经有了解决办法
没有必要允许OpenDKIM写入任何其他目录。 只需写入默认临时目录/ var / run / opendkim,该目录应该已经存在,并且具有正确的SELinux上下文以允许写入。
( 这是SELinux方式避免这个问题的一个解决scheme。)
所以。 非常古老的线程,抗议决议。 而前几天,我发现这个线程,因为我得到了同样的问题,并通过使用Dedgar的解决scheme解决。
如果你真的想把Temporary
设置为/var/tmp
,你可以试试下面的内容
日志看起来像:
opendkim[46233]: E9A563F480: dkim_eoh(): resource unavailable: can't create temporary file at /var/tmp/dkim.E9A563F480.IjgWhi: Permission denied
正如Chloe所说。 这是一个SELinux错误,因为任何everbody should be able to write into the /var/tmp folder
检查日志文件# grep opendkim /var/log/audit/audit.log
Got:
... 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 ...
正如Dedgar所说,似乎opendkim缺less可以从tmp
文件创build文件的策略。 所以首先检查dirtypes
# 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 {write create unlink open}; 允许dkim_milter_t tmp_t:dir {write add_name remove_name}; 允许域tmp_t:dir {getattrsearch打开}; …
行的通知
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完全不工作或其他情况下…
所以,我们需要添加一个策略,允许opendkim
用来访问文件的策略dkim_milter_t
,或者tmp_t
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
为你所需要的。
进入/etc/opendkim.conf并改变这一行:
TemporaryDirectory /var/tmp
至:
TemporaryDirectory /var/run/opendkim
并重新启动您的邮件服务(例如
# service opendkim restart # chkconfig opendkim on # service postfix restart