系統(tǒng)管理員的容器時(shí)代之殤
系統(tǒng)管理現(xiàn)在處于一個(gè)癲狂的時(shí)代,一片混亂。
我并不是抱怨老式系統(tǒng)管理員們,他們還是知道如何讓系統(tǒng)工作起來(lái),知道怎么更新系統(tǒng)和如何升級(jí)擴(kuò)容。
這篇吐槽是關(guān)于容器、預(yù)構(gòu)建虛擬機(jī)鏡像的,它們真是令人難以置信的混亂,它們的腦子里面就根本沒(méi)有“可信”和“升級(jí)”的概念。
舉個(gè) Hadoop 的例子,似乎就沒(méi)有人知道如何從頭構(gòu)建一份 Hadoop,它那令人頭昏眼花的依賴關(guān)系、版本需求和構(gòu)建工具讓人云山霧罩。所有這些“神奇”的工具仍然是通過(guò)傳統(tǒng)的 make 命令構(gòu)建的,每個(gè)工具都是它自己帶的,彼此不兼容,你得按照沒(méi)有復(fù)用意義的“當(dāng)日路線圖”來(lái)構(gòu)建。因?yàn)闆](méi)有人能從頭構(gòu)建,所以現(xiàn)在大家都從一些不定是哪個(gè)的網(wǎng)站去下載已經(jīng)編譯好的二進(jìn)制,基本上沒(méi)有任何認(rèn)證和簽名。
這是 NSA 和病毒們的天堂啊!不需要搞什么破解和漏洞挖掘,只需要弄個(gè)“APP”、虛擬機(jī)或 Docker 鏡像,人們就會(huì)把這些惡意代碼弄到他們的網(wǎng)絡(luò)里面去。
Debian 的 Hadoop 維基頁(yè)就是一個(gè)典型的例子,基本上,從 2010 年開(kāi)始人們就已經(jīng)放棄了從源代碼構(gòu)建一個(gè) Debian 上可用的 Hadoop 包了。
要構(gòu)建 Apache Bigtop,你首先需要安裝 puppet3,然后用它從互聯(lián)網(wǎng)上下載一些魔法般數(shù)據(jù)。以 sudo 的權(quán)限啟動(dòng) puppet ,順便給 NSA 開(kāi)個(gè)后門(mén)(舉個(gè)例子,它會(huì)下載和安裝一個(gè)過(guò)期的預(yù)編譯的 JDK——因?yàn)樗J(rèn)為你太笨了,不會(huì)安裝 Java),然后期待它能順利構(gòu)建而不是拋出200行的毫無(wú)用處的報(bào)錯(cuò)跟蹤。
我沒(méi)有開(kāi)玩笑,它會(huì)試著執(zhí)行像下面這樣的腳本:
- /bin/bash -c "wget http://www.scala-lang.org/files/archive/scala-2.10.3.deb ; dpkg -x ./scala-2.10.3.deb /"
注意,甚至這并沒(méi)有正常的安裝這個(gè)包,而只是將其解壓縮到你的根目錄下!下載時(shí)也沒(méi)有檢查任何簽名、沒(méi)有通過(guò) SSL(腳本來(lái)自 Bigtop 的 puppet 清單)。
即便你的構(gòu)建正常工作了,它也會(huì)通過(guò) Maven 下載來(lái)自互聯(lián)網(wǎng)的沒(méi)有簽名的二進(jìn)制代碼,并用這些來(lái)構(gòu)建。
不再寫(xiě)一些干凈的、模塊化的架構(gòu),所有這些現(xiàn)在都牽扯在混亂的依賴?yán)锩?。我上次看到?hadoop 的類路徑已經(jīng)有 100 多個(gè) jar 了,現(xiàn)在?我打賭它肯定有 150 個(gè)了。那些 HBaseGiraphFlumeCrunchPigHiveMahoutSolrSparkElasticsearch 以及 Apache 家族的其它東東都是這樣混亂。
所謂軟件棧,現(xiàn)在的意思是“我也不知道我實(shí)際上用的是啥”。
Maven 、ivy 和 sbt 這些即用的工具其實(shí)就是讓你的系統(tǒng)從互聯(lián)網(wǎng)下載那些無(wú)簽名的二進(jìn)制數(shù)據(jù)并運(yùn)行在你的計(jì)算機(jī)上。
再加上容器,哦天哪,更亂了。
是否想過(guò)給容器進(jìn)行安全更新?
基本上,Docker 的思路就是下載一個(gè)未簽名的二進(jìn)制并運(yùn)行它,然后期望它不要將任何后門(mén)放到你的公司網(wǎng)絡(luò)里面去。
這就像是我在90年代時(shí)在 Windows 上下載的共享軟件一樣。什么時(shí)候會(huì)出現(xiàn)***個(gè)帶有 Ask 工具條的 Docker 鏡像呢?***個(gè)通過(guò) Docker 鏡像傳播的互聯(lián)網(wǎng)蠕蟲(chóng)呢?
回到前些年,Linux 發(fā)行版努力著提供一個(gè)安全的操作系統(tǒng),帶有簽名的軟件包、可信的網(wǎng)絡(luò)、甚至還能完全的重新構(gòu)建。
而現(xiàn)在呢?什么東西都已經(jīng) Windows 化了,到處是瘋狂的“App”,你下載,你運(yùn)行,根本不管是否安全,是否能升級(jí)到下個(gè)版本。因?yàn)槟憔褪?ldquo;過(guò)把癮就死”!
更新:其實(shí)在 Docker 之前就有這樣的作法了,Docker 只是一個(gè)新的 'curl | sudo bash' 而已。是的,這就是主流的、在你的數(shù)據(jù)中心下載并運(yùn)行一個(gè)不可信軟件的方法。這太糟糕了,真的。之前,系統(tǒng)管理員還在努力的防御安全漏洞,現(xiàn)在,他們自稱 “devops”了,然后很 happy 地把這些東西弄到他們的網(wǎng)絡(luò)里面了!