通过基于上下文的限制保护虚拟私有云 (VPC) 基础架构服务
基于上下文的限制使帐户所有者和管理员能够根据访问请求的上下文来定义和实施 IBM Cloud® 资源的访问限制。 可以使用基于上下文的限制以及身份和访问管理 (IAM) 策略来控制对 VPC 基础架构服务的访问。
这些限制适用于基于身份的传统 IAM 策略,以提供额外的保护层。 与 IAM 策略不同,基于上下文的限制不会分配访问权。 基于上下文的限制检查访问请求是否来自您配置的允许上下文。 由于 IAM 访问权和基于上下文的限制都强制实施访问权,因此基于上下文的限制即使在凭证已泄露或管理不当的情况下也会提供保护。 有关更多信息,请参阅 什么是基于上下文的限制。
用户必须对 VPC 基础架构服务具有管理员角色,才能创建,更新或删除以 VPC 基础架构服务为目标的规则。 用户必须对基于上下文的限制服务具有“编辑者”或“管理员”角色才能创建,更新或删除网络区域。 对基于上下文的限制服务具有“查看者”角色的用户只能向规则添加网络区域。
每次实施基于上下文的策略时,基于上下文的限制服务都会生成审计日志。 有关更多信息,请参阅 监视基于上下文的限制。
要开始使用基于上下文的限制来保护 VPC 基础架构服务,请参阅 利用基于上下文的限制来保护资源 教程。
VPC 基础架构服务如何与基于上下文的限制集成
VPC 基础架构服务是由多个子服务组成的组合服务。 可以为 IBM Cloud VPC 或其任何子服务创建基于上下文的限制; 例如, 子网,虚拟服务器实例 和 Block Storage 卷。
请参阅 规则创建部分,以获取有关如何使用每个服务的必需属性创建规则的详细信息。
创建网络区域
网络区域表示在其中创建访问请求的 IP 地址的允许列表。 它定义一组由以下属性指定的一个或多个网络位置:
- IP 地址,包括单个地址,范围或子网
- VPC
- 服务引用,允许从其他 IBM Cloud® 服务进行访问
服务引用
定义为网络区域一部分的 服务引用允许给定服务与特定基于上下文的限制策略所针对的受限资源或 API 进行通信。 下表包含在 VPC 基础架构服务的上下文中使用基于上下文的限制时需要包含的服务引用。 在决定要在网络区域中添加哪些服务引用时,您还可以查看帐户中的 service-to-service IAM 权限。 通过浏览至 管理-> 访问权 (IAM) 并选择 授权 选项卡,您可以在帐户中找到服务到服务授权。
具有基于上下文的限制的服务 | 受影响的服务 | 网络区域中需要服务引用 |
---|---|---|
CCloud Object Storage | VPC 基础设施服务 (is ) |
|
Key Protect | Cloud Block Storage (server-protect ),File Storage for VPC ( is.share ) |
|
Hyper Protect 加密服务 | Cloud Block Storage (server-protect ),File Storage for VPC ( is.share ) |
|
虚拟服务器实例 | VPC 基础设施服务 (is ) |
|
各种 VPC 基础架构服务- Block Storage 卷,安全组和子网 | IBM Kubernetes Service (containers-kubernetes ) |
|
Secrets Manager | VPC 基础设施服务 (is ) |
使用 API 创建网络区域
您可以使用 create-zone
命令来创建网络区域。 有关更多信息,请参阅
API 文档。
VPC 基础设施服务的 serviceRef
属性是 is
,Cloud Block Storage 是
server-protect
, File Storage for VPC 是 is.share
。
{
"name": "Example zone 1",
"description": "",
"addresses": [
{
"type": "serviceRef",
"ref": {
"service_name": "is"
}
}
]
}
{
"name": "Example zone 1",
"description": "",
"addresses": [
{
"type": "serviceRef",
"ref": {
"service_name": "server-protect"
}
}
]
}
使用 CLI 创建网络区域
-
要通过 CLI 创建网络区域, 安装 CBR CLI 插件。
-
使用
cbr-zone-create
命令将网络位置,VPC 和服务引用添加到网络区域。 有关更多信息,请参阅 CBR CLI 参考。要查找可用服务引用目标的列表,请运行
ibmcloud cbr service-ref-targets
命令。 该service_name
VPC 基础设施服务的网址是、is
Cloud Block Storage 是server-protect
,以及 File Storage for VPC 是is.share
。下面的示例命令将添加
is
服务,即 VPC 基础架构服务 IBM Cloud® 控制台的网络区域。ibmcloud cbr zone-create --name example-zone-1 --description "Example zone 1" --service-ref service_name=is
下面的示例命令添加了
server-protect
服务,称为 Cloud Block Storage IBM Cloud® 的服务添加到网络区域。ibmcloud cbr zone-create --name example-zone-1 --description "Example zone 1" --service-ref service_name=server-protect
从控制台创建网络区域
- 确定要添加到允许列表的资源。
- 检查 服务引用 部分,以了解是否需要将任何服务引用添加到网络区域。
- 执行以下步骤以 在控制台中创建基于上下文的限制。
创建规则
在 VPC 基础架构服务中,每个子服务都需要基于上下文的规则中的特定属性。
使用 API,Terraform 或 IBM Cloud 命令行界面 (CLI) 时 要创建,更新或删除 IBM Cloud 基于上下文的限制,您可以使用资源属性指定目标 VPC 基础结构资源。
请参阅 VPC 资源属性,以获取与各个 VPC 资源相对应的资源属性。
您可以通过输入对象的标识来选择资源。 或者,可以使用 *
通配符来选择所有适用的资源。 例如,属性 vpcId:*
设置基于上下文的限制以应用于帐户中的所有 VPC。 您还可以在命令中指定策略应用于哪个资源组。
使用 API 创建规则
查看以下示例请求以创建规则。 有关 v1/rules
的更多信息 API,请参阅 API 文档。
创建规则后,可能需要最多 10 分钟才能更新该规则。
以下示例有效内容创建用于保护虚拟服务器实例的规则,并且仅允许通过专用端点从指定网络区域进行访问。
{
"contexts": [
{
"attributes": [
{
"name": "endpointType",
"value": "private"
},
{
"name": "networkZoneId",
"value": "45ec64065b7c2bf84b3edec803335111"
}
]
}
],
"resources": [
{
"attributes": [
{
"name": "resourceGroupId",
"value": "1171749e3a8545069d04e6fca1ded18f"
},
{
"name": "serviceName",
"value": "is"
},
{
"name": "instanceId",
"value": "*"
}
]
}
]
}
使用 CLI 创建规则
- 要从 CLI 创建规则,请 安装 CBR CLI 插件。
- 使用
ibmcloud cbr rule-create
命令 来创建 CBR 规则。 有关更多信息,请参阅 CBR CLI 参考。
本节中的示例是实施规则。 您可以通过添加 --enforcement-mode report
使其仅报告。
以下示例 CLI 命令为当前帐户中的所有虚拟服务器实例创建基于上下文的限制规则:
ibmcloud cbr rule-create --zone-id a7eeb5dd8e6bdce670eba1afce18e37f --description "Test CBR for VSIs" --service-name is --resource-attributes "instanceId=*"
以下示例 CLI 命令为当前帐户中的特定块存储卷创建基于上下文的限制规则:
ibmcloud cbr rule-create --zone-id a7eeb5dd8e6bdce670eba1afce18e37f --description "Test CBR for volume" --service-name is --resource-attributes "volumeId=UUID_OF_THE_VOLUME"
以下示例 CLI 命令为当前帐户中的所有虚拟服务器实例创建基于上下文的限制规则,并限制对专用端点的访问:
ibmcloud cbr rule-create --context-attributes 'endpointType=private' --zone-id a7eeb5dd8e6bdce670eba1afce18e37f --description "Test CBR for VSIs" --service-name is --resource-attributes "instanceId=*"
以下示例 CLI 命令为资源组中的所有虚拟服务器实例创建基于上下文的限制规则,并限制对专用端点的访问:
ibmcloud cbr rule-create --context-attributes 'endpointType=private' --zone-id a7eeb5dd8e6bdce670eba1afce18e37f --description "Test CBR for VSIs" --service-name is --resource-attributes "instanceId=*" --resource-group-id 1171749e3a8545069d04e6fca1ded18f
在控制台中创建规则
-
转至 IBM Cloud® 控制台中的 管理 > 基于上下文的限制。
-
选择规则并单击创建。
-
选择 VPC 基础架构服务,然后单击 下一步。
-
将规则的作用域限定为 所有资源 或 特定资源。 有关更多信息,请参阅 保护 VPC 基础架构服务资源。 单击继续。
-
定义允许的端点类型。
- 保持切换设置为 No 以允许所有端点类型。
- 将切换设置为 Yes 以仅允许特定端点类型,然后从列表中进行选择。
-
选择已创建的一个或多个网络区域,或者通过单击 创建来创建新的网络区域。
上下文定义可从中访问资源的位置,从而有效地将网络区域链接到规则。
-
单击“添加 ”将您的配置添加到摘要中。 单击下一步。
-
命名规则并选择要如何实施该规则。 然后点击创建。
监视 VPC 基础架构服务中基于上下文的限制
每次实施基于上下文的策略时,基于上下文的限制服务都会生成审计日志。 有关更多信息,请参阅 监视基于上下文的限制。
对由于基于上下文的限制而导致的故障进行故障诊断
用户获取 403 未授权
当由于访问许可权不正确或请求源自基于上下文的限制规则中定义的网络区域之外而拒绝请求时,错误响应具有类似于以下示例的格式。
使用 CLI 时发生 403 未经授权的错误
Error code: not_authorized and
Error message: the provided token is not authorized
Trace ID: b266a31c-b359-4ecb-8b81-a27c1b2cdb7b
使用 IBM Cloud 控制台时发生 403 未经授权的错误
reference_id b266a31c-b359-4ecb-8b81-a27c1b2cdb7b
code not_authorized
message the provided token is not authorized
使用 API 时发生 403 未经授权的错误
"code":"not_authorized",
"message":"the provided token is not authorized to list floating-ips in this account"
"trace":"b266a31c-b359-4ecb-8b81-a27c1b2cdb7b"
定位基于上下文的限制事件
您可以使用 Trace ID
或 Reference ID
的值在 IBM Cloud Logs 实例中搜索由基于上下文的限制服务生成的事件。 requestData.environment
部分显示了呼叫的源 IP 地址和其他信息,您可以使用这些信息来验证拒绝授权的原因。 可以使用 requestData.action
和 requestData.resource
字段来确定哪个底层资源被拒绝访问。
以下是基于上下文的限制事件示例。 已除去某些字段以提高可读性。
{
"level": "critical",
"action": "context-based-restrictions.policy.eval",
"message": "Context based restriction rendered a deny",
"severity": "critical",
"correlationId": "TXID-b266a31c-b359-4ecb-8b81-a27c1b2cdb7b-df2f912c-80a1-422c-8b17-6092651fea00",
"requestData": {
"action": "is.vpc.vpc.create",
"reqOrder": 0,
"environment": {
"attributes": {
"ipAddress": "192.168.0.1",
"networkType": "public"
}
},
"resource": {
"attributes": {
"accountId": "67db3d7ff3f34220b40e2d81480754c9",
"resource": "NEWRESOURCE",
"vpcId": "NEWRESOURCE",
"resourceGroupId": "d272ce832535498e9142b557ff8638ed",
"region": "au-syd",
"serviceName": "is",
"resourceType": "vpc"
}
},
"subject": {
"attributes": {
"scope": "ibm openid",
"token.account.bss": "67db3d7ff3f34220b40e2d81480754c9",
"id": "IBMid-550009FB7N"
}
}
},
"responseData": {
"decision": "Deny",
"isEnforced": true
}
}
然后,您可以使用相同的跟踪 ID 或引用 ID 查看 IBM Cloud Logs 实例中的特定 VPC 基础架构服务事件。
{
"action": "is.vpc.vpc.create",
"outcome": "failure",
"message": "Virtual Private Cloud: create vpc -failure",
"severity": "critical",
"dataEvent": false,
"logSourceCRN": "crn:v1:bluemix:public:is:au-syd:a/67db3d7ff3f34220b40e2d81480754c9::vpc:",
"saveServiceCopy": true,
"initiator": {
"id": "IBMid-ABCDEFGH",
"typeURI": "service/security/account/user",
"name": "test@ibm.com",
"authnName": "test",
"authnId": "IBMid-ABCDEFGH",
"host": {
"address": "192.168.0.1",
"addressType": "IPv4"
},
"credential": {
"type": "token"
}
},
"target": {
"id": "crn:v1:bluemix:public:is:au-syd:a/67db3d7ff3f34220b40e2d81480754c9::vpc:",
"typeURI": "is.vpc/vpc",
"name": "",
"resourceGroupId": "crn:v1:bluemix:public:resource-controller::a/67db3d7ff3f34220b40e2d81480754c9::resource-group:d272ce832535498e9142b557ff8638ed"
},
"reason": {
"reasonCode": 403,
"reasonType": "Forbidden",
"reasonForFailure": "Your access token is invalid or does not have the necessary permissions to perform this task"
},
"requestData": {
"generation": "2",
"requestId": "b266a31c-b359-4ecb-8b81-a27c1b2cdb7b"
},
"responseData": {
"responseURI": "/v1/vpcs/"
}
}
您还可以使用资源标识来搜索事件。 资源标识是 UUID,是 CRN 中的最后一个标识。 例如:
crn:v1:bluemix:public:is:au-syd:a/67db3d7ff3f34220b40e2d81480754c9::vpc:<resourceID>
供应资源的请求不包含资源标识。
如果在 IBM Cloud Logs 中没有找到基于上下文的限制事件,则可能是由于 IAM 访问策略导致访问被拒绝。 有关更多信息,请参阅 VPC IAM 入门指南。
具有基于上下文的限制的客户机到站点 VPN 数据平面影响
如果用户在为客户机到站点 VPN 配置 客户机认证 时启用 用户标识和密码,并在 VPC 资源上创建基于上下文的规则,那么到 VPN 的客户机连接受基于上下文的限制影响。 如果 VPN 客户机远程 IP 不在 网络区域中,那么与 VPN 服务器的连接将返回
Auth Failed
错误。
VPN 客户端连接到 VPN 服务器后,将通过基于上下文的限制来控制对 VPE 端点或 Cloud Service 端点 (CSE) 的请求。 此外,请求的源 IP 是 VPC 云服务端点源地址。 请确保 VPC CSE 源地址位于 CBR 网络区域中; 否则,请求将被拒绝。
限制
- 基于上下文的限制仅通过 IBM CLI 保护与 VPC 基础架构服务 API 或
is
插件相关联的操作。 还支持 SDK 和 Terraform 选项。 与以下平台 API 关联的操作 不受 基于上下文的限制保护:- 资源实例列表 API
- 资源实例删除资源 API
- 全局搜索 API
- 全局标记 连接 和 拆离 API
- 创建规则时,可能需要最多 10 分钟才能强制实施。
- 由于当前正在解决的限制,如果您使用的是 Load Balancer for VPC 服务,那么对于 Secrets Manager API,必须不存在基于上下文的限制,因为这会导致无法将证书连接到与负载均衡器相关联的侦听器。