系統管理員的容器時代之殤
(題圖來自 crtdot.com)
舉個 Hadoop 的例子,似乎就沒有人知道如何從頭構建一份 Hadoop,它那令人頭昏眼花的依賴關係、版本需求和構建工具讓人云山霧罩。所有這些「神奇」的工具仍然是通過傳統的 make 命令構建的,每個工具都是它自己帶的,彼此不兼容,你得按照沒有復用意義的「當日路線圖」來構建。因為沒有人能從頭構建,所以現在大家都從一些不定是哪個的網站去下載已經編譯好的二進位,基本上沒有任何認證和簽名。
這是 NSA 和病毒們的天堂啊!不需要搞什麼破解和漏洞挖掘,只需要弄個「APP」、虛擬機或 Docker 鏡像,人們就會把這些惡意代碼弄到他們的網路裡面去。
Debian 的 Hadoop 維基頁就是一個典型的例子,基本上,從 2010 年開始人們就已經放棄了從源代碼構建一個 Debian 上可用的 Hadoop 包了。
要構建 Apache Bigtop,你首先需要安裝 puppet3,然後用它從互聯網上下載一些魔法般數據。以 sudo 的許可權啟動 puppet ,順便給 NSA 開個後門(舉個例子,它會下載和安裝一個過期的預編譯的 JDK——因為它認為你太笨了,不會安裝 Java),然後期待它能順利構建而不是拋出200行的毫無用處的報錯跟蹤。
我沒有開玩笑,它會試著執行像下面這樣的腳本:
/bin/bash -c "wget http://www.scala-lang.org/files/archive/scala-2.10.3.deb ; dpkg -x ./scala-2.10.3.deb /"
注意,甚至這並沒有正常的安裝這個包,而只是將其解壓縮到你的根目錄下!下載時也沒有檢查任何簽名、沒有通過 SSL(腳本來自 Bigtop 的 puppet 清單)。
即便你的構建正常工作了,它也會通過 Maven 下載來自互聯網的沒有簽名的二進位代碼,並用這些來構建。
不再寫一些乾淨的、模塊化的架構,所有這些現在都牽扯在混亂的依賴裡面。我上次看到, hadoop 的類路徑已經有 100 多個 jar 了,現在?我打賭它肯定有 150 個了。那些 HBaseGiraphFlumeCrunchPigHiveMahoutSolrSparkElasticsearch 以及 Apache 家族的其它東東都是這樣混亂。
所謂軟體棧,現在的意思是「我也不知道我實際上用的是啥」。
Maven 、ivy 和 sbt 這些即用的工具其實就是讓你的系統從互聯網下載那些無簽名的二進位數據並運行在你的計算機上。
再加上容器,哦天哪,更亂了。
是否想過給容器進行安全更新?
基本上,Docker 的思路就是下載一個未簽名的二進位並運行它,然後期望它不要將任何後門放到你的公司網路裡面去。
這就像是我在90年代時在 Windows 上下載的共享軟體一樣。什麼時候會出現第一個帶有 Ask 工具條的 Docker 鏡像呢?第一個通過 Docker 鏡像傳播的互聯網蠕蟲呢?
回到前些年,Linux 發行版努力著提供一個安全的操作系統,帶有簽名的軟體包、可信的網路、甚至還能完全的重新構建。
而現在呢?什麼東西都已經 Windows 化了,到處是瘋狂的「App」,你下載,你運行,根本不管是否安全,是否能升級到下個版本。因為你就是「過把癮就死」!
更新:其實在 Docker 之前就有這樣的作法了,Docker 只是一個新的 'curl | sudo bash' 而已。是的,這就是主流的、在你的數據中心下載並運行一個不可信軟體的方法。這太糟糕了,真的。之前,系統管理員還在努力的防禦安全漏洞,現在,他們自稱「devops」了,然後很 happy 地把這些東西弄到他們的網路裡面了!
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive