使用通配符为托管 docker 注册表命名空间配置 Sonatype Nexus 3 权限

Configure Sonatype Nexus 3 privileges for hosted docker registry namespace using wildcard

我已经为 Docker 安装了带有托管存储库的 Sonatype Nexus 3 OSS(Docker 的私有注册表)。我想要几个用户,他们将能够根据他们的权限 pull/push docker 图像。

第一种方法,我该怎么做 - 为 docker 创建几个托管存储库,然后通过 Securiy -> Privileges 使用 repository-view 这种方法根据确切的存储库配置权限:

username:   repository name:    permission:

user1       docker-internal-1   nexus:repository-view-:docker:docker-internal-1:read
user2       docker-internal-1   nexus:repository-view-:docker:docker-internal-1:add

user3       docker-internal-2   nexus:repository-view-:docker:docker-internal-2:read
user4       docker-internal-2   nexus:repository-view-:docker:docker-internal-2:add

这种方法可行,但需要为 docker.

提供多个托管存储库

我的问题是 - 是否有可能为 docker 拥有一个单一托管存储库,然后基于 docker 存储库命名空间配置权限?

假设我有一个名为 docker-internal 的存储库,然后我有这样的权限:

username:   repository name:    permission:

user1       docker-internal     nexus:repository-view-:docker:docker-internal/namespace1:read
user2       docker-internal     nexus:repository-view-:docker:docker-internal/namespace1:add

user3       docker-internal     nexus:repository-view-:docker:docker-internal/namespace2:read
user4       docker-internal     nexus:repository-view-:docker:docker-internal/namespace2:add

不幸的是,在 Nexus 3 documentation 中,我还没有找到使用 repository-view 权限的方法,因为它们只允许您指定存储库名称,但没有命名空间。然后就是 wildcard 之类的东西,它在 Sonatype 文档中有描述,比如 "Wildcard -> These are privileges that use patterns to group other privileges." 所以我尝试创建一些像这样的正则表达式模式:

nexus:repository-view:docker:docker-internal/namespace1:read

不幸的是它不起作用。

根据 Sonatype Nexus 支持的回答,目前无法通过 docker 注册表中的通配符和命名空间来实现。所以唯一可行的方法是使用单独的 docker 存储库和存储库视图权限。

我们找到了一种结合内容-selectOR 和权限以支持图像级别权限的方法。

首先您必须创建两个内容select或:

  1. "docker-login-all" 与表达式 format=="docker" and path=~"/v2/"。如果您也支持 v1 协议,请确保为它创建另一个 selector。
  2. "docker-foo-selector" 的表达式与您要授予访问权限的图像相匹配。例如select所有foo/bar-linux的发布,表达式为format=="docker" and path=~".*/foo/bar-linux/.*"

第一个 selector 非常重要,因为没有它您将无法创建允许用户登录的规则。

然后根据内容创建两个权限-select或:

  1. "docker-login-all-privilege" 基于 "Docker-login-all" 应用于所有 docker 注册表,具有读取授权。这将授予通过 docker cli 登录的能力。
  2. "docker-foo-privilege" 基于 "docker-foo-selector" 应用于所有 docker 注册表,具有读取授权。这将允许您的用户仅提取 foo/bar-linux 个图像。

然后创建一个只有这两个权限的角色,并将其关联到用户。它应该有效。

请注意使用某些命令时的意外行为:https://issues.sonatype.org/browse/NEXUS-12220