IBM Cloud Docs
使用基于上下文的限制保护目录

使用基于上下文的限制保护目录

基于上下文的限制使帐户所有者和管理员能够根据访问请求的上下文来定义和实施 IBM Cloud® 资源的访问限制。 可以使用基于上下文的限制以及身份和访问管理 (IAM) 策略来控制对目录 (目录管理服务) 的访问。

这些限制适用于基于身份的传统 IAM 策略,以提供另一层保护。 与 IAM 策略不同,基于上下文的限制不会分配访问权。 基于上下文的限制检查访问请求是否来自您配置的允许上下文。 由于 IAM 访问权和基于上下文的限制都强制实施访问权,因此基于上下文的限制提供了保护,即使在凭证受损或管理不当的情况下也是如此。 有关更多信息,请参阅 什么是基于上下文的限制

任何 IBM Cloud Activity Tracker 或生成的审计日志事件都来自基于上下文的限制服务,而不是“目录管理”。 有关更多信息,请参阅 监视基于上下文的限制

准备工作

请查看以下访问要求:

  • 用户必须在目录管理服务上具有管理员角色才能创建,更新或删除规则。
  • 用户还必须对基于上下文的限制服务具有“编辑者”或“管理员”角色,才能创建,更新或删除网络区域。
  • 对基于上下文的限制服务具有“查看者”角色的用户只能向规则添加网络区域。

要开始使用基于上下文的限制来保护目录,请参阅 利用基于上下文的限制来保护资源 教程。

目录如何与基于上下文的限制集成

保护特定 API

您可以创建基于上下文的限制,以保护目录管理服务的以下 API。

服务 API
目标服务 API 可保护诸如共享专用目录和管理目录设置之类的操作。
平台 API
用于保护专用目录上的创建,更新和删除操作的目标平台 API。 当基于上下文的限制保护目录管理平台 API 时,用户必须满足规则才能查看您指定的专用目录。

保护特定资源

您可以通过将规则范围限定为“目录管理”的可用属性来保护特定资源。

目录
限定规则范围以保护特定专用目录。 仅当用户满足上下文规则时,他们才能查看您保护的目录。

限制

基于上下文的限制仅保护与 目录管理 API 关联的操作。 有关更多信息,请参阅 IAM 角色和操作。 与以下平台 API 关联的操作不受基于上下文的限制保护。 请参考 API 文档以获取特定操作标识。

创建网络区域

网络区域表示在其中创建访问请求的 IP 地址的允许列表。 它定义一组由以下属性指定的一个或多个网络位置:

  • IP 地址,包括单个地址,范围或子网。
  • VPC
  • 服务引用,允许从其他 IBM Cloud 服务进行访问。

请确保将“目录管理”添加到针对其他 IBM Cloud 资源的规则的网络区域,否则工作流程中的某些操作可能会失败。

服务引用

将目录管理服务 (globalcatalog-collection) 添加到针对以下服务创建的规则的网络区域。 这样,两个服务可以继续沟通。

Secrets Manager
如果您有保护 Secrets Manager 的规则,并且您正在 使用 Secrets Manager加载产品,请将 IP 地址和目录管理服务作为服务引用添加到网络区域。
Schematics
如果您正在使用 目标帐户 来验证产品,并且在目标帐户中具有保护 Schematics 的规则,请将“目录管理”服务作为服务引用添加到网络区域。

同样,如果您具有以目录管理服务为目标的规则,请将 Schematics 服务添加为网络区域中的服务引用。

IAM 身份
如果您的作用域限定为保护整个 IAM 身份服务或作用域限定为 用于验证的可信概要文件,请将“目录管理”服务作为服务引用添加到网络区域,以便验证流仍有效。

确保将该网络区域添加到基于上下文的限制规则。 这样,两个服务可以继续沟通。

使用控制台的示例

通过创建网络区域,可以建立产生访问请求的允许位置的列表。 将“目录管理”服务作为服务引用添加到该允许列表。 创建网络区域后,可以将其添加到规则。

要创建网络区域,请完成以下步骤:

  1. 在 IBM Cloud 控制台中,单击 管理 > 基于上下文的限制,然后选择 网络区域

  2. 单击创建

    您可以使用 JSON 代码表单来直接输入 JSON,以通过单击 作为 JSON 代码输入来创建区域,而不是使用 UI 输入来创建区域。

  3. 输入一个唯一的名称和描述。 例如,“目录区域”和“允许目录与其他服务交互”。

  4. 引用服务。 选择服务类型“IAM 服务”,然后选择“目录管理”服务。 单击 添加 以将服务的 IP 地址与网络区域相关联。

  5. 单击 下一步 以查看网络区域。

  6. 单击创建

使用CLI的示例

通过创建网络区域,可以建立产生访问请求的允许位置的列表。 将“目录管理”服务作为服务引用添加到该允许列表。 创建网络区域后,可以将其添加到规则。

  1. 通过运行以下命令来安装 基于上下文的限制 CLI 插件:

    ibmcloud plugin install cbr
    
  2. 要创建网络区域,请使用 cbr zone-create 命令。

    以下示例创建具有服务引用的网络区域。 有关更多信息,请参阅 服务参考

    ibmcloud cbr zone-create --name CatalogZone --description "Allow catalogs to interact with other services" --service-ref service_name=globalcatalog-collection
    

    要查找可用服务引用的列表,请运行 ibmcloud cbr service-ref-targets 命令。

使用API的示例

通过创建网络区域,可以建立产生访问请求的允许位置的列表。 将“目录管理”服务作为服务引用添加到该允许列表。 创建网络区域后,可以将其添加到规则。

要创建包含目录管理服务的网络区域,请调用 基于上下文的限制 API,如以下示例中所示:

{
  "name": "Catalog zone",
  "description": "Allow catalogs to interact with other services",
  "addresses": [
    {
      "type": "serviceRef",
      "ref": {
        "service_name": "globalcatalog-collection"
      }
    }
  ]
}
AddressIPAddress ipAddressModel = new AddressIPAddress.Builder()
ServiceRefValue serviceRefValueModel = new ServiceRefValue.Builder()
  .accountId(accountID)
  .serviceName("globalcatalog-collection")
  .build();
AddressServiceRef serviceRefAddressModel = new AddressServiceRef.Builder()
  .type("serviceRef")
  .ref(serviceRefValueModel)
  .build();
CreateZoneOptions createZoneOptions = new CreateZoneOptions.Builder()
  .name("Catalog zone")
  .accountId(accountID)
  .description("Allow catalogs to interact with other services")
  .addresses(java.util.Arrays.asList(ipAddressModel, ipRangeAddressModel, subnetAddressModel, vpcAddressModel, serviceRefAddressModel))
  .excluded(java.util.Arrays.asList(excludedIPAddressModel))
  .build();

Response<Zone> response = contextBasedRestrictionsService.createZone(createZoneOptions).execute();
Zone zone = response.getResult();

System.out.println(zone);
// Request models needed by this operation.

// AddressServiceRef
const serviceRefAddressModel = {
  type: 'serviceRef',
  ref: {
    account_id: accountId,
    service_name: 'globalcatalog-collection',
  },
};

const params = {
  name: 'Catalog zone',
  accountId,
  addresses: [ipAddressModel, ipRangeAddressModel, subnetAddressModel, vpcAddressModel, serviceRefAddressModel],
  excluded: [excludedIPAddressModel],
  description: 'Allow catalogs to interact with other services',
};

try {
  const res = await contextBasedRestrictionsService.createZone(params);
  zoneId = res.result.id;
  zoneRev = res.headers.etag;
  console.log(JSON.stringify(res.result, null, 2));
} catch (err) {
  console.warn(err);
}
service_ref_address_model = {
  'type': 'serviceRef',
  'ref': {
    'account_id': account_id,
    'service_name': 'globalcatalog-collection',
  }
}

zone = context_based_restrictions_service.create_zone(
  name='catalog zone',
  account_id=account_id,
  addresses=[service_ref_address_model],
  description='allow catalogs to interact with other services',
).get_result()

print(json.dumps(zone, indent=2))
serviceRefAddressModel := &contextbasedrestrictionsv1.AddressServiceRef{
  Type: core.StringPtr("serviceRef"),
  Ref: &contextbasedrestrictionsv1.ServiceRefValue{
    AccountID:   core.StringPtr(accountID),
    ServiceName: core.StringPtr("globalcatalog-collection"),
  },

createZoneOptions := contextBasedRestrictionsService.NewCreateZoneOptions()
createZoneOptions.SetName("catalog zone")
createZoneOptions.SetAccountID(accountID)
createZoneOptions.SetDescription("allow catalogs to interact with other services")
createZoneOptions.SetAddresses([]contextbasedrestrictionsv1.AddressIntf{serviceRefAddressModel})

zone, response, err := contextBasedRestrictionsService.CreateZone(createZoneOptions)
if err != nil {
  panic(err)
}
b, _ := json.MarshalIndent(zone, "", "  ")
fmt.Println(string(b))

要查找可用服务引用列表,请调用 ListAvailableServicerefTargets 方法。

使用 Terraform 创建网络区域

通过创建网络区域,可以建立产生访问请求的允许位置的列表。 将“目录管理”服务作为服务引用添加到该允许列表。 创建网络区域后,可以将其添加到规则。

要创建网络区域,请使用 Terraform 资源 cbr_zone

  1. 要安装 Terraform CLI 并配置 IBM Cloud Provider Plug-in for Terraform,请遵循 IBM Cloud® 上的 Terraform 入门 教程。 该插件对用于完成此任务的 IBM Cloud API 进行抽象。

  2. 创建一个名为 main.tf 的Terraform配置文件。 在此文件中,您将添加配置以使用 HashiCorp 配置语言创建网络区域。 有关更多信息,请参阅 Terraform 文档

    以下示例创建允许单个 IP 地址并显式排除单个 IP 地址的网络区域。

    resource "ibm_cbr_zone" "cbr_zone" {
      account_id = "12ab34cd56ef78ab90cd12ef34ab56cd"
      addresses {
            type = "serviceRef"
            value = "globalcatalog-collection"
      }
      description = "allow catalogs to interact with other services"
      name = "catalog zone"
    }