管理 Container Registry 的 IAM 访问权
您帐户中的用户对 IBM Cloud® Container Registry 的访问权通过 IBM Cloud® Identity and Access Management (IAM) 进行控制。
访问 IBM Cloud Container Registry 服务的每个用户都必须分配一个具有 IAM 角色的 IAM 访问策略用于向用户、服务标识和访问组授予帐户资源访问权的方法。 访问策略包含主体、目标和角色。。 用户还可以是具有分配的 IAM 访问策略的 访问组 的成员,这些策略授予 IAM 角色。 查看以下角色,操作和更多信息,以帮助确定分配对 Container Registry的访问权的最佳方法。
有关 IAM 的更多信息,请参阅 IBM Cloud Identity and Access Management 工作方式。
试用教程 授予对 Container Registry 资源教程 的访问权。
访问策略
分配给帐户中用户的 IAM 访问策略确定用户可以在所选服务或特定实例的上下文中执行的操作。 允许的操作由 Container Registry 进行定制,并定义为允许对服务执行的操作。 每个操作都映射到可以分配给用户的 IAM 平台或服务角色。
策略支持在不同级别授予访问权。 某些选项包括以下访问级别:
- 对帐户中服务的访问权
- 对服务中特定资源的访问权
- 对帐户中所有启用 IAM 的服务的访问权
- 对资源组中资源的访问权
如果要限制用户访问用于自动化的 ID 的一个或多个 命名空间在注册表中存储映像的存储库的集合。 名称空间与 IBM Cloud 帐户相关联,该帐户可以包含多个名称空间。,请使用 IAM 服务 ID。 有关服务标识的更多信息,请参阅创建和使用服务标识。
您可以设置许可权,以便可以在 资源组环境以及所包含资源实例遵循的约束。 用户可以与资源组相关联以启用协作。 级别配置对名称空间中资源的访问权。 有关更多信息,请参阅 使用名称空间的用户许可权。
有关为 Container Registry启用策略的更多信息,请参阅 定义 IAM 访问策略。
分配角色
定义 IAM 访问策略的范围后,分配角色。
如果特定角色及其操作不适合您要解决的用例,您可以 创建一个自定义角色 并选择要包含的操作。
查看下表,其中概述了每个角色允许在 Container Registry 服务中执行的操作。
-
平台管理角色 使用户能够在平台级别对服务资源执行任务,例如分配用户对服务的访问权限、创建或删除实例,以及将实例与应用程序绑定。
-
服务访问角色 使用户能够访问 Container Registry 以及能够调用 Container Registry API。
有关映射到每个角色的确切操作的更多信息,请参阅 Container Registry的 IAM 角色和操作。
有关在控制台中分配用户角色的更多信息,请参阅 管理对资源的访问。
基于上下文的限制
Container Registry 还支持基于上下文的限制。 您可以根据访问请求的网络位置,使用基于上下文的限制来定义和实施 IBM Cloud 资源的访问限制。 这些限制适用于基于身份的传统 IAM 策略,以提供另一层保护。
有关更多信息,请参阅 使用基于上下文的限制保护 Container Registry 资源。
平台管理角色
下表详细描述了映射到平台管理角色的操作。 平台管理角色支持用户在平台级别对服务资源执行任务,例如为用户分配对服务的访问权以及创建或删除服务标识。
平台管理角色 | 操作描述 | 操作示例 |
---|---|---|
查看者 | 不支持 | 不适用 |
编辑者 | 不支持 | 不适用 |
运算符 | 不支持 | 不适用 |
管理员 | 为其他用户配置访问权。
将拉取私钥应用于集群。 |
有关在控制台中分配用户角色的更多信息,请参阅管理对资源的访问。
要在 IBM Cloud Kubernetes Service 中创建具有拉取私钥以访问 Container Registry中的映像的集群,您必须具有管理员角色。 要使用 |
服务访问角色
下表详细描述了映射到服务访问角色的操作。 服务访问角色允许用户访问 Container Registry 以及调用 Container Registry API 的能力。
服务访问角色 | 操作描述 | 操作示例 |
---|---|---|
读者 | “读取者”角色可以查看信息。 | 查看,检查和拉取映像。
查看和分析名称空间。 查看配额。 查看漏洞报告。 查看图像特征符。 查看保留时间策略。 查看垃圾内容。 查看映像的清单内容。 列出 Vulnerability Advisor 安全免除策略和安全免除类型。 |
写入者 | “写入者”角色可以编辑信息。 | 推送,删除和复原映像。
查看配额。 对图像进行签名。 设置并运行保留时间策略。 删除 Container Registry 帐户中所有未标记的映像。 |
管理者 | “管理者”角色可以执行所有操作。 | 查看,检查,拉取,推送,删除和复原映像。
查看,添加,分析和除去名称空间。 将名称空间分配给资源组。 查看和设置配额。 查看漏洞报告。 查看和创建图像特征符。 查看和更改定价计划。 启用 IAM 访问策略实施。 列出,添加和除去 Vulnerability Advisor 安全问题免除策略。 列出安全性免除的类型。 设置并运行保留时间策略。 查看垃圾内容。 复原映像。 查看映像的清单内容。 防止或允许映像拉取或推送帐户的公用网络连接。 检查是否阻止对帐户中的映像推送或拉取使用公共连接。 删除 Container Registry 帐户中所有未标记的映像。 |
对于以下 Container Registry 命令,您必须至少具有其中一个指定的角色,如下列各表中所示。 要创建允许访问 Container Registry的策略,必须创建以下条件适用的策略。
- 服务名称为
container-registry
。 - 服务实例为空。
- 该区域是您要授予其访问权的区域,或者为空以授予对所有区域的访问权。
用于配置 Container Registry 的访问角色
要授予用户在账户中配置 Container Registry 的权限,必须创建一个策略,授予下表中的一个或多个角色。 创建策略时,不得指定 resource type
或 resource
。 不得在资源组级别设置用于配置 Container Registry 的策略。
例如,运行以下 ibmcloud iam user-policy-create
命令。 其中 USER_EMAIL
是用户的电子邮件地址,REGION
是区域,ROLES
是您希望用户具有的角色。
ibmcloud iam user-policy-create USER_EMAIL --service-name container-registry --region REGION --roles ROLES
下表详细描述了映射到服务上的操作以及映射到用于配置 Container Registry 的服务访问角色的操作。
操作 | 服务上的操作 | 角色 |
---|---|---|
container-registry.auth.get |
ibmcloud cr private-only 检查是否阻止在您的帐户中进行映像推送或拉取时使用公共连接。 |
管理者 |
container-registry.auth.set |
ibmcloud cr iam-policies-enable 启用 IAM 访问策略实施。
|
管理者 |
container-registry.exemption.list |
ibmcloud cr exemption-list 列出针对安全问题的 Vulnerability Advisor 免除策略。
|
读取者、管理者 |
container-registry.exemption.manager |
ibmcloud cr exemption-add 针对安全问题创建 Vulnerability Advisor 免除策略。
|
管理者 |
container-registry.namespace.create |
ibmcloud cr namespace-add 创建名称空间。
|
管理者 |
container-registry.namespace.delete |
ibmcloud cr namespace-rm :除去名称空间。 |
管理者 |
container-registry.plan.get |
ibmcloud cr plan :显示价格套餐。 |
管理者 |
container-registry.plan.set |
ibmcloud cr plan-upgrade :升级为标准套餐。 |
管理者 |
container-registry.quota.get |
ibmcloud cr quota :显示流量和存储的当前配额以及这些配额的使用情况信息。 |
读取者、写入者和管理者 |
container-registry.quota.set |
ibmcloud cr quota-set :修改指定的配额。 |
管理者 |
container-registry.settings.get |
ibmcloud cr platform-metrics 获取目标帐户的注册表服务设置,例如是否启用平台度量。 |
读取者、写入者和管理者 |
container-registry.settings.set |
ibmcloud cr platform-metrics 更新目标帐户的注册表服务设置,例如启用平台度量。 |
管理者 |
使用 Container Registry 的访问角色
要授予用户访问 Container Registry 账户内容的权限,必须创建一个策略,授予下表中的一个或多个角色。 创建策略时,可通过指定资源类型 namespace
和命名空间名称来限制对特定命名空间的访问。 如果不指定 resource-type
和 resource
,则策略会授予对账户中所有资源的访问权。 或者,如果名称空间位于资源组中,那么可以通过对该资源组使用 IAM 访问策略来授予许可权。
例如,使用以下命令来创建用户策略。 其中,USER_EMAIL
是用户的电子邮件地址,REGION
是区域,ROLES
是您希望用户具有的角色,NAMESPACE_NAME
是名称空间的名称。
ibmcloud iam user-policy-create USER_EMAIL --service-name container-registry --region REGION --roles ROLES [--resource-type namespace --resource NAMESPACE_NAME]
下表详细描述了映射到服务上的操作以及映射到用于使用 Container Registry 的服务访问角色的操作。
操作 | 服务上的操作 | 角色 |
---|---|---|
container-registry.image.delete |
docker trust revoke 删除容器映像的签名。
|
Writer, Manager
要运行 |
container-registry.image.inspect |
ibmcloud cr image-inspect 显示有关特定容器映像的详细信息。
|
读取者、管理者 |
container-registry.image.list |
ibmcloud cr image-digests 列出所有容器映像,包括未标记的映像。
|
读取者、管理者 |
container-registry.image.pull |
docker pull 拉取容器映像。
|
读取者、写入者和管理者 |
container-registry.image.push |
docker push 推送容器映像。
|
写入者、管理者 |
container-registry.namespace.list |
ibmcloud cr namespace-list :列出名称空间。 |
读取者、管理者 |
container-registry.retention.analyze |
ibmcloud cr retention-policy-set 设置策略以通过仅保留满足条件的容器映像来清除名称空间。
|
阅读器、管理器
要运行 |
container-registry.retention.get |
使用 API 查看名称空间的映像保留时间策略,请参阅IBM Cloud Container Registry API。 | 读取者、管理者 |
container-registry.retention.set |
ibmcloud cr retention-policy-set :设置策略,用于清除名称空间,仅保留符合条件的容器映像。 |
写入者、管理者 |
container-registry.retention.list |
ibmcloud cr retention-policy-list 列出帐户的映像保留时间策略。 |
读取者、管理者 |
在控制台中分配对 Container Registry 的访问权
您可以使用下列其中一个选项在控制台中分配访问权:
- 每个用户的访问策略。 您可以从控制台中的“管理> 访问权 (IAM)> 用户”页面管理每个用户的访问策略。 有关分配 IAM 访问权的步骤的更多信息,请参阅 管理对资源的访问权。
- 访问组。 访问组用于简化访问管理,方法是一次性分配对组的访问权,然后您可以根据需要在组中添加或除去用户以控制其访问权。 您可以从控制台中的“管理> 访问权 (IAM)> 访问组”页面管理访问组及其访问权。 有关更多信息,请参阅 在控制台中分配对组的访问权。
在 CLI 中分配对 Container Registry 的访问权
有关分配,除去和复审访问权的逐步指示信息,请参阅 使用 CLI 分配对资源的访问权。 下面的示例显示了为 Container Registry 的用户分配 Manager
角色的命令,其中 USER_EMAIL
是用户的电子邮件地址。
使用 container-registry
作为服务名称。
ibmcloud iam user-policy-create USER_EMAIL --service-name container-registry --roles Manager
使用应用程序接口分配访问 Container Registry
有关分配,除去和复审访问权的逐步指示信息,请参阅 使用 API 分配对资源的访问权 或 API 文档中的 创建策略。 下表中的角色云资源名称 (CRN) 用于分配对 API 的访问权。
角色名称 | 角色 CRN |
---|---|
管理员 | crn:v1:bluemix:public:container-registry::::serviceRole:Administrator |
读者 | crn:v1:bluemix:public:container-registry::::serviceRole:Reader |
写入者 | crn:v1:bluemix:public:container-registry::::serviceRole:Writer |
管理者 | crn:v1:bluemix:public:container-registry::::serviceRole:Manager |
以下示例用于为 Container Registry分配 Manager
角色:
使用 container-registry
作为服务名称,并参阅角色 ID 值表,确保使用的 CRN 值正确无误。
curl -X POST 'https://iam.cloud.ibm.com/v1/policies' -H 'Authorization: Bearer $TOKEN' -H 'Content-Type: application/json' -d '{
"type": "access",
"description": "Manager role for Container Registry",
"subjects": [
{
"attributes": [
{
"name": "iam_id",
"value": "IBMid-123453user"
}
]
}'
],
"roles":[
{
"role_id": "crn:v1:bluemix:public:container-registry::::serviceRole:Manager"
}
],
"resources":[
{
"attributes": [
{
"name": "accountId",
"value": "$ACCOUNT_ID"
},
{
"name": "serviceName",
"value": "container-registry"
}
]
}
]
}
SubjectAttribute subjectAttribute = new SubjectAttribute.Builder()
.name("iam_id")
.value("IBMid-123453user")
.build();
PolicySubject policySubjects = new PolicySubject.Builder()
.addAttributes(subjectAttribute)
.build();
PolicyRole policyRoles = new PolicyRole.Builder()
.roleId("crn:v1:bluemix:public:container-registry::::serviceRole:Manager")
.build();
ResourceAttribute accountIdResourceAttribute = new ResourceAttribute.Builder()
.name("accountId")
.value("ACCOUNT_ID")
.operator("stringEquals")
.build();
ResourceAttribute serviceNameResourceAttribute = new ResourceAttribute.Builder()
.name("serviceName")
.value("container-registry")
.operator("stringEquals")
.build();
PolicyResource policyResources = new PolicyResource.Builder()
.addAttributes(accountIdResourceAttribute)
.addAttributes(serviceNameResourceAttribute)
.build();
CreatePolicyOptions options = new CreatePolicyOptions.Builder()
.type("access")
.subjects(Arrays.asList(policySubjects))
.roles(Arrays.asList(policyRoles))
.resources(Arrays.asList(policyResources))
.build();
Response<Policy> response = service.createPolicy(options).execute();
Policy policy = response.getResult();
System.out.println(policy);
const policySubjects = [
{
attributes: [
{
name: 'iam_id',
value: 'IBMid-123453user',
},
],
},
];
const policyRoles = [
{
role_id: 'crn:v1:bluemix:public:container-registry::::serviceRole:Manager',
},
];
const accountIdResourceAttribute = {
name: 'accountId',
value: 'ACCOUNT_ID',
operator: 'stringEquals',
};
const serviceNameResourceAttribute = {
name: 'serviceName',
value: 'container-registry',
operator: 'stringEquals',
};
const policyResources = [
{
attributes: [accountIdResourceAttribute, serviceNameResourceAttribute]
},
];
const params = {
type: 'access',
subjects: policySubjects,
roles: policyRoles,
resources: policyResources,
};
iamPolicyManagementService.createPolicy(params)
.then(res => {
examplePolicyId = res.result.id;
console.log(JSON.stringify(res.result, null, 2));
})
.catch(err => {
console.warn(err)
});
policy_subjects = PolicySubject(
attributes=[SubjectAttribute(name='iam_id', value='IBMid-123453user')])
policy_roles = PolicyRole(
role_id='crn:v1:bluemix:public:container-registry::::serviceRole:Manager')
account_id_resource_attribute = ResourceAttribute(
name='accountId', value='ACCOUNT_ID')
service_name_resource_attribute = ResourceAttribute(
name='serviceName', value='container-registry')
policy_resources = PolicyResource(
attributes=[account_id_resource_attribute,
service_name_resource_attribute])
policy = iam_policy_management_service.create_policy(
type='access',
subjects=[policy_subjects],
roles=[policy_roles],
resources=[policy_resources]
).get_result()
print(json.dumps(policy, indent=2))
subjectAttribute := &iampolicymanagementv1.SubjectAttribute{
Name: core.StringPtr("iam_id"),
Value: core.StringPtr("IBMid-123453user"),
}
policySubjects := &iampolicymanagementv1.PolicySubject{
Attributes: []iampolicymanagementv1.SubjectAttribute{*subjectAttribute},
}
policyRoles := &iampolicymanagementv1.PolicyRole{
RoleID: core.StringPtr("crn:v1:bluemix:public:container-registry::::serviceRole:Manager"),
}
accountIDResourceAttribute := &iampolicymanagementv1.ResourceAttribute{
Name: core.StringPtr("accountId"),
Value: core.StringPtr("ACCOUNT_ID"),
Operator: core.StringPtr("stringEquals"),
}
serviceNameResourceAttribute := &iampolicymanagementv1.ResourceAttribute{
Name: core.StringPtr("serviceName"),
Value: core.StringPtr("container-registry"),
Operator: core.StringPtr("stringEquals"),
}
policyResources := &iampolicymanagementv1.PolicyResource{
Attributes: []iampolicymanagementv1.ResourceAttribute{
*accountIDResourceAttribute, *serviceNameResourceAttribute}
}
options := iamPolicyManagementService.NewCreatePolicyOptions(
"access",
[]iampolicymanagementv1.PolicySubject{*policySubjects},
[]iampolicymanagementv1.PolicyRole{*policyRoles},
[]iampolicymanagementv1.PolicyResource{*policyResources},
)
policy, response, err := iamPolicyManagementService.CreatePolicy(options)
if err != nil {
panic(err)
}
b, _ := json.MarshalIndent(policy, "", " ")
fmt.Println(string(b))
使用 Terraform 分配对 Container Registry 的访问权
以下示例用于为 Container Registry分配 Manager
角色:
使用 container-registry
作为服务名称。
resource "ibm_iam_user_policy" "policy" {
ibm_id = "test@example.com"
roles = ["Manager"]
resources {
service = "container-registry"
}
}
更多信息,请参阅 ibm_iam_user_policy
Terraform文档。