使用基于上下文的限制保护集群资源
基于上下文的限制使帐户所有者和管理员能够根据访问请求的上下文来定义和实施 IBM Cloud® 资源的访问限制。 可以使用基于上下文的限制以及身份和访问管理策略来控制对 Red Hat OpenShift on IBM Cloud 资源的访问。
这些限制适用于基于身份的传统 IAM 策略,以提供额外的保护层。 与 IAM 策略不同,基于上下文的限制不会分配访问权。 基于上下文的限制检查访问请求是否来自您配置的允许上下文。 由于 IAM 访问权和基于上下文的限制都强制实施访问权,因此基于上下文的限制即使在凭证已泄露或管理不当的情况下也会提供保护。 有关更多信息,请参阅 什么是基于上下文的限制。
用户必须对 Red Hat OpenShift on IBM Cloud 服务具有管理员角色才能创建,更新或删除规则。 用户必须对基于上下文的限制服务具有“编辑者”或“管理员”角色才能创建,更新或删除网络区域。
任何 Activity Tracker 或生成的审计日志事件都来自基于上下文的限制服务,而不是 Red Hat OpenShift on IBM Cloud。 有关更多信息,请参阅 监视基于上下文的限制。
尝试访问集群控制平面 (可以使用 Cluster
API 类型进行限制) 不会生成 Activity Tracker 或审计日志事件。
Red Hat OpenShift on IBM Cloud 如何与基于上下文的限制集成
您可以为 Red Hat OpenShift on IBM Cloud 资源或特定 API 创建基于上下文的限制 (CBR)。 通过基于上下文的限制,您可以保护以下资源。
- 保护 Red Hat OpenShift on IBM Cloud 资源
- 限制对集群,资源组或区域的访问权。
- 保护特定 API
- 限制对供应和管理集群和工作程序的访问。 或者,限制对 Kubernetes API 的访问,例如查看 pod 和节点。 有关更多信息,请参阅 保护特定 API。
在 Red Hat OpenShift on IBM Cloud 集群上运行的应用程序 (例如,由 Kubernetes LoadBalancer 公开的 Web 服务器) 不受 CBR 规则限制。
保护集群资源
您可以创建 CBR 规则以保护特定区域和集群。
- 集群
- 保护特定 Red Hat OpenShift on IBM Cloud 集群。 如果在 CBR 规则中选择集群,那么只有来自与该规则相关联的网络区域中资源的流量才能与该集群进行交互。
- 如果使用 CLI,那么可以指定
--service-instance CLUSTER-ID
选项以保护特定集群。 - 如果使用 API,那么可以在资源属性中指定
"name": "serviceInstance","value": "CLUSTER-ID"
。 - 区域
- 保护特定区域中的 Red Hat OpenShift on IBM Cloud 资源。 如果在 CBR 规则中选择区域,那么只有来自与该规则关联的网络区域中资源的流量才能与该区域中的资源进行交互。
- 如果使用 CLI,那么可以指定
--region REGION
选项以保护特定区域中的资源。 - 如果使用 API,那么可以在资源属性中指定
"name": "region","value": "REGION"
字段。 - 资源组
- 保护特定资源组中的 Red Hat OpenShift on IBM Cloud 资源。
- 如果使用 CLI,那么可以指定
--resource-group-id RESOURCE-GROUP-ID
选项以保护特定资源组中的资源。 - 如果使用 API,那么可以在资源属性中指定
"name": "resourceGroupId","value": "RESOURCE-GROUP-ID"
字段。
保护特定 API
您可以创建 CBR 规则以保护 Red Hat OpenShift on IBM Cloud的以下 API 类型。
- 集群控制平面 API
- 保护对集群中 API 的访问,例如用于创建名称空间和 pod 等的 API。 适用于集群 API 类型的 CBR 规则可控制对集群 API 服务器的访问,其中包括对该集群的所有
oc
命令。 如果在 CBR 规则中选择集群控制平面 API,那么只有来自网络区域中与该规则相关联的资源的流量才能与集群控制平面 API 进行交互。 将阻止所有其他请求。 - 如果使用 CLI,那么可以指定
--api-types
选项和crn:v1:bluemix:public:containers-kubernetes::::api-type:cluster
类型。 - 如果使用 API,那么可以在
"operations"
规范中指定"api_type_id": "crn:v1:bluemix:public:containers-kubernetes::::api-type:cluster"
。 - 管理 API
- 保护对用于供应和管理集群,工作程序池等的 API 的访问权。 适用于管理 API 类型控制的 CBR 规则可访问 Red Hat OpenShift on IBM Cloud API,其中包括所有
ibmcloud oc
命令调用,例如ibmcloud oc clusters
,ibmcloud oc cluster create
等。 如果在 CBR 规则中选择管理 API,那么与该规则关联的网络区域中的资源可以与管理 API 进行交互。 - 如果使用 CLI,那么可以指定
--api-types
选项和crn:v1:bluemix:public:containers-kubernetes::::api-type:management
类型。 - 如果使用 API,那么可以在
"operations"
规范中指定"api_type_id": "crn:v1:bluemix:public:containers-kubernetes::::api-type:management"
。
要遵循示例 CBR 方案,请参阅 设置基于上下文的限制。
要在 CLI 中获取服务引用目标列表,请运行 ibmcloud cbr service-ref-targets
命令。
允许 Red Hat OpenShift on IBM Cloud 使用 CBR 访问其他 IBM Cloud 资源
您必须将 containers-kubernetes
添加到针对以下服务创建的规则的网络区域。
- IAM 身份服务
- 允许 Red Hat OpenShift on IBM Cloud 创建令牌和 API 密钥,例如集群 API 密钥和 IBM Cloud Container Registry 令牌和 API 密钥。
- IAM 访问管理服务
- 允许 Red Hat OpenShift on IBM Cloud 为 IBM Cloud Container Registry的“读者”服务访问角色创建 IAM 访问策略。
- IAM 访问组服务
- 允许 Red Hat OpenShift on IBM Cloud 在将 IAM 访问策略与集群中的 RBAC 同步时查找访问组。
- 用户管理
- 当将 IAM 访问策略与集群中的 RBAC 同步时,允许 Red Hat OpenShift on IBM Cloud 访问用户信息。
- IBM Cloud Object Storage
- 允许 Red Hat OpenShift on IBM Cloud 备份 VPC 集群中的内部注册表映像。
- 密钥保护:
- 允许 Red Hat OpenShift on IBM Cloud 在集群上启用加密。
- Block Storage for VPC (服务器保护)
- 允许 Red Hat OpenShift on IBM Cloud 访问和加密 Block Storage for VPC 卷。
- VPC
- 允许 Red Hat OpenShift on IBM Cloud 访问 VPC 中的资源。
创建网络区域
网络区域充当您在创建 CBR 规则时定义的目标资源的允许列表。 创建网络区域或允许列表后,可以创建规则来定义网络区域可访问的资源。
确保将适用于其他 IBM Cloud 资源的规则 (例如保护 IBM Cloud Object Storage 的规则) 的 containers-kubernetes
服务添加到网络区域,否则某些集群操作可能会失败。 有关更多信息,请参阅 允许 Red Hat OpenShift on IBM Cloud 使用 CBR 访问其他 IBM Cloud 资源。
在创建网络区域之前,请查看 限制。
通过 API 创建网络区域
您可以使用 /v1/zones
API 来创建网络区域。 有关更多信息,请参阅 API 文档。 您可以将 containers-kubernetes
服务添加到网络区域,以允许 Red Hat OpenShift on IBM Cloud 访问帐户中的资源和服务。
您可以在网络区域有效内容中包含多种地址类型。 有关更多信息,请参阅 API 文档 中的示例有效内容。
用于将 Red Hat OpenShift on IBM Cloud 添加到网络区域的示例有效内容。 Red Hat OpenShift on IBM Cloud 的 serviceRef
属性为 containers-kubernetes
。
{
"name": "Example zone 1",
"description": "",
"addresses": [
{
"type": "serviceRef",
"ref": {
"service_name": "containers-kubernetes",
"account_id": "ACCOUNT-ID"
}
}
]
}
用于将多个服务,IP 地址和 VPC 添加到网络区域的示例有效内容。
{
"name": "zone",
"description": "",
"addresses": [
{
"type": "ipAddress",
"value": "192.168.0.0"
},
{
"type": "vpc",
"value": "crn:v1:bluemix:public:is:us-east:a/CRN"
},
{
"type": "vpc",
"value": "crn:v1:bluemix:public:is:us-south:a/CRN"
},
{
"type": "serviceRef",
"ref": {
"service_name": "cloud-object-storage",
"account_id": "ACCOUNT-ID"
}
},
{
"type": "serviceRef",
"ref": {
"service_name": "codeengine",
"account_id": "ACCOUNT-ID"
}
},
{
"type": "serviceRef",
"ref": {
"service_name": "containers-kubernetes",
"account_id": "ACCOUNT-ID"
}
},
{
"type": "serviceRef",
"ref": {
"service_type": "platform_service",
"account_id": "ACCOUNT-ID"
}
},
{
"type": "serviceRef",
"ref": {
"service_name": "iam-groups",
"account_id": "ACCOUNT-ID"
}
}
],
"excluded": []
}
从 CLI 创建网络区域
-
要从 CLI 创建网络区域,请 安装 CBR CLI 插件。
-
您可以使用
cbr-zone-create
命令将资源添加到网络区域。 有关更多信息,请参阅 CBR CLI 参考。 请注意,Red Hat OpenShift on IBM Cloud 的service_name
为containers-kubernetes
。要查找可用服务引用的列表,请运行
ibmcloud cbr service-ref-targets
命令。用于将
containers-kubernetes
服务添加到网络区域的示例命令。ibmcloud cbr zone-create --name example-zone-1 --description "Example zone 1" --service-ref service_name=containers-kubernetes
以下示例创建网络区域以允许访问单个公共 IP 地址。 您还可以将此示例与 一个 IP 示例规则 结合使用。 有关此场景的更多信息,请参阅 设置基于上下文的限制。
ibmcloud cbr zone-create --addresses 129.41.86.7 --description "Allow only client IP" --name allow-client-ip
从控制台创建网络区域
- 确定要添加到允许列表的资源。
- 执行以下步骤以 在控制台中创建基于上下文的限制。 将 Kubernetes 服务添加到网络区域,以允许 Red Hat OpenShift on IBM Cloud 访问帐户中的服务和资源。
创建规则
定义规则以保护对帐户中资源的访问权。 您在规则中定义的上下文确定网络区域 (允许列表) 中的资源如何与规则中定义的资源进行交互。
在创建规则之前,请查看 限制。
使用 API 创建规则
查看以下示例请求以创建规则。 有关 v1/rules
API 的更多信息,请参阅 API 文档。
创建规则后,由于 IAM TTL 响应高速缓存,可能最多需要 10 分钟才能更新该规则。
以下示例有效内容创建用于保护 CLUSTER-ID
集群的规则。 只有 NETWORK-ZONE-ID
区域中的资源才能访问集群。 由于未指定 operations
,因此 NETWORK-ZONE-ID
区域中的资源可以访问 cluster
和 management
API。
{
"description": "Example rule 1",
"resources": [
{
"attributes": [
{
"name": "accountId",
"value": "ACCOUNT-ID"
},
{
"name": "serviceName",
"value": "containers-kubernetes"
},
{
"name": "serviceInstance",
"value": "CLUSTER-ID"
}
]
}
],
"contexts": [
{
"attributes": [
{
"name": "networkZoneId",
"value": "NETWORK-ZONE-ID"
},
{
"name": "endpointType",
"value": "private"
}
]
}
]
}
以下示例有效内容创建用于保护 CLUSTER-ID
集群的规则。 只有 NETWORK-ZONE-ID
区域中定义的资源才能访问集群。 由于指定了 cluster
API 类型,因此 NETWORK-ZONE-ID
区域中的资源可以通过集群 API 通过专用网络访问集群。
{
"description": "Example rule 2",
"resources": [
{
"attributes": [
{
"name": "accountId",
"value": "ACCOUNT-ID"
},
{
"name": "serviceName",
"value": "containers-kubernetes"
},
{
"name": "serviceInstance",
"value": "CLUSTER-ID"
}
]
}
],
"operations": {
"api_types": [
{
"api_type_id": "crn:v1:bluemix:public:containers-kubernetes::::api-type:cluster"
}
]
},
"contexts": [
{
"attributes": [
{
"name": "networkZoneId",
"value": "NETWORK-ZONE-ID"
},
{
"name": "endpointType",
"value": "private"
}
]
}
]
}
通过 CLI 创建规则
- 要从 CLI 创建规则,请 安装 CBR CLI 插件。
- 您可以使用
ibmcloud cbr rule-create
命令 来创建 CBR 规则。 有关更多信息,请参阅 CBR CLI 参考。 请注意,Red Hat OpenShift on IBM Cloud 的service_name
为containers-kubernetes
。 要查找服务名称列表,请运行ibmcloud cbr service-ref-targets
命令。 要查找服务的 API 类型列表,请运行ibmcloud cbr api-types --service-name SERVICE
命令。
用于创建使用 addresses
键和 cluster
API 类型以及 ipAddress
类型的规则的示例命令。
ibmcloud cbr rule-create my-rule-1 --service-name containers-kubernetes --api-type crn:v1:bluemix:public:containers-kubernetes::::api-type:cluster --zone-id ZONE-ID
以下命令将创建用于保护 CLUSTER-ID
集群的规则。 只有 NETWORK-ZONE-ID
网络区域中的资源才能访问集群。 此规则包含 cluster
和 management
API 类型。
ibmcloud cbr rule-create my-rule-2 --service-name containers-kubernetes --service-instance CLUSTER-ID --zone-id NETWORK-ZONE-ID
以下示例命令创建一个规则,该规则允许所有专用网络连接,但仅允许 allow-client-ip
网络区域中的资源通过公用网络连接到集群。 有关此场景的更多信息,请参阅 设置基于上下文的限制。
ibmcloud cbr rule-create --api-types crn:v1:bluemix:public:containers-kubernetes::::api-type:cluster --description "privateAccess=allowAll, publicAccess=oneIP" --service-name containers-kubernetes --service-instance CLUSTER-ID --context-attributes endpointType=private --context-attributes endpointType=public,networkZoneId=allow-client-ip
从控制台创建规则
- 查看可用上下文 并确定要创建的规则。
- 执行以下步骤以 在控制台中创建基于上下文的限制。
限制
- 创建,实施或禁用规则实施后,可能需要最多 10 分钟才能使更改生效。
- Red Hat OpenShift on IBM Cloud 适用于所有 API 类型或
cluster
API 类型的 CBR 规则不得引用包含 IPv6 地址的网络区域。cluster
类型中包含的 API 不支持 IPv6。 - 如果将 Red Hat OpenShift on IBM Cloud 资源添加到仅专用网络区域,那么用于获取和列出集群的 API 仍可通过公用网络进行访问。
- Red Hat OpenShift on IBM Cloud 适用于所有 API 类型或集群 API 类型的 CBR 规则不得引用其他服务,例如 IBM Cloud Object Storage 或 Key Protect
- Red Hat OpenShift on IBM Cloud 适用于所有 API 类型或集群 API 类型的 CBR 规则不支持对集群 API 类型实施
Report-only
。 - Red Hat OpenShift on IBM Cloud 适用于所有 API 类型或集群 API 类型的 CBR 规则限制为不超过 200 个 IP/子网 (对于专用规则) 和 500 个 IP/子网 (对于公用规则)。
- 由于 Red Hat OpenShift on IBM Cloud 访存集群详细信息的方式存在限制,因此无论 CBR 规则如何,仍可访问用于获取集群和列出集群的 API。 这意味着集群在控制台和 CLI 中仍然可见 (只读)。 解决此限制时,必须添加新规则以保护用于获取集群和列出集群的 API。
- 对于具有公共服务端点的 VPC 上的 Red Hat OpenShift on IBM Cloud 集群,如果将公共 CBR 规则添加到集群,请确保还将 VPC 子网的公共网关 IP 地址添加到 CBR 规则。 如果不包含公共网关 IP,那么 Red Hat OpenShift 控制台 pod 将无法正常工作,因为这些 pod 需要通过公用网络访问集群主节点的 OAuth 端口。
- 在 8 2022 年 10 月之前创建的某些 Red Hat OpenShift on IBM Cloud 集群无法对集群的 APIserver 实施公共 CBR 规则。 要检查集群是否支持这些公共集群 API 类型 CBR 规则,请运行
ibmcloud ks cluster get -c <CLUSTER-ID>
命令。 如果任一服务端点 URL 以https://cXXX
开头 (其中 XXX 是任何三位数字),那么集群将支持公共 CBR 规则。 如果服务端点 URL 以https://cX
开头 (其中c
后面的数字是个位数),那么集群无法对集群的 APIserver 强制实施公共 CBR 规则。 要使用公共 CBR 规则,必须创建新集群。