一、问题

在使用Docker运行容器化应用时,宿主机通常先要从Registry服务(如Docker Hub)下载相应的镜像(image)。这种镜像机制在开发环境中使用还是很有效的,团队成员之间可以很方便地共享同样的镜像。

然而在实际的生产环境中,当大量主机需要同时从Registry下载镜像运行容器应用时(比如发布新版本,打补丁等情形),Registry 服务往往会成为镜像分发的瓶颈,应用镜像需要较长时间才能传送到所有主机上,使得应用发布的周期大大延长。

对此,许多企业提出了P2P加速镜像下载的解决方案,但都是私有云及内部环境的使用场景,在公有云未得到使用,主要原因是用户担心数据在P2P传输中会出现安全问题。本文将重点阐述确保用户数据安全的P2P镜像分发系统。

二、架构

华为云P2P容器镜像分发系统示例图

华为云容器镜像服务SWR的P2P容器镜像分发系统包含3个组件:客户端代理(Proxy)、BT客户端和BT Tracker。

客户端代理(Proxy)

客户端代理部署在集群的每个节点中,配置为Docker的Http Proxy,截获Docker Daemon的镜像下载请求,通知Client下载,并最终将镜像导入到Docker daemon中。

BT客户端

部署在集群节点的BT客户端和Tracker共同组成了一个完整的P2P文件传输系统。在整个镜像的分发过程中,它们利用BT协议完成镜像下载。

BT Tracker

Tracker是BT系统的一部分,它存储了BT客户端下载过程中所需要的元数据信息和种子信息,并协助各个BT客户端完成整个通信过程。

三、安全

首先,我们限制了跨集群的P2P下载,最大限度的租户间的数据泄露。

之后,在链路层面的安全性和业务层面的安全性做了增强。

1、链路安全

一想到链路安全,我们首先会想到的是加密。

对称加密服务端和客户端采用相同的秘钥加密和解密,只要这个秘钥不公开,并且秘钥足够安全,那么链路就是安全的。但是在网络中都使用相同的对称加密秘钥,无异于公开传输,如果秘钥被劫持,那么就可以篡改链路的所有数据。

然后我们肯定会想到HTTPS,它是怎么实现安全的?我们先来了解下HTTPS的实现方式。

在具体的数据传输过程中,HTTPS采用的是对称加解密的方式,但是它在连接建立时增加了握手协商的过程。

什么是公钥:

公钥是非对称加密中的概念。非对称加密算法方式基于一个秘钥对,数据通过一个秘钥加密,只有通过另外一个秘钥才能解密。服务端保存私钥,公钥发给客户端。

我们假设一个场景,我们生成秘钥对,客户端通过公钥加密数据,服务端通过私钥解密。那么即使用户劫持到公钥,他无法劫持篡改用户的数据。然而从服务端到客户端的链路还是不安全的。

HTTPS借助了非对称加密的这个特性,确保对称机密秘钥的传输是安全的,最后采用对称加密传输数据。

证书的意义:

然而,这又产生了一个新的问题,公钥被劫持了怎么办?

HTTPS当然不会这么简单就被劫持,它引入了数字证书和第三方机构。证书是由第三方认证机构通过公钥签发的,其中不仅包含公钥,还包含签名( 由签发节点的私钥加密产生)、有限期、签发机构、网址、失效日期等。

HTTPS返回的不在是私钥,而是证书。当客户端接收到证书,会对证书做一个校验。在各个机器中都会维护一个权威的第三方机构列表(包括它们的公钥),当客户端需要公钥时,可根据颁发机构信息本地查找到公钥。客户端通过颁发机构的公钥验证签名的有效性和证书的完整性,保证公钥未被篡改。

HTTPS通过私钥、证书、和CA(签发机构)确保了链路的安全性。在P2P场景下,BT Client之间是对等的,他们相互传输数据,更应该是服务端校验客户端,而不是HTTPS的客户端校验服务端。并且由于BT Client是部署在用户的节点,还需要考虑证书和私钥都被劫持的风险。

我们是怎么做的

Client之间

BT Client间传输数据肯定是需要加密的,防止链路的数据被劫持。但是只增加HTTPS,虽然链路被加密,但是客户端可能会被假冒,只要假冒者不校验服务端的证书,直接和服务端握手,就能从其他BT Client获取到他想要的数据。

我们借鉴和HTTPS的实现,采用了双向验证的模式。

需要有证书,首先需要一个统一的CA(签发机构),因此我们在Tracker中保存证书和私钥做为签发机构,Proxy获取种子的同时返回CA,用户校验客户端的证书。

然后,只使用一个证书对并且放在Bt Client是危险的,很有可能性被入侵截获到证书,因此我们获取证书的方式改为从Tracker获取,获取种子的同时获取Tracker生成的临时证书私钥对,把它加入BT Client的下载队列。在BT Client开始相互连接时,首先相互确认对方的证书的有效性(签名、签发机构等信息),校验通过后才能请求并相互下载数据。

这种方式下,Client之间的链路是安全的。

(1)链路经过证书加密,直接截获链路是不可行的

(2)即使仿照BT Client的方式,由于Client每个连接都需要进行双向的证书校验,想通过这个方式截获数据就必须请求Tracker去获取,而访问Tracker首先是HTTPS的,然后我们还做了业务层的安全校验(下文业务层安全会提及),也是不可行的。

Docker Daemon到 Proxy

我们在Proxy中需要劫持Docker的请求,因为Docker在不配置时访问Registry采用的是HTTPS,因此Proxy劫持Docker请求就必须和Docker保持HTTPS连接。

我们让客户端代理只监听localhost端口,杜绝外部使用该代理的可能性。同时,客户端代理绑定一套临时生成的签发给registry域名的自签名证书和CA证书,用于劫持Docker Daemon的请求,并将CA证书添加到机器的信任证书当中。

代理绑定的证书只保存在内存中,即使通过特定方式获取到当前节点的CA证书和服务端证书,也无法截取其他节点数据。

从用户节点到Registry、Tracker

首先,为了确保链路的安全,Regstry、Tracker都绑定从权威第三方机构购买的HTTPS证书私钥对。Proxy和BT Client在访问它们的时候都会去校验证书的有效性,只要在证书有效的情况下才发送请求,这从根源上杜绝了Regstry、Tracker被假冒的可能。

2、业务加密

在确保链路安全后,我们还做了一层业务安全加固。首先我们先了解下JWT Token。

Json web token(JWT)是为了网络应用环境间传递声明而执行的一种基于JSON的开发标准(RFC 7519),该token被设计为紧凑且安全的,特别适用于分布式站点的单点登陆(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

在我们使用Docker命令下载镜像时,Docker首先会到Registy获取Token,在之后的获取镜像层的过程中,多会带上该Token用于鉴权。其中Token时组要包含以下信息:

(1)用户信息

(2)资源信息,为操作的镜像和namespace的名称

(3)权限信息:是否有PULL/PUSH权限

(4)用于解析Token签名的证书

利用JWT Token中自带解析Token证书这个特性,我们在BT Client间通信又增加了Token的校验。在前文中的证书校验通过后,客户端需要发送Token给服务端用于校验。为了防止Token被假冒,入侵者采用第三方生成,我们使用服务端截从Docker截取的Token中的证书解析校验客户端的Token,杜绝这种情况。

同时,Proxy访问Tracker的接口也会带上这个Token,Tracker会校验Token的权限,完成业务层的安全验证,防止证书和种子被盗取。

通过以上链路层和业务层的安全加固,用户数据被盗取的可能性已几乎为零。如果大家有更好的建议,欢迎点评。

华为云容器镜像服务SWR:http://t.cn/RDyMaKH

公有云Docker镜像P2P加速之路:安全篇相关推荐

  1. Docker下载加速:Docker镜像下载加速、pip 下载加速、apt 下载加速

    一.参考资料 docker国内镜像源 二.重要说明 Docker 默认的下载源均在国外,没有VPN的情况下,下载速度都很慢,为此需要设置国内的下载镜像源: Docker 下载加速可从三个方面加速:Do ...

  2. docker 镜像下载加速(安装 kubernetes 必备)

    大佬的文章 https://blog.k8s.li/kubespray-tips.html https://fuckcloudnative.io/posts/docker-registry-proxy ...

  3. 利用阿里云镜像加速器对docker镜像源加速

    1.访问 https://www.aliyun.com,注册自己的帐号 然后点击控制台-->产品与服务-->容器镜像服务. 会得到一个加速器地址.选择镜像加速器,选择自己的系统,有相应的配 ...

  4. 详解修改docker镜像源加速下载(解决下载apollo修改docker源后下载速度仍然十分慢问题)

    先附上修改成功后加速Apollo(百度自动驾驶)下载的效果图,实测下载速度高达15Mbps!⬆ 不想看解释的请无脑跳到解决方案部分 当我们想通过国内镜像源加速apollo镜像下载时(即加速docker ...

  5. 国外docker镜像库加速方法

    国外docker镜像库往往速度慢,使用国内自己的镜像库进行建立镜像,pull的时候速度快,易于使用与更新. 1.首先在主机上安装docker-client,方法参照https://docs.docke ...

  6. Docker镜像下载加速及设置代理

    使用阿里云加速 在使用docker pull拉镜像默认从docker hub里拉取,从国内访问这个网站速度可能会很慢.可以通过配置加速器解决. 登录阿里云控制台->搜索容器镜像服务->镜像 ...

  7. 清华镜像源_Hyperledger Fabric2.x Docker镜像编译加速

    一.问题描述 最近工作需要对fabric2的源码进行改造,每次改完想要部署测试的时候,make docker这个命令执行起来超级慢.找到这篇文章的读者应该都遇到与我相同的问题,本文将分析问题产生的原因 ...

  8. docker镜像下载加速

    默认情况下,docker下载镜像是从官网下载,下载速度特别特别的慢.使用阿里云加速器可以提升获取Docker官方镜像的速度. 在指定目录创建文件(如已存在请忽略此步): vi /etc/docker/ ...

  9. 沙利文:2019Q4中国公有云市场份额:阿里云、腾讯云、华为云位列前三

    今日,Frost & Sullivan(以下简称"沙利文")发布了对于中国公有云市场的调查研究结果.数据显示,2019年Q4中国公有云市场规模达到224.3亿元人民币,同比 ...

  10. 当企业衡量和评估私有云和公有云时,需要考虑哪些核心因素?

    在几年前,云计算刚开始流行,并且引人注目的仅是公有云,但是到了如今,私有云和混合云也正在获得越来越多企业的关注.事实上,私有云部署能解决企业面临的普遍挑战和问题,但是这其中有一些不能通过公有云来解决, ...

最新文章

  1. git for windows_干货分享 | 嵌入式必备技能之Git的使用
  2. JAVA第六章第6题,java第六章例题源代码
  3. LeetCode 2178. 拆分成最多数目的偶整数之和(等差数列求和)
  4. 成立烘焙公司、买茶饮 瑞幸咖啡谋变破局
  5. python项目“内存泄漏”的调试过程
  6. 密码库LibTomCrypt学习记录——目录
  7. 干货 | 100亿+数据量,每天50W+查询,携程酒店数据智能平台实践
  8. C语言中%d,%o,%f,%e,%x的意义
  9. Flutter shared_preferences简单使用
  10. 王飞跃教授点评:无人车最“靠谱”的应用领域——不是出行
  11. 动词ing形式的5种用法_加ing的形式有哪几种?怎样用
  12. 百鸡百钱问题和( 30人消费50元,可能包括男人女人小孩,男人3元,女人2元,小孩1元,问各有多少人)问题
  13. 15_微信小程序之svg地图自定义组件编写
  14. 大数据学习之一——Hadoop单机部署
  15. 高效线性氮化镓射频功放芯片模组研究
  16. 【C语言】scanf函数报错
  17. HTML table表格边框为单线的方法
  18. 硬件行业知识体系概要【转】
  19. 编译时多态、运行时多态
  20. c语言鼠标打地鼠程序,如何使用C语言实现打地鼠的游戏

热门文章

  1. FileChannel阅读笔记
  2. 2022计算机二级全套资料:视频+练习软件+真题资料
  3. 我用Python爬取了李沧最近一年多的二手房成交数据得出以下结论
  4. java project 显示感叹号_项目工程上有感叹号或者差号
  5. MySQL中的BETWEEN...AND的用法
  6. 内网通道构建——socks
  7. 【那些年,我们一起追的女孩】第十四章
  8. mcafee 8.5i杀毒软件规则配置
  9. 100份开工礼送粉丝,体验嵌入式高级感!
  10. Pycharm 更换皮肤和壁纸