通过基于上下文的限制保护虚拟私有云 (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基础架构服务中使用基于上下文的限制时需要包含的服务引用。 在考虑为网络区域添加哪些服务引用时,您还可以查看账户中的 服务间IAM授权。 您可以在账户中通过前往 “管理”->“访问权限(IAM)”,然后选择 “授权”选项卡来查看服务间授权。

基于上下文限制所需的服务引用
具有基于上下文的限制的服务 受影响的服务 网络区域中所需的服务引用
Cloud 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 基础设施服务的属性 serviceRefis。 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. 要通过命令行界面创建网络区域,请安装CBR命令行界面插件

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

    要查找可用服务引用目标的列表,请运行 命令ibmcloud cbr service-ref-targetsVPC 基础设施服务的 service_name 费用为 isCloud Block Storageserver-protect,而 File Storage for VPCis.share

    以下示例命令将 is 服务(在 IBM Cloud® 控制台中称为 VPC基础设施服务 )添加到网络区域。

    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 命令行界面创建、更新或删除基于上下文的 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的 客户端身份验证 配置中启用用户ID和密码,并在VPC资源上创建基于上下文的规则,则客户端与VPN的连接将受到基于上下文的限制影响。 如果 VPN 客户机远程 IP 不在 网络区域中,那么与 VPN 服务器的连接将返回 Auth Failed 错误。

VPN 客户端连接到 VPN 服务器后,将通过基于上下文的限制来控制对 VPE 端点或 Cloud Service 端点 (CSE) 的请求。 此外,请求的源 IP 是 VPC 云服务端点源地址。 请确保 VPC CSE 源地址位于 CBR 网络区域中; 否则,请求将被拒绝。

限制