限制Docker容器的网络访问


14

我正在创建一个仅SFTP的Docker容器,该容器将由多个人使用,其唯一目的是在自己的chrooted环境中上载和管理文件。

从表面上看,这是非常安全的:我将禁用每种形式的bash登录,并且不会在其中运行任何其他进程。但是,我想进一步加强一点:

我想阻止此容器从内部访问Internet,但其目的是成为SFTP服务器。

需要说明的是:我知道如何防止外界访问我的容器-我可以设置传入iptables规则,并且可以在docker run命令中仅公开SFTP端口。

但是,当容器运行时,我想使以下命令失败(例如):

curl google.com

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


有几个待处理的功能请求可以帮助解决此类问题。#6743可让您在启动容器之前在主机上预先创建iptables规则,而#6982可让您在容器启动时添加iptables规则。
帕特里克

Docker使您可以完全控制容器的网络接口。请参阅Docker如何将容器联网。例如,将--net=none标志设置为on docker run将禁用所有外部网络适配器,使您可以添加自己的和自定义网络流量规则。
sffc

Answers:


4

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


好的,因此,在收到一些解释说明该过滤是针对容器的主机的注释之后,要完成的目标要清楚得多。在这种情况下,您可以在主机上添加一些与此类似的规则:

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传输的任何东西对我们来说都是可以的。第四个是出站规则,基本上是第三个规则的双胞胎;第五个规则是一个包罗万象的规则(如果使用了其他相关的端口),尽管不需要它,但是您可以将其删除;最后一条规则是防止访问主机子网以外的任何内容的魔力。由于访问是在前几个规则中给出的,因此除非前面的规则都不适用,否则它永远不会触发,在这种情况下,我们说的是“我们不在乎您想要什么,您没有匹配您所批准的任何东西,因此您无法从这里到达那里”。第3和第4条规则将满足来自外部的入站流量。


有趣的是,如果没有对容器内容的绝对信任,就无法在容器内执行此操作
艾利·佩恩

docker容器的上游路由器(假定默认为最受支持的配置)是运行它的主机,我们正在寻找一种在不破坏其他docker功能的情况下该主机(而不是容器内部)禁用单个容器的Internet访问的方法。 。
TarnayKálmán2014年

(叹气)我真的不应该在仅仅6个小时的睡眠中重新编写答案。我已经修改了给出的答案。
艾利·佩恩

Docker(假定默认为最受支持的配置)通过其用户空间tcp代理在主机上发布容器端口,因此我不确定转发链是否甚至与有关sftp服务的规则相关。
TarnayKálmán2014年

猜猜我将不得不建立一个测试环境并推出Docker,并查看其中涉及的内容。听起来您好像在建议将规则从向前移到输入。
艾利·佩恩

1

这并不是docker特定的问题。有两种方法可以解决此问题。

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

  2. 使用无法运行Shell的仅sftp服务(例如ProFTPD)

通常,如果您不允许用户获取shell,也不允许他们从容器中运行程序,则无需担心。


1.)Docker默认情况下会自行设置一些规则,将其追加将不会执行任何操作,因为已经存在一个可捕获的规则,并且如果不谨慎,则前置将破坏现有功能(例如链接),所以不是那么简单。2.)不回答问题。OP已经这样设置了。另外,我的用例是不同的。
TarnayKálmán2014年

0

这只是一个快速的头脑风暴,我还没有测试过。您需要先在实验室中对其进行审核,然后再投入生产。

为了防止非SSH(SFTP)和Web端口上的出站流量,您可能希望通过IPTABLES或其他Layer4防火墙将策略应用于从Docker容器使用的网段发往0.0.0.0/0的网段的DROP或REJECT流量,除非目标为端口是TCP22。

为了解决无法在网络上放置的问题,您可能想尝试设置一个过滤/缓存代理实例,例如squid或bluecoat,该实例正在侦听接口docker0并正在使用主机的违法路线以连接到互联网。从那里,您可以基于许多标准应用策略,以及通过缓存静态内容来节省网络利用率。您可能要在主机上使用NAT(我认为IPTABLES和Masquerade在Linux中提供了此功能)以透明地强制使用代理(我在答复中对此进行了描述, 我只想代理HTTP,但不确定如何使用HTTPS流量)。这意味着首先要符合公司政策的理由进入网络。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.