近日Hacker News 上面有一个贴子[1]火了,这是一封发给 Docker 安全团队的邮件,主要讲的是 Docker 有一个非常离谱的安全隐患。即使你通过像-p 127.0.0.180
这样的参数将端口暴露到回环地址,外部仍然可以访问该服务,怎么回事呢?
原因其实很简单,Docker 添加了这样一条 Iptables 规则:
→iptables-nvLDOCKER
ChainDOCKER(2references)
pktsbytestargetprotoptinoutsourcedestination
00ACCEPTtcp--!docker0docker00.0.0.0/0172.17.0.2tcpdpt:80
只要外部攻击者通过这台主机将流量发送到172.17.0.2:80
,就会匹配这条规则并成功访问容器中的服务,127.0.0.1 并没有什么卵用。
尴尬的是,选择将端口映射到 127.0.0.1 的用户基本上都是觉得这样很安全,以至于他们不再想采取进一步的安全措施。现在问题来了,映射到 127.0.0.1 不能说是非常安全吧,只能说是与安全毫不相干。。。
概念验证
下面通过一个例子来验证。
① 在 A 机器上运行一个 PostgreSQL 容器,并将端口映射到 127.0.0.1。
#IP:192.168.0.100
→dockerrun-ePOSTGRES_PASSWORD=password-p127.0.0.15432postgres
② 同一个局域网中的 B 机器添加路由表,将所有访问172.16.0.0/12
的流量指向 A 机器。
#IP:192.168.0.200
→iprouteadd172.16.0.0/12via192.168.0.100
③ 在 B 机器中扫描 A 机器的端口。
→nmap-p5432-Pn--open172.16.0.0/12
StartingNmap7.92(https://nmap.org)at2021-11-0515:00CDT
Nmapscanreportfor172.17.0.2
Hostisup(0.00047slatency).
PORTSTATESERVICE
5432/tcpopenpostgresql
④ 在 B 机器中直接连接 PostgreSQL。
→psql-h172.17.0.2-Upostgres
Passwordforuserpostgres:
解决方案
事实上不仅仅是 127.0.0.1,你将容器端口映射到主机的任何一个地址,外部都可以访问到,这就离了大谱了!
邮件作者给 Docker 团队提出了一个解决方案,希望能优化 Docker 的 iptables 规则:
① 首先要严格限制允许访问容器端口的源地址和网络接口,例如docker run -p 127.0.0.15432
的原iptables 规则如下:
ChainDOCKER(2references)
pktsbytestargetprotoptinoutsourcedestination
00ACCEPTtcp--!docker0docker00.0.0.0/0172.17.0.2tcpdpt:5432
改进后的 iptables 规则如下:
ChainDOCKER(2references)
pktsbytestargetprotoptinoutsourcedestination
00ACCEPTtcp--lodocker0127.0.0.1/8172.17.0.2tcpdpt:5432
同理,如果主机的地址为192.168.0.100
,掩码为24
,那么docker run -p 192.168.0.1005432
的 iptables 规则就应该是:
ChainDOCKER(2references)
pktsbytestargetprotoptinoutsourcedestination
00ACCEPTtcp--eth0docker0192.168.0.0/24172.17.0.2tcpdpt:5432
② 最后要修改默认行为,如果使用-p
参数时没有指定任何 IP 地址,就默认映射到 127.0.0.1。
虽然评论区也有很多人给出了添加 iptables 规则来进行限制的方案,但这是不现实的,目前全世界有成千上万的用户在使用-p
参数将容器端口映射到 127.0.0.1,攻击者估计早就发现了这个漏洞,我们不能期望用户自己添加 iptables 规则来限制外部访问,最靠谱的方式还是等 Docker 官方修复这个 bug 然后升级吧。
审核编辑 :李倩
-
端口
+关注
关注
4文章
968浏览量
32091 -
容器
+关注
关注
0文章
495浏览量
22069 -
Docker
+关注
关注
0文章
472浏览量
11864
原文标题:Docker 暴重大安全漏洞:外部网络可直接访问映射到 127.0.0.1 的本地服务
文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论