通过应用基于上下文的限制来增强云安全性
本教程可能会发生成本。 使用 成本估算器 根据您的预计使用量生成成本估算。
本教程将指导您完成在 IBM Cloud 帐户中实现 基于上下文的限制 (CBRs) 的过程。 CBR 可帮助您进一步保护云环境,并实现 零信任安全模型。
本教程讨论了如何创建网络区域和上下文规则以及如何验证它们是否有效。 在本教程中,您将学习如何在浏览器控制台中创建 CBR 对象,以及如何使用 Terraform 以“基础架构即代码”形式创建 CBR 对象。 您还将了解有关如何为云资源定义访问策略的条件。
目标
- 了解基于上下文的限制,以保护云资源
- 定义网络区域以识别允许和拒绝访问的流量源
- 创建定义用于访问云资源的上下文的规则
- 了解如何测试和监控上下文规则
下图显示了教程 将端到端安全性应用于云应用程序 中使用的解决方案体系结构。 Kubernetes Service 集群,Container Registry,Key Protect和 Object Storage 表示作为上下文规则实现的基于上下文的限制。 请注意,Secrets Manager 可能也已受保护,但仅是可选服务,未在本教程中使用。
准备工作
本教程需要:
- IBM Cloud CLI,
docker
客户机,用于推送和拉取容器映像。
您将在 解决方案教程入门 指南中找到有关为您的操作环境下载和安装这些工具的指示信息。
要避免安装这些工具,可以从 IBM Cloud 控制台使用 Cloud Shell。
设置
在后续步骤 使用 Terraform 来配置基于上下文的限制 中,您将在教程 将端到端安全性应用于云应用程序 中使用的资源的基础上,部署 CBR 对象作为额外的安全层。
-
使用由 Schematics 管理的 Terraform 部署资源,如配套的 GitHub 存储库中所述。
-
必须配置 IBM Cloud Activity Tracker Event Routing 以将审计事件路由到IBM Cloud Logs目标实例。 如果当前未在账户中配置,则按 配置IBM日志目标 中所述路由审计事件。
概述: 基于上下文的限制
基于上下文的限制(CBRs) 使您能够根据网络位置和访问请求类型来定义和实施 IBM Cloud 资源的访问限制。 由于 IAM 策略和基于上下文的限制都强制实施访问权,因此基于上下文的限制提供了保护,即使在凭证受损或管理不当的情况下也是如此。
规则用于管理对由其服务名称和类型以及其他属性标识的资源的访问。 它们可以包含区域,资源组和其他特定于服务的属性。 规则中的属性大多是可选的,因此您可以进行管理,例如,将所有 Key Protect 实例一起管理,或者仅将已识别的 Key Protect 实例中的特定密钥环作为目标。
限制的上下文由网络区域和服务端点组成。 您可能希望根据特定 IP 地址或范围来定义区域,或者通过配置源自一个或多个 VPC 或云服务的流量来定义区域。 因此,可能仅允许从特定 Object Storage 实例访问样本 Key Protect 实例,这是众所周知的 IP 地址范围,并且只能通过专用端点进行访问。
网络区域可用于定义多个规则。 规则的实施方式为“已禁用”,“仅报告”或“已启用”。
目前,并非所有云服务都支持仅报告方式。 此外,这些服务在启用时也不会生成任何与 CBR 相关的日志条目。 请检查各个服务文档以获取详细信息。
创建区域和规则
为了评估基于上下文的限制的影响,您将在 Container Registry中创建用于管理对名称空间的访问权的规则。 首先创建该名称空间,然后创建网络区域以将 VPC 标识为流量源。
- 转到 Container Registry命名 空间,并注意先前配置的命名空间名称。
- 在 IBM Cloud 控制台中,单击 管理 菜单,然后选择 基于上下文的限制。 在概述页面中,单击 创建网络区域。
- 输入 VPCzone 作为名称。 在 允许的 VPC 下,选择具有 Kubernetes Service 集群的 VPC。 单击 下一步 以复审,然后 创建 区域。
- 接下来,通过单击左侧导航中的 规则,然后单击 创建,以使用区域创建规则。
- 在 服务 部分中选择 Container Registry,然后单击 下一步。
- 将 API 部分保留为 所有 服务 API 单击 下一步。
- 然后,在 资源下,选择 特定资源。 选取 资源类型 作为属性,并指定 namespace 作为值。 添加另一个条件,并将资源名称配置为 NAMESPACE(与步骤 1 中的值相同)。 单击 复审,然后单击 继续。
- 从列表中选择先前创建的 VPCzone。 然后使用 添加 和 继续 以进入对话的最后一步。 将 强制执行 标记为 仅报告。 然后,创建规则。
请注意,CBR 区域和规则是异步部署的。 它们可能需要几分钟才能激活 (最终保持一致)。
测试规则及其实施方式
-
在新浏览器选项卡中,打开 IBM Cloud Logs服务,选择云日志选项卡,然后单击接收审计事件的实例名称。
-
在另一个浏览器选项卡中启动 IBM Cloud Shell 的新会话。
-
在 shell 中,执行以下命令: 将环境变量设置为要用于 Container Registry的云区域,例如 us 或 de。
export REGION=us
为Container Registry命名空间设置另一个变量:
export NAMESPACE=<YOUR_NAMESPACE>
现在登录到 Container Registry。
ibmcloud cr login
接下来,将容器映像拉到 shell 环境。
docker pull docker.io/library/hello-world:latest
重新标记映像以将其上载到注册表名称空间。
docker tag docker.io/library/hello-world $REGION.icr.io/$NAMESPACE/hello-world
最后,将容器映像推送到注册表。
docker push $REGION.icr.io/$NAMESPACE/hello-world
-
切换到IBM Cloud Logs显示审计日志的浏览器选项卡。 在报告模式下,当规则匹配时,无论判定结果如何,日志条目都会写入IBM Cloud Activity Tracker Event Routing中。 日志记录包含有关请求的详细信息。 在下图中,允许访问Container Registry命名空间的规则在报告模式下匹配。
在报告方式下匹配的上下文限制 正如所讨论的那样,在报告方式下,所有匹配的请求都会生成一个日志条目。 在事件详细信息中,您将看到值为 许可 或 拒绝的属性 decision。 在上面的屏幕快照中,它是 Deny。
-
返回到具有 shell 的浏览器选项卡中,列出名称空间中的容器映像。
ibmcloud cr images --restrict $NAMESPACE
-
在第三个浏览器选项卡中,浏览至 CBR 规则。 在先前创建的与注册表相关的规则旁边,单击点菜单并选择 编辑。 转至 描述规则 (步骤 3),并将规则从 仅报告 切换到 已启用。 通过按 应用 按钮来激活更改。
-
返回到带有 IBM Cloud Shell的浏览器选项卡。 发出与之前相同的命令以列出映像:
ibmcloud cr images --restrict $NAMESPACE
这一次,应该会产生一条错误消息,表明您未获得授权。
-
在包含日志的浏览器选项卡中,您应该会找到类似于以下内容的新记录:
上下文限制已呈现拒绝 已强制实施该规则,并且根据您尝试访问注册表的方式,已拒绝该访问。 原因是该规则仅允许从特定 VPC 进行访问。 Cloud Shell 环境及其 IP 地址(如 requestData->environment 字段中日志所记录的)不同。 因此,请求被拒绝。
在处理IBM Cloud Logs日志时,可以使用类似以下的查询字符串来轻松查找相关日志记录:
- 在报告方式下,
"context restriction" permit OR deny
会返回具有访问权的日志行,这些日志行将呈现 许可 或 拒绝。 - 在报告方式下,您可以使用
"context restriction" permit
来仅显示允许的访问权。 同样,将"context restriction" deny
用于被拒绝的访问。 - 最后,当处于 强制 方式时,请对与拒绝访问相关的日志行使用类似
context restriction rendered
的查询字符串。
建议在实施新规则之前 30 天对其进行监视。 在 CBR 文档中,以仅报告方式和启用方式了解有关 监视基于上下文的限制 的更多信息。
为了准备在更远的部分中使用 Terraform 部署 CBR 对象,请转至具有 CBR 规则 的浏览器选项卡。 在此处,通过单击先前创建的规则的点菜单并选择 除去,然后使用 删除进行确认,以删除先前创建的规则。 然后,单击 网络区域 并删除先前创建的区域。
定义云资源的访问策略
要为基于上下文的限制 (CBRs) 设置正确的规则集,您应该已定义云资源的访问策略。 所有资源都应由身份和访问权管理 (IAM) 保护。 这意味着,应该在用户或服务标识访问资源之前执行认证和授权检查。 CBR 通过根据源条件和其他规则切断网络访问来添加保护,但它们不会替换正确的 IAM 配置。 此外,许多服务支持将网络流量限制到专用端点,因此已经减少了访问选项。
您可能会发现某些规则会影响管理资源的适当性,例如,通过浏览器控制台。 此外,您需要确保不会拒绝自己访问资源,管理仪表板和 API。 因此,您必须考虑防御主机,企业网络,网关,甚至 Cloud Shell。 此外,某些服务支持对 CBR 配置的数据平面和控制场所访问进行细颗粒度区分,例如,Kubernetes Service 集群和管理 API。
总之,应提出以下问题:
- 所有资源是否都受 IAM 和类似的资源保护?
- 如何访问资源,这些资源是否已在可能的情况下仅限于专用端点?
- 是否可以分离数据平面和控制平面访问?
- 什么是与使用相关的流量,哪些是与管理工作相关的流量? 如何处理紧急情况?
- 上述流量从何而来?
使用报告方式可了解与基于上下文的限制相匹配的活动。 基于规则的决策是呈现许可还是拒绝? 这是否符合您的期望? 要了解活动并使用 CBR 规则正确处理这些活动,建议使用至少一个月的报告方式测试阶段。 这允许对期望的一组网络区域和上下文规则采用迭代方法。
对于本教程,我们将定义以下网络区域:
- Kubernetes Service 集群的区域
- Object Storage 的区域
- 使用家庭网络 (企业或堡垒) 的地址作为 家庭区域 的 IP 范围
此后,我们将定义如下上下文规则:
- 用于从区域访问 Key Protect 实例:
- Kubernetes Service 集群
- Object Storage
- 用于从区域访问 Object Storage 实例及其存储区:
- Kubernetes Service 集群
- 顺带
- 用于从区域访问 Container Registry 以及具有容器映像 的名称空间:
- Kubernetes Service 集群
- 用于从专区访问 Kubernetes Service 集群及其管理 API:
- 顺带
可以使用单个 Terraform 命令以仅报告方式或强制方式部署所有上述区域和规则。 请注意,这些规则并非用于生产用途,而是作为样本,用于调查仅报告方式下的使用情况和流量。
该文档具有 支持作为服务引用的资源列表。 您还可以使用 CLI 命令 service-ref-targets 或相关 API 函数 List available service reference targets 来检索列表。
使用 Terraform 来配置基于上下文的限制
建议您自动执行部署,而不是为项目手动创建网络区域和上下文规则。 可以使用“基础结构即代码”(IaC) (即 Terraform 代码) 来部署基于上下文的限制。 您可以先以仅报告方式部署具有规则的区域和规则以进行测试。 然后,在彻底测试之后,通过更新已部署的配置来切换到强制方式。
区域和规则的 Terraform 资源
在以下内容中,您将部署 Terraform 代码以创建一组基本网络区域和上下文规则。 区域的代码正在使用 ibm_cbr_zone 资源。 下面显示了用于标识 Kubernetes 集群的区域规范。 此类集群是 支持的服务引用 之一。
resource "ibm_cbr_zone" "cbr_zone_k8s" {
account_id = data.ibm_iam_account_settings.team_iam_account_settings.account_id
addresses {
type = "serviceRef"
ref {
account_id = data.ibm_iam_account_settings.team_iam_account_settings.account_id
service_instance = data.ibm_container_vpc_cluster.cluster.id
service_name = "containers-kubernetes"
}
}
description = "Zone with the Kubernetes cluster"
name = "cbr_zone_k8s"
}
规则的代码正在使用 ibm_cbr_rule 资源。 下面显示了典型规则的 Terraform 配置。 与浏览器 UI 类似,它具有以下元素:
- 用于指定区域的上下文
- 实施方式
- 它所应用于的资源,由属性标识
resource "ibm_cbr_rule" "cbr_rule_cos_k8s" {
contexts {
attributes {
name = "networkZoneId"
value = ibm_cbr_zone.cbr_zone_k8s.id
}
}
contexts {
attributes {
name = "networkZoneId"
value = ibm_cbr_zone.cbr_zone_homezone.id
}
}
description = "restrict COS access, limit to cluster"
enforcement_mode = var.cbr_enforcement_mode
resources {
attributes {
name = "accountId"
value = data.ibm_iam_account_settings.team_iam_account_settings.account_id
}
attributes {
name = "serviceInstance"
operator = "stringEquals"
value = var.cos.guid
}
attributes {
name = "serviceName"
operator = "stringEquals"
value = "cloud-object-storage"
}
}
}
部署 Terraform 资源
随着对 CBR 相关 Terraform 资源的了解,现在是时候在现有资源的基础上部署它们来创建区域和规则了。
- 在浏览器中,浏览到 IBM Cloud Schematics 工作空间。 选择具有先前设置中的现有资源的工作空间。
- 点击 “设置”。 在 变量 列表中,找到具有 deploy_cbr 的行。 其值应为缺省值 false。
- 在变量的点菜单中,选择 编辑。 然后,在弹出表单中,取消选中 使用缺省值 以能够更改值。 在 名为 :deploy_cbr 的变量的值字段中输入 true。 然后,通过单击 保存来完成更新。
- 更新设置页面后,继续顶部的 生成计划。 计划输出应指示将创建 CBR 区域和规则。
- 使用 应用计划 按钮创建 CBR 对象。
缺省情况下,实施方式配置为 仅报告。 您可以将变量 cbr_enforcement_mode 更改为值 enabled 以实施限制。
测试上下文规则
部署了一组基于上下文的限制后,再次验证和测试这些限制是时候了。 要验证 CBR 对象,请转至 基于上下文的限制概述。 然后,检查新的 区域 和 规则。
应在 Container Registry,Object Storage 和 Key Protect 上执行测试,并通过监视先前执行的日志进行验证。 由于区域和规则包含对 Container Registry的访问限制,因此您可以重复 测试规则及其实施方式 部分中执行的测试。
要测试新规则以访问 Object Storage,请执行以下步骤:
- 在浏览器选项卡中,转至 Object Storage 实例的列表。 单击教程的服务名称,例如,secure-file-storage-cos。
- 在第二个浏览器标签页中,访问已使用过的IBM Cloud Logs仪表板,其中包含审计日志。
- 返回到包含 Object Storage 概述的选项卡中的 存储区列表中,单击存储区。
- 使用 上载 将文件导入到存储区中。 将设置保留为 标准传输,并使用 上载文件 (对象) 区域来选择文件。 点击上传完成。
- 在有审计日志的浏览器选项卡中,应该有标题为
Context restriction matched while in report mode
的 CBR 相关日志记录。 这是因为已在 report 方式下部署规则。 展开一些记录以检查报告的 决策 和 isEnforced 数据。 根据为 homezone 配置的 IP 范围,decision 可能是 许可 或 拒绝。 由于报告方式,isEnforced 的值应该为 false。
要进行进一步测试,您可能需要更改家乡区域的 IP 范围。 它是 Schematics 设置中的变量 homezone_iprange。
除去资源
要除去资源,请使用浏览器并浏览至 IBM Cloud Schematics 工作空间概述。 选择工作空间,然后在 操作 菜单中,首先选择 破坏资源,然后使用 删除工作空间。
相关内容
- 博客帖子 使用基于上下文的限制实现零信任
- 博客帖子 介绍基于上下文的限制
- 什么是零信任?
- 关于组织用户、团队、应用程序的最佳实践