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

sto*_*lho 5 permissions wildcard nexus sonatype docker-registry

我已经安装了Sonatype Nexus 3 OSS和Docker的托管存储库(Docker的私有注册表).我希望有几个用户,可以根据他们的权限提取/推送泊坞窗图像.

第一种方式,我怎么做 - 是为docker创建几个托管存储库,然后通过Securiy - > Privileges使用存储库视图,这种方法基于确切的存储库配置权限:

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
Run Code Online (Sandbox Code Playgroud)

这种方法有效,但它需要为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
Run Code Online (Sandbox Code Playgroud)

不幸的是,在Nexus 3文档中,我还没有找到一种如何使用存储库视图权限来执行此操作的原因,因为它们只允许您指定存储库名称,但不允许指定存储库名称.然后就是通配符,它在Sonatype docs中描述,如"通配符 - >这些是使用模式对其他权限进行分组的权限".所以我试图像这样创建一些正则表达式模式:

nexus:repository-view:docker:docker-internal/namespace1:read
Run Code Online (Sandbox Code Playgroud)

不幸的是它不起作用.

Ame*_*osa 6

我们找到了一种将内容选择器和权限结合起来以支持图像级别权限的方法。

首先,您必须创建两个内容选择器:

  1. “docker-login-all”,带有表达式format=="docker" and path=~"/v2/"。如果您也支持 v1 协议,请确保为其创建另一个选择器。
  2. “docker-foo-selector”,其表达式与您要授予访问权限的映像相匹配。例如要选择 foo/bar-linux 的所有版本,表达式为format=="docker" and path=~".*/foo/bar-linux/.*"

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

然后根据内容选择器创建两个权限:

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

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

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


sto*_*lho 4

基于Sonatype Nexus支持的答案,目前无法通过docker注册表中的通配符和命名空间来实现.因此,唯一可行的方法是使用单独的docker存储库和存储库视图权限.

  • @Jonas目前没有.以下是Sonatype支持的答案:>>我相信一旦我们为Docker实现内容选择器,这将是可能的(参考:http://books.sonatype.com/nexus-book/reference3/admin.html#content-selectors)但是目前只适用于maven2和raw.在实施之前我不确定. (2认同)