近日Hacker News 上面有一個(gè)貼子[1]火了,這是一封發(fā)給 Docker 安全團(tuán)隊(duì)的郵件,主要講的是 Docker 有一個(gè)非常離譜的安全隱患。即使你通過(guò)像-p 127.0.0.180
這樣的參數(shù)將端口暴露到回環(huán)地址,外部仍然可以訪問(wèn)該服務(wù),怎么回事呢?
原因其實(shí)很簡(jiǎn)單,Docker 添加了這樣一條 Iptables 規(guī)則:
→iptables-nvLDOCKER
ChainDOCKER(2references)
pktsbytestargetprotoptinoutsourcedestination
00ACCEPTtcp--!docker0docker00.0.0.0/0172.17.0.2tcpdpt:80
只要外部攻擊者通過(guò)這臺(tái)主機(jī)將流量發(fā)送到172.17.0.2:80
,就會(huì)匹配這條規(guī)則并成功訪問(wèn)容器中的服務(wù),127.0.0.1 并沒(méi)有什么卵用。
尷尬的是,選擇將端口映射到 127.0.0.1 的用戶(hù)基本上都是覺(jué)得這樣很安全,以至于他們不再想采取進(jìn)一步的安全措施?,F(xiàn)在問(wèn)題來(lái)了,映射到 127.0.0.1 不能說(shuō)是非常安全吧,只能說(shuō)是與安全毫不相干。。。
概念驗(yàn)證
下面通過(guò)一個(gè)例子來(lái)驗(yàn)證。
① 在 A 機(jī)器上運(yùn)行一個(gè) PostgreSQL 容器,并將端口映射到 127.0.0.1。
#IP:192.168.0.100
→dockerrun-ePOSTGRES_PASSWORD=password-p127.0.0.15432postgres
② 同一個(gè)局域網(wǎng)中的 B 機(jī)器添加路由表,將所有訪問(wèn)172.16.0.0/12
的流量指向 A 機(jī)器。
#IP:192.168.0.200
→iprouteadd172.16.0.0/12via192.168.0.100
③ 在 B 機(jī)器中掃描 A 機(jī)器的端口。
→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 機(jī)器中直接連接 PostgreSQL。
→psql-h172.17.0.2-Upostgres
Passwordforuserpostgres:
解決方案
事實(shí)上不僅僅是 127.0.0.1,你將容器端口映射到主機(jī)的任何一個(gè)地址,外部都可以訪問(wèn)到,這就離了大譜了!
郵件作者給 Docker 團(tuán)隊(duì)提出了一個(gè)解決方案,希望能優(yōu)化 Docker 的 iptables 規(guī)則:
① 首先要嚴(yán)格限制允許訪問(wèn)容器端口的源地址和網(wǎng)絡(luò)接口,例如docker run -p 127.0.0.15432
的原iptables 規(guī)則如下:
ChainDOCKER(2references)
pktsbytestargetprotoptinoutsourcedestination
00ACCEPTtcp--!docker0docker00.0.0.0/0172.17.0.2tcpdpt:5432
改進(jìn)后的 iptables 規(guī)則如下:
ChainDOCKER(2references)
pktsbytestargetprotoptinoutsourcedestination
00ACCEPTtcp--lodocker0127.0.0.1/8172.17.0.2tcpdpt:5432
同理,如果主機(jī)的地址為192.168.0.100
,掩碼為24
,那么docker run -p 192.168.0.1005432
的 iptables 規(guī)則就應(yīng)該是:
ChainDOCKER(2references)
pktsbytestargetprotoptinoutsourcedestination
00ACCEPTtcp--eth0docker0192.168.0.0/24172.17.0.2tcpdpt:5432
② 最后要修改默認(rèn)行為,如果使用-p
參數(shù)時(shí)沒(méi)有指定任何 IP 地址,就默認(rèn)映射到 127.0.0.1。
雖然評(píng)論區(qū)也有很多人給出了添加 iptables 規(guī)則來(lái)進(jìn)行限制的方案,但這是不現(xiàn)實(shí)的,目前全世界有成千上萬(wàn)的用戶(hù)在使用-p
參數(shù)將容器端口映射到 127.0.0.1,攻擊者估計(jì)早就發(fā)現(xiàn)了這個(gè)漏洞,我們不能期望用戶(hù)自己添加 iptables 規(guī)則來(lái)限制外部訪問(wèn),最靠譜的方式還是等 Docker 官方修復(fù)這個(gè) bug 然后升級(jí)吧。
審核編輯 :李倩
-
端口
+關(guān)注
關(guān)注
4文章
948瀏覽量
31986 -
容器
+關(guān)注
關(guān)注
0文章
492瀏覽量
22028 -
Docker
+關(guān)注
關(guān)注
0文章
453瀏覽量
11792
原文標(biāo)題:Docker 暴重大安全漏洞:外部網(wǎng)絡(luò)可直接訪問(wèn)映射到 127.0.0.1 的本地服務(wù)
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論