如何在Sonatype Nexus3中通过Docker标签限制内容选择器?

k4aesqcs  于 2022-12-11  发布在  Docker
关注(0)|答案(3)|浏览(182)

如何在Sonatype Nexus3中只授予对特定标签和指定命名空间的访问权限?

q1qsirdb

q1qsirdb1#

例如,我们将使用名称为的图像:docker.domain.com/namespace/image:1.1.1
我们只想允许用户拉取标签与我们的Semver正则表达式匹配的图像。(您可以根据自己的需要简单地调整正则表达式)

内容选择器

format == 'docker'  
&& (
    path == '/v2/' 
    || (
        path =~ '.*/namespace/.*' 
        && (
            path =~ '.*[0-9]+\.[0-9]+\.[0-9]+'
            || path =~ '.*/blobs/.*'
            )
        )
    )

说明

  • && AND运算子
  • || OR运算子
  • ==相等运算子
  • =~正则表达式运算符
  • format == 'docker'设置应选择的格式类型
  • path == '/v2/'按照docker v2 API specification的说明赠款登录和清单权限
  • path=~'.*/blobs/.*'赠款对图像层的拉访问权限
  • path=~'.*[0-9]+\.[0-9]+\.[0-9]+'半正则

最重要的部分是名称空间和Semver-regex、名称空间和blob路径的组合。

**编辑:**请参见rseddon得答案here以获得更深入得解释.

oknwwptz

oknwwptz2#

Docker映像在Nexus中的存储方式如下:

这些blob是docker层,它们可以(而且经常)在多个docker映像之间共享。这种层的共享就是为什么docker是存储VM的有效格式的原因。但这也意味着你不能限制对层的访问,你只能限制对清单和标签的访问。所以你需要创建一个允许访问所有层的内容选择器特权。
此外,您需要允许访问/v2/以进行Docker登录,并允许访问/v1/search以进行搜索。
因此,您需要一个内容选择器权限,允许访问每个人都需要的内容:

path =~ "/v2/|/v2/blobs/.*|/v2/search/.*"

之后,您可以使用内容选择器,选择性地允许存取信息清单和标记,如下所示:

path =^ "/v2/some-docker-image/"

path =^ "/v2/library/ubuntu/"
wkyowqbh

wkyowqbh3#

只有付出很大的努力才有可能。(Nexus 3. 41 Pro)
最大的挑战:
1.打开Nexus浏览器并找到带有标记和清单文件夹的任何映像目录。单击任何标记(即最新),查看路径属性(/v2/library/image/manifests/latest。打开它。

  1. Docker将尝试获取最新的清单,查看内部,找到[?].digest(sha 256:...),根据它的系统架构,打开此清单--〉/v2/library/image/manifests/sha 256...检查要下载的层blob
    1.这意味着/v2/library/image/manifests/sha 256...必须是可访问的。不幸的是,如果它是可访问的,你可以直接通过(nexusurl:port/image@sha)拉取任何版本的图像,并绕过任何由内容选择器设置的特定于标记的限制。
    这意味着只有当你维护一个标签列表和允许的图像的清单哈希值时,这才是可能的(没有直接的旁路)。这只有在自动化的IaC插件中才是可行的(如果需要大量的图像,并且不断的版本变化)。
    一个更好的解决方案可能是将repo设置为镜像,而不是代理,并从dockerhub中提取所有允许的映像,然后将它们推入镜像repo。

相关问题