OpenDKIM权限被拒绝

我在CentOS 6上安装了opendkim,并在opendkim.confconfiguration文件中将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