授权访问 Container Registry 资源教程
使用本教程可了解如何通过为 IBM Cloud® Identity and Access Management 配置 IBM Cloud® Container Registry (IAM) 来授予对资源的访问权。
所有帐户都需要 IAM 访问策略。 要设置和管理 IAM 访问策略,请参阅 定义 IAM 访问策略。
有关如何使用 IAM 来管理对资源的访问权的更多信息,请参阅 管理对资源的访问权。
准备工作
在开始之前,必须完成以下任务:
- 完成 IBM Cloud Container Registry 入门中的指示信息。
- 确保您拥有 IBM Cloud CLI 的最新版本
container-registry
CLI 插件,请参阅 更新container-registry
CLI 插件。 - 确保您可以访问可用于本教程的两个 IBM Cloud 帐户,一个用于用户 A,一个用于用户 B,每个帐户必须使用唯一的电子邮件地址。 您在自己的帐户(用户 A)中工作,并邀请另一个用户(用户 B)使用您的帐户。 您可以选择创建第二个 IBM Cloud 帐户,也可以与有 IBM Cloud 帐户的同事一起合作。
- 确保您具有正确的访问许可权以添加和除去 名称空间在注册表中存储映像的存储库的集合。 名称空间与 IBM Cloud 帐户相关联,该帐户可以包含多个名称空间。,请参阅 用于配置 IBM Cloud Container Registry 的访问角色。
授权用户配置注册表
将第二个用户添加到您的帐户,并授予他们配置 IBM Cloud Container Registry的能力。
-
将用户 B 添加到用户 A 的账户中。
-
运行以下命令登录用户 A 的账户。
ibmcloud login
-
运行以下命令,邀请用户 B 访问用户 A 的账户,其中
<user.b@example.com>
是用户 B 的电子邮件地址。ibmcloud account user-invite <user.b@example.com>
-
运行以下命令获取用户 A 的账户 ID。
ibmcloud target
记下“帐户”行中括号 ( ) 内的“帐户标识”。
-
-
证明用户 B 可以瞄准用户 A 的账户,但还不能使用 IBM Cloud Container Registry 做任何事情。
-
以用户 B 的身份登录,运行以下命令锁定用户 A 的账户,其中
YOUR_ACCOUNT_ID
是用户 A 的账户 ID。ibmcloud login -c YOUR_ACCOUNT_ID
-
尝试运行以下命令,将注册表配额编辑为 4 GB 流量。
ibmcloud cr quota-set --traffic=4000
此命令失败,因为用户 B 没有正确的访问权。
-
-
授予用户 B 管理员角色,以便用户 B 可以配置 IBM Cloud Container Registry。
-
运行以下命令,以用户 A 的身份重新登录账户。
ibmcloud login
-
运行以下命令,创建一条向用户 B 授予“管理器”角色的策略。
ibmcloud iam user-policy-create <user.b@example.com> --service-name container-registry --roles Manager
-
-
证明用户 B 现在可以更改用户 A 账户中的配额。
-
运行以下命令,以用户 B 的身份登录,目标是用户 A 的账户。
ibmcloud login -c YOUR_ACCOUNT_ID
-
尝试运行以下命令,将注册表配额编辑为 4 GB 流量。
ibmcloud cr quota-set --traffic=4000
此命令有效,因为用户 B 有正确类型的访问权。
-
现在运行以下命令将配额改回来。
ibmcloud cr quota-set --traffic=5120
-
-
清理。
-
运行以下命令,以用户 A 的身份重新登录账户。
ibmcloud login
-
列出用户 B 的策略,找到通过运行以下命令创建的策略,并记下 ID。
ibmcloud iam user-policies <user.b@example.com>
-
运行以下命令删除策略,其中
POLICY_ID
为策略 ID。ibmcloud iam user-policy-delete <user.b@example.com> POLICY_ID
-
授权用户访问特定命名空间
使用样本映像创建一些名称空间,并授予对这些名称空间的访问权。 您可以创建策略来为每个名称空间授予不同的角色,并显示相应的影响。
-
在用户 A 的帐户中创建三个新的名称空间。 这些命名空间在整个区域内必须是唯一的,因此请自行选择命名空间名称,本教程以
namespace_a
、namespace_b
和namespace_c
为例。-
运行以下命令,以用户 A 的身份登录。
ibmcloud login
-
运行以下命令创建
namespace_a
。ibmcloud cr namespace-add namespace_a
名称空间在同一区域的所有 IBM Cloud 帐户中必须唯一。 名称空间必须具有 4 到 30 个字符,并且只能包含小写字母、数字、连字符 (-) 和下划线 (_)。 名称空间必须以字母或数字开头和结尾。
如果在尝试添加名称空间时迂到问题,请参阅 为什么无法添加名称空间? 以获取帮助。
-
运行以下命令创建
namespace_b
。ibmcloud cr namespace-add namespace_b
-
运行以下命令创建
namespace_c
。ibmcloud cr namespace-add namespace_c
-
-
证明用户 B 什么也看不到。
-
运行以下命令,以用户 B 的身份登录,目标是用户 A 的账户。
ibmcloud login -c YOUR_ACCOUNT_ID
-
尝试以用户 B 的身份运行以下命令来列出命名空间。
ibmcloud cr namespaces
这会返回空列表,因为用户 B 无权访问任何名称空间。
-
-
运行以下命令创建策略,授予用户 B 与命名空间交互的权限。
-
运行以下命令,以用户 A 的账户登录。
ibmcloud login
-
运行以下命令,检查是否至少列出了三个命名空间。
ibmcloud cr namespaces
这将显示在本教程中创建的三个名称空间(
namespace_a
、namespace_b
和namespace_c
)。 如果没有看到这些命名空间,请重复上述说明再次创建它们。 -
运行以下命令创建一个策略,将
namespace_b
上的阅读器角色授予用户 B,其中CLOUD_REGION
是 IBM Cloud 区域的名称,例如us-south
。ibmcloud iam user-policy-create <user.b@example.com> --service-name container-registry --region CLOUD_REGION --resource-type namespace --resource namespace_b --roles Reader
要查看 IBM Cloud 区域的名称,请运行
ibmcloud regions
命令。 -
运行以下命令,创建第二个策略,将
namespace_c
上的阅读器和写入器角色授予用户 B。ibmcloud iam user-policy-create <user.b@example.com> --service-name container-registry --region CLOUD_REGION --resource-type namespace --resource namespace_c --roles Reader,Writer
此命令会在同一策略中向同一资源添加两个角色。
-
-
将图像推送到
namespace_a
和namespace_b
。-
运行以下命令提取
hello-world
映像。docker pull hello-world
-
运行以下命令将图像标记为
namespace_a
,其中REGISTRY_REGION
是 IBM Cloud Container Registry 区域 的名称,例如us-south
。docker tag hello-world REGISTRY_REGION.icr.io/namespace_a/hello-world
-
运行以下命令将图像标记为
namespace_b
。docker tag hello-world REGISTRY_REGION.icr.io/namespace_b/hello-world
-
通过运行
ibmcloud cr login
命令登录到 IBM Cloud Container Registry。ibmcloud cr login
IBM Cloud Container Registry 支持 Docker 和其他客户端。 要使用其他客户机登录,请参阅 以交互方式访问名称空间。
如果尝试登录时迂到问题,请参阅 为什么我无法登录 Container Registry? 以获取帮助。
-
运行以下命令将镜像推送到
namespace_a
。docker push REGISTRY_REGION.icr.io/namespace_a/hello-world
-
运行以下命令将镜像推送到
namespace_b
。docker push REGISTRY_REGION.icr.io/namespace_b/hello-world
-
-
证明用户 B 可以与
namespace_b
和namespace_c
交互,但不能与namespace_a
交互。-
运行以下命令,以用户 B 的身份登录。
ibmcloud login -c YOUR_ACCOUNT_ID
-
运行以下命令,显示用户 B 可以看到
namespace_b
和namespace_c
,但不能看到namespace_a
,因为用户 B 没有访问namespace_a
的权限。ibmcloud cr namespaces
-
运行以下命令,列出您的图像。
ibmcloud cr images
namespace_b
中的映像会显示在列表中,但namespace_a
中的映像不会显示在列表中,因为用户 B 无权访问namespace_a
。 -
运行以下命令登录 IBM Cloud Container Registry。
ibmcloud cr login
IBM Cloud Container Registry 支持 Docker 和其他客户端。 要使用其他客户机登录,请参阅 以交互方式访问名称空间。
-
运行以下命令提取图像
docker pull REGISTRY_REGION.icr.io/namespace_b/hello-world
-
运行以下命令将镜像推送到
namespace_b
。docker push REGISTRY_REGION.icr.io/namespace_b/hello-world
由于用户 B 在
namespace_b
中没有“写入者”角色,所以此命令失败。 -
运行以下命令,用
namespace_c
标记图片。docker tag hello-world REGISTRY_REGION.icr.io/namespace_c/hello-world
-
运行以下命令将镜像推送到
namespace_c
。docker push REGISTRY_REGION.icr.io/namespace_c/hello-world
此命令有效,因为用户 B 在
namespace_c
中具有“写入者”角色。 -
运行以下命令,从
namespace_c
提取。docker pull REGISTRY_REGION.icr.io/namespace_c/hello-world
此命令用效,因为用户 B 在
namespace_c
中具有“读取者”角色。
-
-
清除:
-
运行以下命令重新登录用户 A 的账户。
ibmcloud login
-
运行以下命令,列出用户 B 的策略。
ibmcloud iam user-policies <user.b@example.com>
查找您创建的策略并记下策略 ID。
-
运行以下命令删除创建的策略,其中
POLICY_ID
是策略 ID。ibmcloud iam user-policy-delete <user.b@example.com> POLICY_ID
-
创建服务 ID 并授予资源访问权限
配置服务标识并授予其对 IBM Cloud Container Registry 名称空间的访问权。
-
设置一个可访问 IBM Cloud Container Registry 的服务 ID,并为其创建一个 API 密钥用于验证和授权API请求的唯一代码。 代码被传递给应用程序接口(API),用于识别调用应用程序或用户,并跟踪和控制API的使用情况。。
-
运行以下命令登录用户 A 的账户。
ibmcloud login
-
运行以下命令,创建名为
cr-roles-tutorial
的服务 ID,并说明"Created during the access control tutorial for Container Registry"
。ibmcloud iam service-id-create cr-roles-tutorial --description "Created during the access control tutorial for Container Registry"
-
运行以下命令,为
namespace_a
上授予阅读器角色的服务 ID 创建服务策略。ibmcloud iam service-policy-create cr-roles-tutorial --service-name container-registry --region CLOUD_REGION --resource-type namespace --resource namespace_a --roles Reader
-
运行以下命令,创建第二个服务策略,在
namespace_b
上授予 Writer 角色。ibmcloud iam service-policy-create cr-roles-tutorial --service-name container-registry --region CLOUD_REGION --resource-type namespace --resource namespace_b --roles Writer
-
运行以下命令为服务 ID 创建一个 API 密钥。
ibmcloud iam service-api-key-create cr-roles-tutorial-apikey cr-roles-tutorial
-
-
使用 Docker 以服务 ID API 密钥(其中
API_KEY
是您的 API 密钥)登录,并与注册表交互。-
运行以下命令登录 IBM Cloud Container Registry。
docker login -u iamapikey -p API_KEY REGISTRY_REGION.icr.io
IBM Cloud Container Registry 支持 Docker 和其他客户端。 要使用其他客户机登录,请参阅 在自动化中访问名称空间。
-
运行以下命令提取图像
docker pull REGISTRY_REGION.icr.io/namespace_a/hello-world
-
运行以下命令,将图像推送到
namespace_a
。docker push REGISTRY_REGION.icr.io/namespace_a/hello-world
由于用户在
namespace_a
中没有“写入者”角色,所以此命令无效。 -
运行以下命令,将图像推送到
namespace_b
。docker push REGISTRY_REGION.icr.io/namespace_b/hello-world
此命令有效,因为用户在
namespace_b
中具有“写入者”角色。
-
-
清除:
-
以用户 A 的身份重新登录 IBM Cloud Container Registry。
ibmcloud cr login
IBM Cloud Container Registry 支持 Docker 和其他客户端。 要使用其他客户机登录,请参阅 以交互方式访问名称空间。
-
运行以下命令,列出服务策略。
ibmcloud iam service-policies cr-roles-tutorial
记下您的策略标识。
-
为每个策略运行以下命令,删除服务策略。
ibmcloud iam service-policy-delete cr-roles-tutorial POLICY_ID
-
运行以下命令删除您的服务 ID。
ibmcloud iam service-id-delete cr-roles-tutorial
-
清除帐户
删除在前面章节中创建的资源,使账户保持本教程开始时的状态。
-
运行以下命令登录用户 A 的账户。
ibmcloud login
-
运行以下命令删除
namespace_a
、namespace_b
和namespace_c
。ibmcloud cr namespace-rm namespace_a
ibmcloud cr namespace-rm namespace_b
ibmcloud cr namespace-rm namespace_c
-
运行以下命令,将用户 B 从账户中删除。
ibmcloud account user-remove <user.b@example.com>