![如何让 SElinux 和 postfix 与自定义 milter 一起运行?](https://linux22.com/image/604824/%E5%A6%82%E4%BD%95%E8%AE%A9%20SElinux%20%E5%92%8C%20postfix%20%E4%B8%8E%E8%87%AA%E5%AE%9A%E4%B9%89%20milter%20%E4%B8%80%E8%B5%B7%E8%BF%90%E8%A1%8C%EF%BC%9F.png)
我在 RHEL6 上设置了 IPv4 的 postfix,SElinux 处于强制模式。除非我离开强制模式,否则我所有整合 opendkim 的尝试都会失败。
SElinux 执行时我遇到的错误:
Jan 25 09:57:25 <mail.warning> katniss postfix/cleanup[16571]: warning: cannot receive milters via service cleanup socket socket
Jan 25 09:57:25 <mail.crit> katniss postfix/cleanup[16571]: fatal: cleanup_milter_receive: milter receive failed
Jan 25 09:57:26 <mail.warning> katniss postfix/smtpd[16567]: warning: cannot send milters to service public/cleanup socket
Jan 25 09:57:26 <mail.warning> katniss postfix/master[16559]: warning: process /usr/libexec/postfix/cleanup pid 16571 exit status 1
Jan 25 09:57:26 <mail.warning> katniss postfix/master[16559]: warning: /usr/libexec/postfix/cleanup: bad command startup -- throttling
我最近做了什么:
setenforce permissive
(发送邮件作品)
setenforce enforcing
(发送邮件失败出现cleanup
上述错误)
egrep -e 'postfix|opendkim|cleanup' /var/log/audit/audit.log | audit2allow -m postfixMine > postfixMine.te
checkmodule -M -m -o postfixMine.mod postfixMine.te
semodule_package -m postfixMine.mod -o postfixMine.pp
semodule -i postfixMine.pp
(发送邮件仍然失败与上述错误相同cleanup
)
因此,在宽松的 SElinux 设置下,一切都按预期工作,而在强制设置下,一切都会失败。
在后缀中main.cf
:
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept
milter_protocol = 2
一些信息:
# netstat -napl | grep 8891
tcp 0 0 127.0.0.1:8891 0.0.0.0:* LISTEN 16464/opendkim
# ps -ef|grep opendkim
opendkim 16463 1 0 09:56 ? 00:00:00 /usr/local/sbin/opendkim -x /etc/opendkim.conf -P /var/run/opendkim/opendkim.pid
opendkim 16464 16463 0 09:56 ? 00:00:00 /usr/local/sbin/opendkim -x /etc/opendkim.conf -P /var/run/opendkim/opendkim.pid
# ls -lZ /usr/libexec/postfix/cleanup
-rwxr-xr-x. root root system_u:object_r:postfix_cleanup_exec_t:SystemLow /usr/libexec/postfix/cleanup
开始之前拉我的头发有人能给我指出正确的方向吗?肯定是我忽略了一些非常简单的事情。
我知道 SElinux 的用途,但我还没有找到任何适合“我的水平”的教程(简短且信息丰富):-) 所以在 SElinux 方面我还是个新手。非常愿意学习。
禁用 SElinux 不是我的学习方式。
答案1
问题是audit2allow
-generatedpostfixMine.te
变成了:
module postfixMattias 1.0;
require {
type postfix_smtpd_t;
type postfix_cleanup_t;
class tcp_socket { getopt getattr };
}
#============= postfix_cleanup_t ==============
#!!!! This avc is allowed in the current policy
allow postfix_cleanup_t postfix_smtpd_t:tcp_socket { getopt getattr };
我添加了tcp_socket 类read
并将write
其放入其中:
module postfixMine 1.0;
require {
type postfix_smtpd_t;
type postfix_cleanup_t;
class tcp_socket { getopt getattr read write };
}
#============= postfix_cleanup_t ==============
#!!!! This avc is allowed in the current policy
allow postfix_cleanup_t postfix_smtpd_t:tcp_socket { getopt getattr read write };
然后按照以下命令重新编译新策略:
checkmodule -M -m -o postfixMine.mod postfixMine.te
semodule_package -m postfixMine.mod -o postfixMine.pp
semodule -i postfixMine.pp
现在它终于起作用了!