使用通配符为托管 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或:
- "docker-login-all" 与表达式
format=="docker" and path=~"/v2/"
。如果您也支持 v1 协议,请确保为它创建另一个 selector。
- "docker-foo-selector" 的表达式与您要授予访问权限的图像相匹配。例如select所有foo/bar-linux的发布,表达式为
format=="docker" and path=~".*/foo/bar-linux/.*"
第一个 selector 非常重要,因为没有它您将无法创建允许用户登录的规则。
然后根据内容创建两个权限-select或:
- "docker-login-all-privilege" 基于 "Docker-login-all" 应用于所有 docker 注册表,具有读取授权。这将授予通过 docker cli 登录的能力。
- "docker-foo-privilege" 基于 "docker-foo-selector" 应用于所有 docker 注册表,具有读取授权。这将允许您的用户仅提取 foo/bar-linux 个图像。
然后创建一个只有这两个权限的角色,并将其关联到用户。它应该有效。
请注意使用某些命令时的意外行为:https://issues.sonatype.org/browse/NEXUS-12220
我已经为 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或:
- "docker-login-all" 与表达式
format=="docker" and path=~"/v2/"
。如果您也支持 v1 协议,请确保为它创建另一个 selector。 - "docker-foo-selector" 的表达式与您要授予访问权限的图像相匹配。例如select所有foo/bar-linux的发布,表达式为
format=="docker" and path=~".*/foo/bar-linux/.*"
第一个 selector 非常重要,因为没有它您将无法创建允许用户登录的规则。
然后根据内容创建两个权限-select或:
- "docker-login-all-privilege" 基于 "Docker-login-all" 应用于所有 docker 注册表,具有读取授权。这将授予通过 docker cli 登录的能力。
- "docker-foo-privilege" 基于 "docker-foo-selector" 应用于所有 docker 注册表,具有读取授权。这将允许您的用户仅提取 foo/bar-linux 个图像。
然后创建一个只有这两个权限的角色,并将其关联到用户。它应该有效。
请注意使用某些命令时的意外行为:https://issues.sonatype.org/browse/NEXUS-12220