系统管理现在处于一个癫狂的时代,一片混乱。
我并不是抱怨老式系统管理员们,他们还是知道如何让系统工作起来,知道怎么更新系统和如何升级扩容。
这篇吐槽是关于容器、预构建虚拟机镜像的,它们真是令人难以置信的混乱,它们的脑子里面就根本没有“可信”和“升级”的概念。
(题图来自 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 地把这些东西弄到他们的网络里面了!
这也是我一直担心的。
但似乎目前无解。即使有验证、签名。但谁又去保证这些被签名的 “App”的安全呢?
gcc 被写入恶意代码的事儿在开源界肯定是普遍存在的吧。
审核需要资金支持,这也是基金会和厂商存在的原因
我们来搞一个 docker 镜像验证评估的网站吧。
应该叫审查代码,不是审核代码……