最近乌云上出现了一篇文章 http://drops.wooyun.org/papers/15892。这种作者就一个好,写文章比谁都快,可惜从来不愿意踏踏实实的分析,非得搞个大新闻,把Docker/Swarm批判一番。
先说结论,Docker采用C/S结构,但是它的client和server用的是同一个binary文件: docker,根据参数不同执行不同的代码分支,所以很多人可能都不清楚Docker是C/S结构的。Docker的Server端,也叫作Docker Daemon,运行命令/path/to/docker daemon
启动,启动后才能执行其他的docker命令,诸如docker info...
, docker run...
docker client和docker daemon怎么通信呢?默认情况下,docker daemon监听unix domain socket /var/run/docker.sock,client和daemon通过这个domain socket通信。这个文件的模式是这样的
srw-rw---- 1 root docker 0 May 14 21:16 /var/run/docker.sock
显然只有root和docker组的用户才能访问。总结起来就是,默认情况下,只有本机上的root和docker组用户才能操作docker。
那么乌云上的“漏洞”是怎么回事呢?除了通过unix domain socket这种模式,还可以让Docker Daemon把服务暴露在tcp端口上,比如2375,这样就可以在网络上操作Docker了。把服务暴露在网络上带来了一个问题:安全。Docker本身没有身份认证的功能,只要网络上能访问到服务端口,就可以操作Docker。
对这个问题,Docker官方早就给了完整的解决方案,甚至用了数篇文档,不断强调安全性,某些人就是视而不见,连文档都不好好读。 https://docs.docker.com/engine/security/https/
耍大刀把自己砍死了还要怪刀???
阿里云容器服务也是Swarm+Docker的模式,Swarm配置了tls,注意,这里的tls真不是只为了解决中间人攻击。容器服务有一套完整的证书体系,用户连接自己Swarm的时候,需要下载证书,使用证书才能和swarm建立tls连接,没有证书连连接都见不了,扯什么蛋的中间人攻击。说完了Swarm,再说Docker Daemon。Docker Daemon完全不监听任何网络端口,而是反向连接到Swarm,你问怎么做到的?我只能说一句无可奉告。你可能会问:证书被盗了怎么办?没关系,只要到控制台上吊销再重新生成证书就行(妈妈再也不用担心证书安全问题了)
你们啊,毕竟还是too young,too simple,还得学习一个。