使用基于上下文的限制保护集群资源
基于上下文的限制使账户所有者和管理员能够根据访问请求的上下文来定义和执行 IBM Cloud® 资源的访问限制。 可以通过基于上下文的限制以及身份和访问管理策略来控制对 IBM Cloud Kubernetes Service 资源的访问。
这些限制适用于基于身份的传统 IAM 策略,以提供额外的保护层。 与 IAM 策略不同,基于上下文的限制不会分配访问权。 基于上下文的限制检查访问请求是否来自您配置的允许上下文。 由于 IAM 访问权和基于上下文的限制都强制实施访问权,因此基于上下文的限制即使在凭证已泄露或管理不当的情况下也会提供保护。 有关更多信息,请参阅 什么是基于上下文的限制。
用户必须在 IBM Cloud Kubernetes Service 服务中具有管理员角色,才能创建、更新或删除规则。 用户必须对基于上下文的限制服务具有“编辑者”或“管理员”角色才能创建,更新或删除网络区域。
任何 Activity Tracker 或生成的审计日志事件都来自基于上下文的限制服务,而不是 IBM Cloud Kubernetes Service。 有关更多信息,请参阅 监视基于上下文的限制。
访问群集控制平面的尝试(可通过使用 Cluster API 类型加以限制)不会生成 Activity Tracker 或审计日志事件。
IBM Cloud Kubernetes Service 如何与基于上下文的限制集成
您可以为群集控制平面 API 或 IBM Cloud 群集管理 API 创建基于上下文的限制 (CBR)。 通过基于上下文的限制,您可以保护以下资源。
- 集群控制平面 API
- 保护对集群或集群中特定命名空间的 IBM Cloud Kubernetes Service API 的访问。 例如,您可以保护 API 以创建 Kubernetes 命名空间。
- 管理 API
- 保护特定群集对 IBM Cloud Kubernetes Service API 的访问。 例如,您可以保护 API 以创建群集。
在 IBM Cloud Kubernetes Service 集群上运行的应用程序(例如由 Kubernetes LoadBalancer 公开的网络服务器)不受 CBR 规则的限制。
保护集群资源
您可以创建 CBR 规则以保护特定区域和集群。
- 集群
- 保护特定 IBM Cloud Kubernetes Service 集群。 如果在 CBR 规则中选择集群,那么只有来自与该规则相关联的网络区域中资源的流量才能与该集群进行交互。
- 如果使用 CLI,可以指定
--service-instance CLUSTER-ID选项来保护特定群集。 - 如果使用 API,可以在资源属性中指定
"name": "serviceInstance","value": "CLUSTER-ID"。 - 区域
- 保护特定区域中的 IBM Cloud Kubernetes Service 资源。 如果在 CBR 规则中选择区域,那么只有来自与该规则关联的网络区域中资源的流量才能与该区域中的资源进行交互。
- 如果使用 CLI,可以指定
--region REGION选项来保护特定区域的资源。 - 如果使用 API,可以在资源属性中指定
"name": "region","value": "REGION"字段。 - 资源组
- 保护特定资源组中的 IBM Cloud Kubernetes Service 资源。
- 如果使用 CLI,可以指定
--resource-group-id RESOURCE-GROUP-ID选项来保护特定资源组中的资源。 - 如果使用 API,可以在资源属性中指定
"name": "resourceGroupId","value": "RESOURCE-GROUP-ID"字段。
保护特定 API
您可以创建 CBR 规则以保护 IBM Cloud Kubernetes Service的以下 API 类型。
- 集群控制平面 API
- 保护对集群中 API 的访问,例如用于创建名称空间和 pod 等的 API。 适用于集群 API 类型的 CBR 规则可控制对集群 API 服务器的访问,其中包括对该集群的所有
kubectl命令。 如果在 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 规则可访问 IBM Cloud Kubernetes Service API,其中包括所有
ibmcloud ks命令调用,例如ibmcloud ks clusters,ibmcloud ks 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 命令。
确保 IBM Cloud Kubernetes Service 在启用 CBR 时能继续访问其他 IBM Cloud 资源
您必须将 containers-kubernetes 添加到针对以下服务创建的规则的网络区域。
- IAM 身份服务
- 允许 IBM Cloud Kubernetes Service 创建令牌和 API 密钥,例如集群 API 密钥和 IBM Cloud Container Registry 令牌和 API 密钥。
- IAM 访问管理服务
- 允许 IBM Cloud Kubernetes Service 为 IBM Cloud Container Registry的“读者”服务访问角色创建 IAM 访问策略。
- IAM 访问组服务
- 允许 IBM Cloud Kubernetes Service 在将 IAM 访问策略与集群中的 RBAC 同步时查找访问组。
- 用户管理
- 允许 IBM Cloud Kubernetes Service 在将 IAM 访问策略与集群中的 RBAC 同步时访问用户信息。
- 密钥保护:
- 允许 IBM Cloud Kubernetes Service 在集群上启用加密。
- Block Storage for VPC (服务器保护)
- 允许 IBM Cloud Kubernetes Service 访问和加密 Block Storage for VPC 卷。
- VPC
- 允许 IBM Cloud Kubernetes Service 访问 VPC 中的资源。
创建网络区域
网络区域充当您在创建 CBR 规则时定义的目标资源的允许列表。 创建网络区域或允许列表后,可以创建规则来定义网络区域可访问的资源。
确保将 containers-kubernetes 服务添加到适用于其他 IBM Cloud 资源的规则的网络区域,例如保护 IBM Cloud Object Storage 的规则,否则某些群集操作可能会失败。 更多信息,请参阅 允许 IBM Cloud Kubernetes Service 通过使用 CBR 访问其他 IBM Cloud 资源。
在创建网络区域之前,请查看 限制。
通过 API 创建网络区域
您可以使用 /v1/zones API 来创建网络区域。 有关更多信息,请参阅 API 文档。 您可以将 containers-kubernetes 服务添加到网络区域,以允许 IBM Cloud Kubernetes Service 访问帐户中的资源和服务。
您可以在网络区域有效内容中包含多种地址类型。 有关更多信息,请参阅 API 文档 中的示例有效内容。
用于将 IBM Cloud Kubernetes Service 添加到网络区域的示例有效内容。 IBM Cloud Kubernetes Service 的 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 参考。 请注意,IBM Cloud Kubernetes Service 的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 服务添加到网络区域,以允许 IBM Cloud Kubernetes Service 访问帐户中的服务和资源。
创建规则
定义规则以保护对帐户中资源的访问权。 您在规则中定义的上下文确定网络区域 (允许列表) 中的资源如何与规则中定义的资源进行交互。
在创建规则之前,请查看 限制。
使用 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 参考。 请注意,IBM Cloud Kubernetes Service 的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 分钟才能使更改生效。
- 以下限制适用于适用于所有 API 类型或
clusterAPI 类型的 IBM Cloud Kubernetes Service CBR 规则:- 它们不得引用包含 IPv6 地址的网络区域。
cluster类型中包含的应用程序接口不支持 IPv6。 - 它们不得引用应用网络区域中的其他服务,如 IBM Cloud Object Storage 或 Key Protect。
- 它们不支持集群 API 类型的
Report-only强制执行。 - 对于专用规则,它们的 IP 地址/子网数不得超过 200 个,对于公用规则,它们的 IP 地址/子网数不得超过 500 个。
- 它们不得引用包含 IPv6 地址的网络区域。
- 在 8 2022 年 10 月之前创建的某些 IBM Cloud Kubernetes Service 集群无法对集群的 APIserver 实施公共 CBR 规则。 要检查集群是否支持这些公共集群 API 类型 CBR 规则,请运行
ibmcloud ks cluster get -c <CLUSTER-ID>命令。 如果任一服务端点 URL 以https://cXXX开头 (其中 XXX 是任何三位数字),那么集群将支持公共 CBR 规则。 如果服务端点 URL 以https://cX开头 (其中c后面的数字是个位数),那么集群无法对集群的 APIserver 强制实施公共 CBR 规则。 要使用公共 CBR 规则,必须创建新集群。