go token验证_registry v2 解析以及如何实现token验证

提到registry v2,主要改进是支持并行pull镜像,镜像层id变成唯一的,解决同一个tag可能对应多个镜像的问题等等。如果还不太了解,可以且听我细细道来。

首先不得不说的是v2 新加了一个概念Digest

他是基于内容进行寻址(Content-addressable)算法算出来的一串hash值。简单的说就是内容不同,得出了的digest值是不同的,但是内容相同的话,得出的digest值是一定相同的。我们的每个镜像层id就是根据每个镜像层的内容得出来的digest的。

所以你在改动镜像层以后生成的digest就不同了,而不动的话,这个digest还是不变的,那么这个digest id是什么时候生成的呢?我们在本地构建镜像时生成的镜像层id每次都是不一样的,这个digest是我们在push镜像时生成的。

为了验证内容相同,push到registry得到的digest相同,我做了个小实验,用如下Dockerfile 注释掉第三行和不注释构建了两次镜像,再push到registry

如果是v1的话,push上去得到的层id肯定是不一样的,但是v2里面,注释第三行得到了5个镜像层,不注释掉第三行得到了6个镜像层,并且第一次的5个层都包含在第二次6个里面。所以得出结论这个digest确实是根据内容生成的。

接下来说一下镜像的id

镜像id也是生成了一个digest值,镜像id是根据_manifest这个文件,也就是镜像层id和镜像名字等一些其他信息生成的digest。我们在每次向v2 push镜像时候,最后都会返回给docker client一个digest值,这个值就代表了镜像的digest id。这个id的作用就是可以指定唯一的镜像了。类似tag使用。

因为我们知道v1时候用tag有个弊病就是多次构建的镜像可以使用同一个tag,导致我们用tag标识镜像的时候可能并不是我们想要的,而用了digest就不会出现这种问题。

我们在写Dockerfile的时候引用镜像就可以这么用:

FROM localhost:5000/test@sha256:ac81211548c0d228e10daaf76f6e0024e5f91879c8a7e105e777d6f964270449

像使用tag一样,用本地docker查看镜像digests时候可以使用:docker images --digests,

当然,目前来说你看到的都是,我们需要从registry上pull下来,使用

docker pull localhost:5000/test@sha256:ac81211548c0d228e10daaf76f6e0024e5f91879c8a7e105e777d6f964270449

了解了digest,我们来看一看registry的存储结构

这部分最好可以对着registry的文件夹结构来看。简单的画了个草图。

是v2的文件夹层级关系

这个是目录下具体的样子,可以先看一会儿,可以看到registry 下面有两个文件夹blobs和repositories,

blobs下面存储了registry的所有基本信息元素,包括镜像层digest和镜像digest,之后在通过某种方式将调用这里的信息。

blobs文件夹下面先分了一个等级,是digest的前两位字符组成的文件夹为了筛选digest,避免了这个文件夹太大,查看时都难。这样方便定位。每个blob里都有一个data文件,存储相关信息。

repositories下面存储的是各个镜像名字命名的文件夹,进入一个镜像文件夹后,可以看到三个子文件夹,_layers, _manifests, _uploads,_layers这个文件夹是跟这个镜像有关的所有镜像层,进入其中一个镜像层文件夹,下面只有一个文件--link命名的文件,里面的内容就是一个digest。

这就跟blobs下面的镜像层建立起了联系,在repositories这个文件夹下,都是通过link文件与blobs文件夹下的文件建立的联系。

_upload这个文件夹,平时点进去是空的,这个文件夹主要作用是上传用的。我们上传镜像层的时候,先上传到这个文件夹下,等完成传输以后,在将这个文件夹下的内容移动到blobs下面,然后将原来的文件删除。

_manifest这个文件夹非常重要,是镜像的相关信息。他下面有两个子文件夹,revisions和tags,revisions这个文件夹下是这个镜像的所有可用的镜像digest,里面的link文件指向了镜像的digest。我们去blobs里面找相应的id对应的文件,查看文件下面的data,我们发现这个data文件里面存储的信息,和我们通过registry v2 rest api请求manifest信息相同~在看_manifest/tags/。下面就是这个镜像的不同tag了。又分了current和index分别表示当前tag对应的digest和此tag下的所有镜像digest。

下面来介绍一下如何搭建token验证的registry

先看一下官方给的图

可以看到,v2和v1相比,访问形式完全变了,去掉了index server,加上了一个auth server。

访问顺序是这样的

我们通过docker client让docker deamon先访问registry,registry如果不需要身份验证,则直接返回结果,若需要验证,返回401并在header附带一些信息,

daemon根据信息访问auth server。auth server判断通过了验证,并返回给daemon一串token。

daemon带着这串token再去访问registry则可以获得到信息,pull ,push,api都走的这套流程。

接下来贴下我的配置文件config.yml,配置了选项auth/token表示要token验证。这个流程确实需要好好读一下,跟她的加密方式有很大关系

version: 0.1

log:

fields:

service: registry

storage:

cache:

blobdescriptor: redis

filesystem:

rootdirectory: /var/lib/registry

http:

addr: :5000

secret: randomstringsecret

tls:

certificate: /root/sslkeys/domain.crt

key: /root/sslkeys/domain.key

auth:

token:

realm: https://registry.tenxcloud.com:5001/auth

service: test123.tenxcloud.com:5000

issuer: qwertyui

rootcertbundle: /root/sslkeys/domain.crt

当然,我是通过容器启动的v2,把这个config volume进去的

我的启动命令:docker run -d -p 5000:5000 --restart=always --name registry -v pwd/sslkeys:/root/sslkeys -v pwd/config.yml:/etc/docker/registry/config.yml -v pwd/data:/var/lib/registry registry:2.1.1

auth/token下的4个子选项都是必须配置的,realm表示我的auth server地址,service表示的registry的地址,issuer是一串标示符,随便写一下,auth server加密的时候也需要配置同样的字符串。rootcertbundle配置一个秘钥,对token进行加密。(我这里复用了我的tls token)

当我们第一次未带token访问registry时会返回401并附带如下信息:Www-Authenticate: Bearer realm="test123.tenxcloud.com:5000 ",service="test123.tenxcloud.com:5000 "scope="repository:husseingalal/hello:push",realm和service就是前面说的,scope表示的是我要做的操作,repository代表镜像,接着是镜像名字,然后是pull或者是push或者二者都有

知道了各个参数的功能,就可以搭建我们的auth server了,我从github下找到了一个项目:https://github.com/cesanta/docker_auth

用go语言写的,其中的账号密码存储方式有:写入文件,ldap和google账号的。这个server实现了动态加载配置文件,配置文件有变化这个server会进行安全的重启,所以可以对文件动态添加账号密码。当然也可以自己写身份验证,添加数据库等方式的,只需要继承Authenticator这个interface就可以。添加起来很容易。身份验证后有权限控制acl,并且我们也可以自定义权限控制,继承Authorizer这个interface即可。

前两项通过后就是生成token(这一部分这个项目已经封装好了,不用改动),

v2的token采用的JWT加密方式,JWT分了三个部分,header,payload,signature,header里面带的信息是token加密方式,一般都是base64, payload里带的都是需要的基本信息,user,权限,过期时间,还有前面说的issure 等等,

signature是header+payload后用秘钥进行加密,这个秘钥就是配置在registry里的rootcertbundle对应的秘钥。

三部分通过 . 连接, 因为有秘钥加密,保证了token信息不会被窜改,这种加密方式保证了将权限验证和registry分离也 是安全的, 将token发送回daemon后daemon就可以带着token去正常访问registry了,如果是rest api,直接将其写成Bearer token就可以请求了。

有疑问加站长微信联系(非本文作者)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

创建一个简单的 MDM server(1)

前提:已获得 APNS 证书 ,已完毕 MDM 配置描写叙述文件的制作。请參考《 MDM 证书申请流程 》一文和《配置MDM Provisioning Profile》。环境:OSX 10.9.2,JDK 1.6。Eclipse JavaEE Helois,Tomcat 7.0一、前言《THE IOS …

epic转移游戏_Epic游戏商城更改退款政策 和steam一模一样

游侠网关注我们,获得最快的游戏资讯Epic正在打造自己的数字游戏商城,一方面对开发者提供更慷慨的销售分成,另一方面对玩家提供每两个月更新一次的免费游戏。虽然Epic游戏商城中的作品数量还在起步阶段,也缺少一些关键的常用功能&a…

计算机组成原理实验三报告,计算机组成原理实验三报告

计算机组成原理实验三报告 实 验 报 告 三课 程 计算机组成原理 姓 名 学 号实验项目 存储器实验 同组姓名 学 号指导教师 专业班级 计算机科学与技术 09 实验时间 2011-6-6实验三 存储器实验一、实验目的1.掌握存储器的功能和构成。2.了解静态随机存储器…

防盗Java EE –保护您的Java EE企业应用程序

redev离我们仅有几天的路程,我受邀作了两次演讲。 其中之一是关于我最喜欢的主题:安全性和Java EE。 它旨在实现两个目标。 一方面向典型的Java EE开发人员介绍整个应用程序安全过程和主要目标。 而且还要查看有关Java EE在满足典型需求时必须提供的内容…

Digui

public class Digui{ public static void main(String args[]){ System.out.println("计算结果:" sum(100)) ; //调用操作 } public static int sum(int num){ //定义方法用于求和操作 if(num 2){ //判断是否是加到了最后一个数 return 2 ; }else{ retur…

wsl nvidia驱动_WIN10安装NVIDIA面板两种方式

无应用商店安装NVIDIA面板进入NVIDIA官网下载标准版驱动https://www.nvidia.cn/Download/Find.aspx?langcn​www.nvidia.cn驱动类型选择标准下载的名称选择NVIDIA Studoio Driver SD这样下载出来的驱动就带有NVIDIA面板控制面有应用商店但是下载不动的可以使用下面的方式打开网…

计算机组成原理mbps,2016年湖北师范学院计算机组成原理(同等学力加试)复试笔试仿真模拟题...

一、选择题1. 若x103,y-25, 则下列表达式采用8位定点补码运算实现时,会发生溢出的是( )A.xyB.-xyC.x-yD.-x-y【答案】c2. 假定一台计算机的显示存储器用DRAM 芯片实现,若要求显示分辨率为1600x1200,颜色深度…

Python之内置函数

Python内置函数 #1、语法 # eval(str,[,globasl[,locals]]) # exec(str,[,globasl[,locals]])#2、区别 #示例一: s123 print(eval(s)) #eval用来执行表达式,并返回表达式执行的结果 print(exec(s)) #exec用来执行语句,不会返回任何值6 None …

android 头像球_Android一行代码实现圆形头像

效果图在开发APP中,经常要实现圆形头像,那么该如何实现呢?要裁剪吗,要重写draw函数吗?不用,只用一行代码就可以实现Glide实现圆形图像Glide.with(mContext).load(R.drawable.iv_image_header).error(R.draw…

latex 无穷_《天龙3D》新资料片“骑乐无穷”即将上线

驭风逐战,骑乐无穷。11月12日金庸正版授权、全民第一武侠RPG手游《天龙3D》新资料片“骑乐无穷”即将上线!全新坐骑装备系统开启,升星养成坐骑装备;全新坐骑相关副本四绝夺魁,多人闯关PVP、PVE组队竞技;元旦主题月即将开启,趣味游…

广州大学计算机学院毕业设计,【广州大学】毕业设计(计算机科学与技术)专业要求...

广州大学成人高等教育毕业设计专业要求【专业名称】计算机科学与技术【适用范围】非学位论文【执笔者】谷岩【完成形式】个人独立【写作形式】毕业设计【写作要求】1.目标毕业设计是计算机科学与技术专业人才培养的重要环节。其主要目标是培养学生综合应用计算机科学…

实验二+140+阮晨曦

---恢复内容开始--- 一、实验目的 掌握覆盖测试的基本方法和实践 二、实验要求 运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例,并运行测试用例检查程序的正确与否,给出程序缺陷小结。 三、实验内容 (1)设计某程序的路径覆盖测…

hadoop重命名文件_Hadoop -- 3. 从Flume到HDFS

提起Flume, 就先讲一下它的基本作用, 它可以从不同的数据源导入到一个集中的地方存放起来,基本架构如下图所示*上图为Flume Data Flow Model, Ref: Flume 1.9.0 User Guide本篇文章会做一个小demo, 数据从spooling directory来(而不是官网图中画的Web Server), 先经过channel, …

osgi 模块化_OSGI –模块化您的应用程序

osgi 模块化由于我是模块化,低耦合,高凝聚力等的大力拥护者,所以…… 我相信这项技术是我们使用Java平台创建应用程序的突破。 使用OSGi,创建高度可扩展的应用程序非常简单,例如参见Eclipse IDE。 我的目的不是要深入展…

电脑计算器_CPA考生注意!2020考场只允许带这种计算器

注册会计师每年采用闭卷、计算机化考试方式。根据往年考生的反应,计算器的使用在考场上发挥了非常大的作用。值得大家注意的是,并不是所有的计算器都能带进考场,考试对计算器有什么要求?如何挑选到正确的计算器?我们一起来看看&a…

最早的齿轮计算机,世界最古老“计算机”出土后110年,科学家终于解开它的秘密...

伦敦大学学院(UCL)的研究团队,提出了“一个激进的新模型,与所有数据相匹配,并最终优雅地展示出了古希腊人眼中的宇宙”。1901年,在希腊岛屿安提基特拉的海岸,潜水员偶然发现了一艘古代沉船。沉船中的一件文物&#xff…

通过Java 8中的Applicative Builder组合多个异步结果

几个月前,我发布了一个出版物 ,在其中详细解释了我提出的名为Outcome的抽象,它通过强制使用语义帮助了我很多 没有副作用的代码。 通过遵循这种简单(但功能强大)的约定,我最终将任何类型的故障(…

在python中是否可以使用if作为变量名_在Python中可以使用if 作为变量名_python使用符号 标示注释...

在Python中可以使用if 作为变量名答:" src"" style"max-width: 100%; display: inline;">往来款项清查结果的账务处理与货币资金、存货和固定资产不同,它不通过“待处理财产损溢”账户。答:√明嘉靖皇帝是昏君答…

diskgenius 接触“只读“失败_相亲总是失败,这三个步骤你都做了吗?

原标题:相亲总是失败,这三个步骤你都做了吗?虽然现在爱情很稀缺,但想必大家都想找个男女朋友,想谈一场甜甜的恋爱。 而相亲,无疑是脱单最直接、最有效的方式,没有之一。但不管是经人介绍&#x…

shell中的常用通配符,字符类

因为 shell 频繁 地使用文件名,shell 提供了特殊字符来帮助你快速指定一组文件名。这些特殊字符叫做通配符。 通配符     意义 *         匹配任意多个字符(包括零个或一个)  ?         匹配任意一个字符&…