限制Docker容器的网络访问

限制Docker容器的网络访问

我正在创建仅 SFTPDocker容器,一个将被多个人使用,其唯一目的是在他们自己的chrooted 环境中上传和管理文件。

从理论上讲,它非常安全:我将禁用所有形式的bash登录,并且不会在其中运行任何其他进程。但是,我想再加强一点:

我想阻止这个容器从内部访问互联网,除非它作为 SFTP 服务器。

为了清楚起见:我知道如何阻止外界访问我的容器 - 我可以设置传入iptables规则,并且只能在 docker run 命令中公开 SFTP 端口。

但是我想让以下命令(作为示例)在运行时失败里面容器:

curl google.com

我的目的是减少被黑客入侵的容器所造成的损害(不能被用来发送垃圾邮件等)。

答案1

在 docker 实例中设置一些入口规则以帮助抵御攻击仍然是有意义的,但您必须限制来自 docker 映像所连接的任何上游路由器的出站(互联网)访问。这样做的原因是,如果您尝试使用实例中的防火墙规则阻止出站访问,那么如果实例受到攻击,攻击者可能会删除这些规则。通过阻止通过实例路由器的出站,即使在受到攻击的情况下,您也可以阻止出站访问 - 攻击者也必须破坏路由器。


好的,在收到一些解释过滤是针对容器主机的评论后,我们更清楚要完成的任务。在这种情况下,在主机上,您可以添加一些类似这样的规则:

iptables -A FORWARD -s lo.cal.sub.net -d con.tai.ner.ip -j ACCEPT
iptables -A FORWARD -s con.tai.ner.ip -d lo.cal.sub.net -j ACCEPT
iptables -A FORWARD -s ! lo.cal.sub.net -d con.tai.ner.ip -p tcp --dport sftp -j ACCEPT
iptables -A FORWARD -s con.tai.ner.ip -d ! lo.cal.sub.net -p tcp --sport sftp -j ACCEPT
iptables -A FORWARD -s con.tai.ner.ip -m state --state related,established -j ACCEPT
iptables -A FORWARD -s con.tai.ner.ip -j DROP

前两个规则用于主机和容器之间的访问。第三条规则(大致)规定,任何不是主机子网的 SFTP 内容对我们来说都是可以的;第四条规则是出站规则,基本上是第三条规则的孪生子;第五条规则是万能规则(以防使用其他相关端口),虽然它应该不需要,但您可能可以将其删除;最后一条规则是阻止访问主机子网以外的任何内容的魔法。由于访问权限是在前几条规则中给出的,因此除非前面的规则都不适用,否则它永远不会触发,在这种情况下,我们会说“我们不在乎你想要什么,你没有匹配任何批准的内容,所以你不能从这里到达那里”。来自外部的入站流量将由第三条和第四条规则满足。

答案2

这实际上不是 docker 特有的问题。有几种方法可以解决这个问题。

  1. 使用状态iptables规则允许入站连接和相关/已建立的流量,然后阻止其他所有内容。

  2. 使用仅 sftp 服务,例如FTPD软件无法运行 shell。

一般来说,如果您不允许用户获取 shell 并且不允许他们从容器内运行程序,那么您不必担心这一点。

答案3

这只是我的一个想法,我还没有测试过。在投入生产之前,你需要在实验室里进行测试。

为了防止非 SSH(SFTP)和 Web 端口上的出站流量,您可能需要通过 IPTABLES 或另一个 Layer4 防火墙应用策略来丢弃或拒绝来自 docker 容器使用的网段且目的地为 0.0.0.0/0 的流量,目标端口为 TCP22 除外。

为了解决网络上未批准访问的地方的问题,您可能需要尝试设置一个过滤/缓存代理实例,例如 squid 或 bluecoat,该代理正在监听接口 docker0,并使用主机的默认路由访问互联网。从那里,您可以根据许多标准应用策略,并通过缓存静态内容来节省网络利用率。您可能希望在主机上使用 NAT(我认为 IPTABLES 和 Masquerade 在 Linux 中提供此功能)以透明地强制使用代理(我在对 我只想代理 HTTP,但我不知道如何处理 HTTPS 流量)。这意味着首先要有一个符合公司政策的上网理由。

由于 SSH(SFTP 所基于的 SSH)的性质,除非您实施一项策略,即容器只能使用您提供的密钥对,否则您将无法提供文件移动流量的拦截。这对您来说是件好事,因为它为您提供了一些“我无法看到或控制传输的文件“如果您的客户传输了非法内容(例如侵犯知识产权,或使用您的服务泄露带有分类标签的信息,或者他们进行 CP 交易),如果您因客户的行为被告上法庭(类似于电信公司的公共承运人身份),则您可以进行辩护。这对您不利,因为您无法缓存经常重新传输的、未更改的文件,并且您与客户签订的任何合同中的政策基本上都无法通过技术手段执行。

相关内容