IBM Cloud Docs
授权访问 Container Registry 资源教程

授权访问 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的能力。

  1. 将用户 B 添加到用户 A 的账户中。

    1. 运行以下命令登录用户 A 的账户。

      ibmcloud login
      
    2. 运行以下命令,邀请用户 B 访问用户 A 的账户,其中 <user.b@example.com> 是用户 B 的电子邮件地址。

      ibmcloud account user-invite <user.b@example.com>
      
    3. 运行以下命令获取用户 A 的账户 ID。

      ibmcloud target
      

      记下“帐户”行中括号 ( ) 内的“帐户标识”。

  2. 证明用户 B 可以瞄准用户 A 的账户,但还不能使用 IBM Cloud Container Registry 做任何事情。

    1. 以用户 B 的身份登录,运行以下命令锁定用户 A 的账户,其中 YOUR_ACCOUNT_ID 是用户 A 的账户 ID。

      ibmcloud login -c YOUR_ACCOUNT_ID
      
    2. 尝试运行以下命令,将注册表配额编辑为 4 GB 流量。

      ibmcloud cr quota-set --traffic=4000
      

      此命令失败,因为用户 B 没有正确的访问权。

  3. 授予用户 B 管理员角色,以便用户 B 可以配置 IBM Cloud Container Registry。

    1. 运行以下命令,以用户 A 的身份重新登录账户。

      ibmcloud login
      
    2. 运行以下命令,创建一条向用户 B 授予“管理器”角色的策略。

      ibmcloud iam user-policy-create <user.b@example.com> --service-name container-registry --roles Manager
      
  4. 证明用户 B 现在可以更改用户 A 账户中的配额。

    1. 运行以下命令,以用户 B 的身份登录,目标是用户 A 的账户。

      ibmcloud login -c YOUR_ACCOUNT_ID
      
    2. 尝试运行以下命令,将注册表配额编辑为 4 GB 流量。

      ibmcloud cr quota-set --traffic=4000
      

      此命令有效,因为用户 B 有正确类型的访问权。

    3. 现在运行以下命令将配额改回来。

      ibmcloud cr quota-set --traffic=5120
      
  5. 清理。

    1. 运行以下命令,以用户 A 的身份重新登录账户。

      ibmcloud login
      
    2. 列出用户 B 的策略,找到通过运行以下命令创建的策略,并记下 ID。

      ibmcloud iam user-policies <user.b@example.com>
      
    3. 运行以下命令删除策略,其中 POLICY_ID 为策略 ID。

      ibmcloud iam user-policy-delete <user.b@example.com> POLICY_ID
      

授权用户访问特定命名空间

使用样本映像创建一些名称空间,并授予对这些名称空间的访问权。 您可以创建策略来为每个名称空间授予不同的角色,并显示相应的影响。

  1. 在用户 A 的帐户中创建三个新的名称空间。 这些命名空间在整个区域内必须是唯一的,因此请自行选择命名空间名称,本教程以 namespace_anamespace_bnamespace_c 为例。

    1. 运行以下命令,以用户 A 的身份登录。

      ibmcloud login
      
    2. 运行以下命令创建 namespace_a

      ibmcloud cr namespace-add namespace_a
      

      名称空间在同一区域的所有 IBM Cloud 帐户中必须唯一。 名称空间必须具有 4 到 30 个字符,并且只能包含小写字母、数字、连字符 (-) 和下划线 (_)。 名称空间必须以字母或数字开头和结尾。

      如果在尝试添加名称空间时迂到问题,请参阅 为什么无法添加名称空间? 以获取帮助。

    3. 运行以下命令创建 namespace_b

      ibmcloud cr namespace-add namespace_b
      
    4. 运行以下命令创建 namespace_c

      ibmcloud cr namespace-add namespace_c
      
  2. 证明用户 B 什么也看不到。

    1. 运行以下命令,以用户 B 的身份登录,目标是用户 A 的账户。

      ibmcloud login -c YOUR_ACCOUNT_ID
      
    2. 尝试以用户 B 的身份运行以下命令来列出命名空间。

      ibmcloud cr namespaces
      

      这会返回空列表,因为用户 B 无权访问任何名称空间。

  3. 运行以下命令创建策略,授予用户 B 与命名空间交互的权限。

    1. 运行以下命令,以用户 A 的账户登录。

      ibmcloud login
      
    2. 运行以下命令,检查是否至少列出了三个命名空间。

      ibmcloud cr namespaces
      

      这将显示在本教程中创建的三个名称空间(namespace_anamespace_bnamespace_c)。 如果没有看到这些命名空间,请重复上述说明再次创建它们。

    3. 运行以下命令创建一个策略,将 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 命令。

    4. 运行以下命令,创建第二个策略,将 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
      

      此命令会在同一策略中向同一资源添加两个角色。

  4. 将图像推送到 namespace_anamespace_b

    1. 运行以下命令提取 hello-world 映像。

      docker pull hello-world
      
    2. 运行以下命令将图像标记为 namespace_a,其中 REGISTRY_REGIONIBM Cloud Container Registry 区域 的名称,例如 us-south

      docker tag hello-world REGISTRY_REGION.icr.io/namespace_a/hello-world
      
    3. 运行以下命令将图像标记为 namespace_b

      docker tag hello-world REGISTRY_REGION.icr.io/namespace_b/hello-world
      
    4. 通过运行 ibmcloud cr login 命令登录到 IBM Cloud Container Registry。

      ibmcloud cr login
      

      IBM Cloud Container Registry 支持 Docker 和其他客户端。 要使用其他客户机登录,请参阅 以交互方式访问名称空间

      如果尝试登录时迂到问题,请参阅 为什么我无法登录 Container Registry? 以获取帮助。

    5. 运行以下命令将镜像推送到 namespace_a

      docker push REGISTRY_REGION.icr.io/namespace_a/hello-world
      
    6. 运行以下命令将镜像推送到 namespace_b

      docker push REGISTRY_REGION.icr.io/namespace_b/hello-world
      
  5. 证明用户 B 可以与 namespace_bnamespace_c 交互,但不能与 namespace_a 交互。

    1. 运行以下命令,以用户 B 的身份登录。

      ibmcloud login -c YOUR_ACCOUNT_ID
      
    2. 运行以下命令,显示用户 B 可以看到 namespace_bnamespace_c,但不能看到 namespace_a,因为用户 B 没有访问 namespace_a 的权限。

      ibmcloud cr namespaces
      
    3. 运行以下命令,列出您的图像。

      ibmcloud cr images
      

      namespace_b 中的映像会显示在列表中,但 namespace_a 中的映像不会显示在列表中,因为用户 B 无权访问 namespace_a

    4. 运行以下命令登录 IBM Cloud Container Registry。

      ibmcloud cr login
      

      IBM Cloud Container Registry 支持 Docker 和其他客户端。 要使用其他客户机登录,请参阅 以交互方式访问名称空间

    5. 运行以下命令提取图像

      docker pull REGISTRY_REGION.icr.io/namespace_b/hello-world
      
    6. 运行以下命令将镜像推送到 namespace_b

      docker push REGISTRY_REGION.icr.io/namespace_b/hello-world
      

      由于用户 B 在 namespace_b 中没有“写入者”角色,所以此命令失败。

    7. 运行以下命令,用 namespace_c 标记图片。

      docker tag hello-world REGISTRY_REGION.icr.io/namespace_c/hello-world
      
    8. 运行以下命令将镜像推送到 namespace_c

      docker push REGISTRY_REGION.icr.io/namespace_c/hello-world
      

      此命令有效,因为用户 B 在 namespace_c 中具有“写入者”角色。

    9. 运行以下命令,从 namespace_c 提取。

      docker pull REGISTRY_REGION.icr.io/namespace_c/hello-world
      

      此命令用效,因为用户 B 在 namespace_c 中具有“读取者”角色。

  6. 清除:

    1. 运行以下命令重新登录用户 A 的账户。

      ibmcloud login
      
    2. 运行以下命令,列出用户 B 的策略。

      ibmcloud iam user-policies <user.b@example.com>
      

      查找您创建的策略并记下策略 ID。

    3. 运行以下命令删除创建的策略,其中 POLICY_ID 是策略 ID。

      ibmcloud iam user-policy-delete <user.b@example.com> POLICY_ID
      

创建服务 ID 并授予资源访问权限

配置服务标识并授予其对 IBM Cloud Container Registry 名称空间的访问权。

  1. 设置一个可访问 IBM Cloud Container Registry 的服务 ID,并为其创建一个 API 密钥用于验证和授权API请求的唯一代码。 代码被传递给应用程序接口(API),用于识别调用应用程序或用户,并跟踪和控制API的使用情况。

    1. 运行以下命令登录用户 A 的账户。

      ibmcloud login
      
    2. 运行以下命令,创建名为 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"
      
    3. 运行以下命令,为 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
      
    4. 运行以下命令,创建第二个服务策略,在 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
      
    5. 运行以下命令为服务 ID 创建一个 API 密钥。

      ibmcloud iam service-api-key-create cr-roles-tutorial-apikey cr-roles-tutorial
      
  2. 使用 Docker 以服务 ID API 密钥(其中 API_KEY 是您的 API 密钥)登录,并与注册表交互。

    1. 运行以下命令登录 IBM Cloud Container Registry。

      docker login -u iamapikey -p API_KEY REGISTRY_REGION.icr.io
      

      IBM Cloud Container Registry 支持 Docker 和其他客户端。 要使用其他客户机登录,请参阅 在自动化中访问名称空间

    2. 运行以下命令提取图像

      docker pull REGISTRY_REGION.icr.io/namespace_a/hello-world
      
    3. 运行以下命令,将图像推送到 namespace_a

      docker push REGISTRY_REGION.icr.io/namespace_a/hello-world
      

      由于用户在 namespace_a 中没有“写入者”角色,所以此命令无效。

    4. 运行以下命令,将图像推送到 namespace_b

      docker push REGISTRY_REGION.icr.io/namespace_b/hello-world
      

      此命令有效,因为用户在 namespace_b 中具有“写入者”角色。

  3. 清除:

    1. 以用户 A 的身份重新登录 IBM Cloud Container Registry。

      ibmcloud cr login
      

      IBM Cloud Container Registry 支持 Docker 和其他客户端。 要使用其他客户机登录,请参阅 以交互方式访问名称空间

    2. 运行以下命令,列出服务策略。

      ibmcloud iam service-policies cr-roles-tutorial
      

      记下您的策略标识。

    3. 为每个策略运行以下命令,删除服务策略。

      ibmcloud iam service-policy-delete cr-roles-tutorial POLICY_ID
      
    4. 运行以下命令删除您的服务 ID。

      ibmcloud iam service-id-delete cr-roles-tutorial
      

清除帐户

删除在前面章节中创建的资源,使账户保持本教程开始时的状态。

  1. 运行以下命令登录用户 A 的账户。

    ibmcloud login
    
  2. 运行以下命令删除 namespace_anamespace_bnamespace_c

    ibmcloud cr namespace-rm namespace_a
    
    ibmcloud cr namespace-rm namespace_b
    
    ibmcloud cr namespace-rm namespace_c
    
  3. 运行以下命令,将用户 B 从账户中删除。

    ibmcloud account user-remove <user.b@example.com>