当有人发布新内容时,我们的 Web 应用程序会向人们发送电子邮件。发件人和收件人都已选择从我们的应用程序接收电子邮件。在准备这样的消息时,我们设置了以下 SMTP 标头:
发件人:author@example.com 收件人:收件人@example.com 发件人:webapp@mycompany.com
我们选择在 FROM 标头中使用作者的电子邮件地址,以尝试为收件人提供最佳体验;当他们在邮件客户端中看到消息时,作者很清楚。为了避免欺骗的出现,我们添加了 SENDER 标头(使用我们自己的公司电子邮件地址)以明确我们代表作者发送了邮件。阅读 RFC 822 和 2822 后,这似乎是发送方标头的预期用途。
大多数接收邮件的服务器似乎都能很好地处理这个问题;电子邮件消息正常传递(假设收件人邮箱存在,未超过配额等)。但是,当从域中的地址向同一域中的地址发送消息时,某些接收域会拒绝消息并给出如下响应:
571 不正确的 IP - psmtp(回复 RCPT TO 命令)
我认为这意味着接收服务器只看到 FROM 标头地址在它自己的域中,并且消息来自它认为没有授权为该域发送消息的服务器。换句话说,接收服务器忽略了 SENDER 标头。
我们有一个解决方法:webapp 保留了一个列表,这些域似乎忽略了 SENDER 标头,当 FROM 和 TO 标头都在这样的域中时,它会将 FROM 标头设置为我们自己的电子邮件地址。但是这个列表需要维护。
有没有更好的方法来实现所需的体验?我们希望成为网络的“好公民”,所有相关方——发送者和接收者——都希望参与并接收这些消息。一种替代方法是始终在 FROM 标题中使用我们公司的电子邮件地址,并将作者的姓名/地址放在主题前面,但这似乎有点笨拙。
在 RHEL 6.2 上,我们在一台主机上使用 httpd 作为另一台主机上 Tomcat 的前端代理,我们还将 mod_status 配置为侦听非标准端口以向监控工具提供状态信息。因此,我们需要httpd 1)建立网络连接,2)监听非标准端口。
默认的目标策略(当前处于许可模式)仅允许 httpd 侦听已定义的端口列表 ( semanage port -l | grep http_port_t),而不允许 httpd 进行出站网络连接。 aureport -a当 httpd 尝试绑定到自定义状态端口以及尝试连接到其他主机上的 AJP 端口时,显示 AVC 拒绝。
我找到了两种解决方案,但一种似乎过于宽容,另一种过于脆弱(即可能在策略升级时中断)。
我曾经audit2allow生成一个本地策略源,然后checkmodule编译它,semodule_package生成一个策略包,并semanage开始执行它。然后我重新启动了 httpd,并确认没有生成 AVC 拒绝。audit2allow 生成的本地策略使用以下授权:
允许 httpd_t port_t:tcp_socket { name_bind name_connect };
它允许 httpd 绑定到任何端口(不仅仅是 http_port_t 中列出的端口),并连接到任何端口。这种方法的优点是它包含在本地策略中,并且不会在下一个yum update. 缺点是它授予了比必要更广泛的许可;httpd 可以绑定并连接到任何端口。
绑定的替代方法是使用以下命令将我们的自定义端口添加到 http_port_t 列表:
semanage port -a -t http_port_t -p tcp (自定义端口号)
我知道我可以看到 http_port_t using …
我们有一个多主机环境,一台主机上有 httpd,另一台主机上有一个应用程序服务器。我们想在 httpd 主机上使用 SELinux,默认的目标策略不会引起什么问题。但它确实阻止了 httpd 与应用服务器主机建立出站网络连接。
有一个 SELinux 布尔值httpd_can_network_connect,如果设置将允许无限制的出站连接,但我想找到一个更窄的解决方案。我想我可以通过定义一个新的端口类型列表来控制目标端口:
semanage port -a -t ajp_port_t -p tcp 9010
然后使用以下内容创建本地策略:
允许 httpd_t ajp_port_t:tcp_socket { name_connect };
如何控制目标地址?