如何让 SElinux 和 postfix 与自定义 milter 一起运行?

如何让 SElinux 和 postfix 与自定义 milter 一起运行?

我在 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

现在它终于起作用了!

相关内容