IBM Cloud Docs
通过基于上下文的限制保护虚拟私有云 (VPC) 基础架构服务

通过基于上下文的限制保护虚拟私有云 (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 创建网络区域

  1. 要通过 CLI 创建网络区域, 安装 CBR CLI 插件

  2. 使用 cbr-zone-create 命令将网络位置,VPC 和服务引用添加到网络区域。 有关更多信息,请参阅 CBR CLI 参考

    要查找可用服务引用目标的列表,请运行 ibmcloud cbr service-ref-targets 命令。 该 service_name VPC 基础设施服务的网址是、isCloud Block Storageserver-protect,以及 File Storage for VPCis.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
    

从控制台创建网络区域

  1. 确定要添加到允许列表的资源。
  2. 检查 服务引用 部分,以了解是否需要将任何服务引用添加到网络区域。
  3. 执行以下步骤以 在控制台中创建基于上下文的限制

创建规则

在 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 创建规则

  1. 要从 CLI 创建规则,请 安装 CBR CLI 插件
  2. 使用 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

在控制台中创建规则

  1. 转至 IBM Cloud® 控制台中的 管理 > 基于上下文的限制

  2. 选择规则并单击创建

  3. 选择 VPC 基础架构服务,然后单击 下一步

  4. 将规则的作用域限定为 所有资源特定资源。 有关更多信息,请参阅 保护 VPC 基础架构服务资源。 单击继续

  5. 定义允许的端点类型。

    • 保持切换设置为 No 以允许所有端点类型。
    • 将切换设置为 Yes 以仅允许特定端点类型,然后从列表中进行选择。
  6. 选择已创建的一个或多个网络区域,或者通过单击 创建来创建新的网络区域。

    上下文定义可从中访问资源的位置,从而有效地将网络区域链接到规则。

  7. 单击“添加 ”将您的配置添加到摘要中。 单击下一步

  8. 命名规则并选择要如何实施该规则。 然后点击创建

监视 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 IDReference ID 的值在 IBM Cloud Logs 实例中搜索由基于上下文的限制服务生成的事件。 requestData.environment 部分显示了呼叫的源 IP 地址和其他信息,您可以使用这些信息来验证拒绝授权的原因。 可以使用 requestData.actionrequestData.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 网络区域中; 否则,请求将被拒绝。

限制