如何在Sonatype Nexus3中只授予对特定标签和指定命名空间的访问权限?
q1qsirdb1#
例如,我们将使用名称为的图像:docker.domain.com/namespace/image:1.1.1我们只想允许用户拉取标签与我们的Semver正则表达式匹配的图像。(您可以根据自己的需要简单地调整正则表达式)
docker.domain.com/namespace/image:1.1.1
format == 'docker' && ( path == '/v2/' || ( path =~ '.*/namespace/.*' && ( path =~ '.*[0-9]+\.[0-9]+\.[0-9]+' || path =~ '.*/blobs/.*' ) ) )
&&
||
==
=~
format == 'docker'
path == '/v2/'
path=~'.*/blobs/.*'
path=~'.*[0-9]+\.[0-9]+\.[0-9]+'
最重要的部分是名称空间和Semver-regex、名称空间和blob路径的组合。
**编辑:**请参见rseddon得答案here以获得更深入得解释.
oknwwptz2#
Docker映像在Nexus中的存储方式如下:
这些blob是docker层,它们可以(而且经常)在多个docker映像之间共享。这种层的共享就是为什么docker是存储VM的有效格式的原因。但这也意味着你不能限制对层的访问,你只能限制对清单和标签的访问。所以你需要创建一个允许访问所有层的内容选择器特权。此外,您需要允许访问/v2/以进行Docker登录,并允许访问/v1/search以进行搜索。因此,您需要一个内容选择器权限,允许访问每个人都需要的内容:
/v2/
/v1/search
path =~ "/v2/|/v2/blobs/.*|/v2/search/.*"
之后,您可以使用内容选择器,选择性地允许存取信息清单和标记,如下所示:
path =^ "/v2/some-docker-image/" path =^ "/v2/library/ubuntu/"
wkyowqbh3#
只有付出很大的努力才有可能。(Nexus 3. 41 Pro)最大的挑战:1.打开Nexus浏览器并找到带有标记和清单文件夹的任何映像目录。单击任何标记(即最新),查看路径属性(/v2/library/image/manifests/latest。打开它。
3条答案
按热度按时间q1qsirdb1#
例如,我们将使用名称为的图像:
docker.domain.com/namespace/image:1.1.1
我们只想允许用户拉取标签与我们的Semver正则表达式匹配的图像。(您可以根据自己的需要简单地调整正则表达式)
内容选择器
说明
&&
AND运算子||
OR运算子==
相等运算子=~
正则表达式运算符format == 'docker'
设置应选择的格式类型path == '/v2/'
按照docker v2 API specification的说明赠款登录和清单权限path=~'.*/blobs/.*'
赠款对图像层的拉访问权限path=~'.*[0-9]+\.[0-9]+\.[0-9]+'
半正则最重要的部分是名称空间和Semver-regex、名称空间和blob路径的组合。
**编辑:**请参见rseddon得答案here以获得更深入得解释.
oknwwptz2#
Docker映像在Nexus中的存储方式如下:
这些blob是docker层,它们可以(而且经常)在多个docker映像之间共享。这种层的共享就是为什么docker是存储VM的有效格式的原因。但这也意味着你不能限制对层的访问,你只能限制对清单和标签的访问。所以你需要创建一个允许访问所有层的内容选择器特权。
此外,您需要允许访问
/v2/
以进行Docker登录,并允许访问/v1/search
以进行搜索。因此,您需要一个内容选择器权限,允许访问每个人都需要的内容:
之后,您可以使用内容选择器,选择性地允许存取信息清单和标记,如下所示:
wkyowqbh3#
只有付出很大的努力才有可能。(Nexus 3. 41 Pro)
最大的挑战:
1.打开Nexus浏览器并找到带有标记和清单文件夹的任何映像目录。单击任何标记(即最新),查看路径属性(/v2/library/image/manifests/latest。打开它。
1.这意味着/v2/library/image/manifests/sha 256...必须是可访问的。不幸的是,如果它是可访问的,你可以直接通过(nexusurl:port/image@sha)拉取任何版本的图像,并绕过任何由内容选择器设置的特定于标记的限制。
这意味着只有当你维护一个标签列表和允许的图像的清单哈希值时,这才是可能的(没有直接的旁路)。这只有在自动化的IaC插件中才是可行的(如果需要大量的图像,并且不断的版本变化)。
一个更好的解决方案可能是将repo设置为镜像,而不是代理,并从dockerhub中提取所有允许的映像,然后将它们推入镜像repo。