docker 2375 vulnerability and self-signatuer certifications
Docker暴露2375端口,引起安全漏洞
今天有小伙伴发现Docker暴露出2375端口,引起了安全漏洞。我现在给大家介绍整个事情的来龙去脉,并告诉小伙伴们,怎么修复这个漏洞。
为了实现集群管理,Docker提供了远程管理接口。Docker Daemon作为守护进程,运行在后台,可以执行发送到管理接口上的Docker命令。正是因为错误的使用了Docker远端接口,引起安全漏洞。
启动Docker Daemon时,加入-H 0.0.0.0:2375,Docker Daemon就可以接收远端的Docker Client发送的指令。注意,Docker是把2375端口作为非加密端口暴露出来,一般是用在测试环境中。此时,没有任何加密和认证过程,只要知道Docker主机的IP,任何人都可以管理这台主机上的容器和镜像。
漏洞是什么
国内牛人开发了一套牛逼的搜索引擎-钟馗之眼,可以扫描出主机上的暴露的端口。在ZoomEye.org上输入关键字docker port:2375,立即可以扫描出所有暴露了2375端口的Docker主机。因为没有加密,知道了主机IP以后,黑客就可以为所欲为了。 目前全球有717台机器暴露出2375端口!真是太可怕了!
这些主机分布在全球各个国家,其中,美国的主机最多。这是因为Docker是美国的使用率最高,国内也会在一两年内大规模使用Docker。所有小伙伴们必须解决安全问题。
黑客在查询到主机IP以后,就可以管理这些主机上的容器了。
docker -H IP:2375 infoContainers: 8 Running: 8 Paused: 0 Stopped: 0 Images: 62 Server Version: 1.11.0
通过这个漏洞,甚至可以获取主机信息。攻击者简直就能为所欲为。
docker -H IP:2375 run --rm -v /:/root alpine cat /root/etc/hostnamedocker-node-5
如何发现漏洞
小伙伴们,赶快检查一下你的Docker是否暴露了2375端口。
1.检查docker daemon进程,查看是否开启2375端口。
ps -ef | grep docker/usr/bin/docker daemon -H=tcp://0.0.0.0:2375
2.通过远程管理的方式,向Docker主机发送命令。
docker -H 192.168.0.10:2375 infoContainers: 41 Running: 16 Paused: 0 Stopped: 25 Images: 821 Server Version: 1.10.3
如何修复该漏洞
如果要安全的管理远程Docker主机,应该怎么做呢?其实,Docker本身提供了加密的远程管理端口2376,配合CA证书,就能提供TLS连接了。
首先要准备5个证书和秘钥文件,分别是ca.pem、server-cert.pem、server-key.pem、client-cert.pem和client-key.pem。其中,server-cert.pem中限制了能够访问Docker主机的客户端列表。
启动Docker Deamon时,需要设置-H、–tls、–tlscacert=ca.pem、–tlscert=server-cert.pem和–tlskey=server-key.pem。此时,只有客户端列表中的主机能够访问Docker主机。
具体配置比较复杂,我现在为大家详细介绍这些步骤。
1.生成CA私钥ca-key.pem,使用该私钥对CA证书签名。
ca-key.pem是一个临时文件,最后可以删除。
openssl genrsa -out ~/docker/ca-key.pem 4096
2.使用CA私钥生成自签名CA证书ca.pem。生成证书时,通过-days 365设置证书的有效期。单位为天,默认情况下为30天。
openssl
req -x509 -sha256 -batch -subj '/C=CN/ST=Sichuan/L=Chengdu/O=Ghostcloud
Co.,Ltd/OU=Laboratory/CN=www.ghostcloud.cn' -new -days 365 -key
~/docker/ca-key.pem -out ~/docker/ca.pem
生成CA证书时,需要提供一些公司信息。
C表示国家,中国为CN。
ST表示省,比如Sichuan。
L表示城市,比如Chengdu。
O表示公司,比如Ghostcloud Co.,Ltd。
OU表示部门名字,比如Laboratory。
CN表示公司域名,比如www.ghostcloud.cn。
3.生成服务器私钥server-key.pem和CSR(Certificate Signing Request)server-csr.pem。CN为DockerDaemon。
server-csr.pem是一个临时文件,生成server-cert.pem以后,可以删除。
openssl
genrsa -out ~/docker/server-key.pem 4096openssl req -subj
'/CN=DockerDaemon' -sha256 -new -key ~/docker/server-key.pem -out
~/docker/server-csr.pem
4.使用CA证书生成服务器证书server-cert.pem。TLS连接时,需要限制客户端的IP列表或者域名列表。只有在列表中的客户端才能通过客户端证书访问Docker Daemon。在本例中,只允许127.0.0.1和192.168.1.100的客户端访问。如果添加0.0.0.0,则所有客户端都可以通过证书访问Docker Daemon。
allow.list是一个临时文件,生成server-cert.pem以后,可以删除。
echo
subjectAltName = IP:127.0.0.1,IP:192.168.1.100 >
~/docker/allow.listopenssl x509 -req -days 365 -sha256 -in
~/docker/server-csr.pem -CA ~/docker/ca.pem -CAkey ~/docker/ca-key.pem
-CAcreateserial -out ~/docker/server-cert.pem -extfile
~/docker/allow.list
5.生成客户端私钥client-key.pem和CSRclient-csr.pem。CN为DockerClient。
client-csr.pem是一个临时文件,生成client-cert.pem以后,可以删除。
openssl
genrsa -out ~/docker/client-key.pem 4096openssl req -subj
'/CN=DockerClient' -new -key ~/docker/client-key.pem -out
~/docker/client-csr.pem
6.使用CA证书生成客户端证书client-cert.pem。需要加入extendedKeyUsage选项。
echo
extendedKeyUsage = clientAuth > ~/docker/options.listopenssl x509
-req -days 365 -sha256 -in ~/docker/client-csr.pem -CA ~/docker/ca.pem
-CAkey ~/docker/ca-key.pem -CAcreateserial -out ~/docker/client-cert.pem
-extfile ~/docker/options.list
7.成功生成了需要的证书和秘钥,可以删除临时文件。
rm -f ~/docker/server-csr.pem ~/docker/client-csr.pem ~/docker/allow.list ~/docker/options.list
8.为了保证证书和私钥的安全,需要修改文件的访问权限。
chmod
0444 ~/docker/ca.pem ~/docker/server-cert.pem
~/docker/client-cert.pemchmod 0400 ~/docker/ca-key.pem
~/docker/server-key.pem ~/docker/client-key.pem
9.重启Docker Daemon,加入ca.pem、server-cert.pem和server-key.pem。-H=0.0.0.0:2376表示Docker Daemon监听在2376端口。
docker
daemon --tlsverify --tlscacert=~/docker/ca.pem
--tlscert=~/docker/server-cert.pem --tlskey=~/docker/server-key.pem
-H=0.0.0.0:2376
10.在客户端,运行docker命令时,加入ca.pem、client-cert.pem和client-key.pem。本例中,只有127.0.0.1和192.168.1.100的客户端可以访问Docker Daemon。
docker
--tlsverify --tlscacert=~/docker/ca.pem
--tlscert=~/docker/client-cert.pem --tlskey=~/docker/client-key.pem
-H=tcp://127.0.0.1:2376 infoContainers: 41 Running: 16 Paused: 0
Stopped: 25 Images: 821 Server Version: 1.10.3
现在小伙伴们就可以安全的远程控制Docker主机了。
docker 2375 vulnerability and self-signatuer certifications的更多相关文章
- 通过daemon.json配置docker 2375 API端口,配置私有http仓库
编辑daemon.json vi /etc/docker/daemon.json 配置如下内容即可 { "hosts":[ "tcp://0.0.0.0:2375&quo ...
- Docker开启Remote API 访问 2375端口
Docker常见端口 我看到的常见docker端口包括: 2375:未加密的docker socket,远程root无密码访问主机2376:tls加密套接字,很可能这是您的CI服务器4243端口作为h ...
- 【Docker】在本地打包maven程序为docker镜像报错: Connect to localhost:2375 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1]
错误信息: [ERROR] Failed to execute goal com.spotify:docker-maven-plugin:1.0.0:build (default-cli) on pr ...
- Docker系列(七):Docker图形化管理和监控
Docker管理工具之官方三剑客 Docker Machine是什么鬼 从前 现在 你需要登录主机,按照主机及操作系统特有的安装以及配置步骤安装Docker,使其 能运行Docker容器. Docke ...
- WSL2 + Docker + IDEA 开发到发布一步到位
摘要:本文主要介绍了如何用WSL2.Docker.IDEA将Java应用从开发到发布一步到位. 上次介绍了如何在Windows(WSL2) Linux子系统中搭建搭建Docker环境,这次将利用上次搭 ...
- 通过Portainer统一管理不同服务器的Docker
通过Portainer统一管理不同服务器的Docker 一.可视化管理工具Portainer的安装 二.跨服务器管理Docker 2.1开启2375监听端口 2.2Portainer配置远程管理 一. ...
- 比 WSL2 更香的是 Docker for windows!
今天给大家推荐一个软件 -- "Docker for windows": 如果你对WSL2,还不熟悉,可以关注公众号或小程序看看我之前推送过的两篇文章. Docker for wi ...
- 手把手详解持续集成之GitLab CI/CD
一.环境准备 首先需要有一台 GitLab 服务器,然后需要有个项目:这里示例项目以 Spring Boot 项目为例,然后最好有一台专门用来 Build 的机器,实际生产中如果 Build 任务不频 ...
- 云原生生态周报 Vol. 5 | etcd性能知多少
业界要闻 1 Azure Red Hat OpenShift已经GA.在刚刚结束的Red Hat Summit 2019上,Azure Red Hat OpenShift正式宣布GA,这是一个微软和红 ...
随机推荐
- zookeeper_process内存泄露问题
单线程模式下,不能递归调用zookeeper_process函数,否则会造成内存泄露. 下列图是在watcher中调用zookeeper_process时,用valgrind检测到的情况:
- jQuery 检查某个元素在页面上是否存在实例代码
用jQuery检查某个元素在网页上是否存在时,应该根据获取元素的长度来判断,代码如下: if($("#tt").length > 0) { //元素存在时执行的代码 } ...
- fork函数详解--20
一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同 ...
- 移植opencv到pcDuino
OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows和Mac OS操作系统上.它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Pytho ...
- Extjs学习笔记--(四,基本函数介绍)
Ext是Extjs的命名空间,为Extjs框架提供唯一的全局变量 这样做可以避免冲突,便于代码维护 1,apply和applyif方法 apply=function(object, config, d ...
- Mac普通用户修改了/etc/sudoers文件的解决办法
1.开启 Root 账户 打开“系统偏好设置”,进入“用户与群组”面板,记得把面板左下角的小锁打开,然后选择面板里的“登录选项”.在面板右边你会看到“网络账户服务 器”,点击它旁边的“加入…”按钮,再 ...
- python常用内置模块,执行系统命令的模块
Subprocess模块 python3.5将使用Subprocess模块跟操作系统进行交互,比如系统命令,他将替换 os.system os.spawn* subprocess.run()方法封装的 ...
- ionic creator(ionic生成器)
用来生成前端 html 还是挺方便的(接口数据另算),弄好就可以直接下载 https://creator.ionic.io/app/dashboard/projects
- lua知识点整理
1. lua全局环境和局部环境 local cf = loadstring(" local i=0 i=i+1 print(i) ") --从后面两个输出我们可以看出,生成的函数的 ...
- cocos2d-x游戏引擎核心之三——主循环和定时器
一.游戏主循环 在介绍游戏基本概念的时候,我们曾介绍了场景.层.精灵等游戏元素,但我们却故意避开了另一个同样重要的概念,那就是游戏主循环,这是因为 Cocos2d 已经为我们隐藏了游戏主循环的实现.读 ...