點擊上方「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領取,更多內容陸續奉上。
文章有幫助的話,在看,轉發吧。
謝謝支持喲 (*^__^*)