close

點擊上方「Java基基」,選擇「設為星標」

做積極的人,而不是積極廢人!

每天14:00更新文章,每天掉億點點頭髮...

源碼精品專欄

原創 | Java 2021超神之路,很肝~

中文詳細注釋的開源項目

RPC 框架 Dubbo 源碼解析

網絡應用框架 Netty 源碼解析

消息中間件 RocketMQ 源碼解析

數據庫中間件 Sharding-JDBC 和 MyCAT 源碼解析

作業調度中間件 Elastic-Job 源碼解析

分布式事務中間件 TCC-Transaction 源碼解析

Eureka 和 Hystrix 源碼解析

Java 並發源碼

來源:雲原生實驗室

概念驗證
解決方案

這兩天 Hacker News 上面有一個貼子 [1]火了,這是一封發給 Docker 安全團隊的郵件,主要講的是 Docker 有一個非常離譜的安全隱患。即使你通過像 -p 127.0.0.1:80:80 這樣的參數將端口暴露到迴環地址,外部仍然可以訪問該服務 ,怎麼回事呢?

原因其實很簡單,Docker 添加了這樣一條 Iptables 規則:

🐳→iptables-nvLDOCKERChainDOCKER(2references)pktsbytestargetprotoptinoutsourcedestination00ACCEPTtcp--!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。

>基於 Spring Boot + MyBatis Plus + Vue & Element 實現的後台管理系統+用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能。>>項目地址:<https://github.com/YunaiV/ruoyi-vue-pro>#IP:192.168.0.100🐳→dockerrun-ePOSTGRES_PASSWORD=password-p127.0.0.1:5432:5432postgres

② 同一個局域網中的 B 機器添加路由表,將所有訪問 172.16.0.0/12 的流量指向 A 機器。

>基於微服務的思想,構建在 B2C 電商場景下的項目實戰。核心技術棧,是 Spring Boot + Dubbo 。未來,會重構成 Spring Cloud Alibaba 。>>項目地址:<https://github.com/YunaiV/onemall>#IP:192.168.0.200🐳→iprouteadd172.16.0.0/12via192.168.0.100

③ 在 B 機器中掃描 A 機器的端口。

🐳→nmap-p5432-Pn--open172.16.0.0/12StartingNmap7.92(https://nmap.org)at2021-11-0515:00CDTNmapscanreportfor172.17.0.2Hostisup(0.00047slatency).PORTSTATESERVICE5432/tcpopenpostgresql

④ 在 B 機器中直接連接 PostgreSQL。

🐳→psql-h172.17.0.2-UpostgresPasswordforuserpostgres:解決方案

事實上不僅僅是 127.0.0.1,你將容器端口映射到主機的任何一個地址,外部都可以訪問到,這就離了大譜了!

郵件作者給 Docker 團隊提出了一個解決方案,希望能優化 Docker 的 iptables 規則:

① 首先要嚴格限制允許訪問容器端口的源地址和網絡接口,例如 docker run -p 127.0.0.1:5432:5432 的原 iptables 規則如下:

ChainDOCKER(2references)pktsbytestargetprotoptinoutsourcedestination00ACCEPTtcp--!docker0docker00.0.0.0/0172.17.0.2tcpdpt:5432

改進後 的 iptables 規則如下:

ChainDOCKER(2references)pktsbytestargetprotoptinoutsourcedestination00ACCEPTtcp--lodocker0127.0.0.1/8172.17.0.2tcpdpt:5432

同理,如果主機的地址為 192.168.0.100,掩碼為 24,那麼 docker run -p 192.168.0.100:5432:5432 的 iptables 規則就應該是:

ChainDOCKER(2references)pktsbytestargetprotoptinoutsourcedestination00ACCEPTtcp--eth0docker0192.168.0.0/24172.17.0.2tcpdpt:5432

② 最後要修改默認行為,如果使用 -p 參數時沒有指定任何 IP 地址,就默認映射到 127.0.0.1。

雖然評論區也有很多人給出了添加 iptables 規則來進行限制的方案,但這是不現實的,目前全世界有成千上萬的用戶在使用 -p 參數將容器端口映射到 127.0.0.1,攻擊者估計早就發現了這個漏洞,我們不能期望用戶自己添加 iptables 規則來限制外部訪問,最靠譜的方式還是等 Docker 官方修復這個 bug 然後升級吧。

歡迎加入我的知識星球,一起探討架構,交流源碼。加入方式,長按下方二維碼噢:

已在知識星球更新源碼解析如下:

最近更新《芋道 SpringBoot 2.X 入門》系列,已經 101 余篇,覆蓋了MyBatis、Redis、MongoDB、ES、分庫分表、讀寫分離、SpringMVC、Webflux、權限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能測試等等內容。

提供近 3W 行代碼的 SpringBoot 示例,以及超 6W 行代碼的電商微服務項目。

獲取方式:點「在看」,關注公眾號並回復666領取,更多內容陸續奉上。

文章有幫助的話,在看,轉發吧。

謝謝支持喲 (*^__^*)

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()