使用基于上下文的限制,将入站流量限制在应用程序和功能上

您可以使用 IBM Cloud® 基于上下文的限制 (CBR) 来控制 IBM Cloud® Code Engine 应用程序和功能的入站网络流量。 利用 CBR,您可以通过专用端点、公共端点或两者限制访问,为工作负载提供灵活的网络级安全保护。 基于上下文的限制不是根据身份分配访问权限,而是验证访问请求是否来自你配置的允许上下文。 您可以限制 Code Engine 项目中应用程序和功能的入站流量,以 保护项目免受不必要的入站流量影响。 这些基于上下文的限制适用于账户、项目、资源组或位置(区域)级别,并适用于限制范围内的所有应用程序和功能。

Code Engine 应用程序和功能的基于上下文的限制支持以下用例:

  • 完全阻止公共入站:限制应用程序和功能只能通过 CBR 的专用端点访问。 这种方法无需配置 应用程序端点可见性 设置,因为公共访问会在网络层面被阻止。 您的工作负载仍可从专用网络(如 VPC)和同一项目中的其他 Code Engine 组件访问。

  • 通过 IP 阻止公开和限制私有:通过阻止所有公共互联网访问并将私人终端访问限制在特定 IP 地址或网络区域,实现对入站流量的最大控制。 这样,既能对专用端点实施基于 IP 的限制,又能在网络层面完全阻止公共端点。

  • 完全隔离工作负载:阻止私有和公共端点,在网络层面完全隔离应用程序和功能。 这种用例非常适合以下场景:只需进行出站连接的批处理工作负载、完全通过消息队列或事件订阅进行通信的内部微服务,或者正在进行维护的工作负载(您希望在保持应用部署的同时暂时阻止所有入站流量)。

基于上下文的限制仅适用于应用程序和功能,因为这些工作负载会暴露网络端点。 基于上下文的限制不适用于作业和车队,因为它们没有暴露任何网络端点。

利用基于上下文的限制来保护 Code Engine 资源时,除了利用基于上下文的规则限制连接到应用程序或功能的入站流量外,还可以对 限制 Code Engine 资源的上下文(网络路径) 进行管理,如部署或更新应用程序和机密。

Code Engine 基于上下文的限制可针对单个项目、整个资源组或某个位置(区域)。 有关 IBM Cloud 基于上下文的限制的更多信息,请参阅 《 基于上下文的限制的分层安全机制 》。

当基于上下文的限制规则涵盖一个资源组或一个位置(区域)时,该限制适用于现有项目。 如果在同一位置或资源组中创建新项目,限制会自动应用到新项目。 新项目与限制关联可能需要几分钟时间。 要观察 CBR 规则的应用情况,请查看用户界面、CLI 或 API 中的项目状态连接部分。

为 Code Engine 资源创建基于上下文的限制

您可以使用 IBM Cloud 控制台、CLI、API、SDK 或 Terraform 为 Code Engine 资源创建基于上下文的限制。 有关创建基于上下文的限制的更多信息,请参阅 创建基于上下文的限制。 以下各节提供了为 Code Engine 应用程序和功能创建限制的具体指导。

IPv6 Code Engine 不支持限制。

使用控制台添加基于上下文的限制

要创建基于上下文的限制,请参阅 创建基于上下文的限制。 以下是为 Code Engine 资源创建资源的具体步骤。

  1. 转到 "基于上下文的限制 规则 "页面。

  2. 单击创建为基于上下文的限制创建新规则,从服务开始。

  3. 选择 Code Engine****服务,然后单击“下一步”选择要保护的服务 API。

  4. 通过选择服务 API 的数据平面选项来限制访问以保护您的 Code Engine 应用程序或功能工作负载。

    您可以在数据平面级别定义工作负载限制,因此至少要选择数据平面服务。 您还可以选择其他服务或平台 API。

    单击“下一步”设置资源限制范围。

  5. 将限制应用于单个项目、整个资源组或有多个项目的位置(区域)。 在“资源”部分应用此范围,然后单击“审核”继续。

  6. 单击“继续”为规则添加上下文。

  7. 配置上下文以定义哪些端点受到限制。 根据您的安全要求从以下方案中选择一种:

    • 用例 A:完全阻止公众入站

      使用这种用例,可以使您的应用程序和功能只能通过其专用端点访问,从而消除网络层面的公共互联网访问。

      1. 将端点设置为开启。
      2. 选择专用 (允许流量)。
      3. 不选择“公共”(阻止流量)。
      4. 网络区留空。 确保本部分未启用任何网络区域,以便所有专用端点仍可访问。
      5. 点击 “添加” 以创建一个新上下文。
    • 用例 B:通过 IP 阻止公开并限制私有

      使用此用例可通过阻止所有公共互联网访问并将私人终端访问限制在特定 IP 地址或网络区域内,从而实现最大程度的控制。

      1. 将端点设置为开启。
      2. 选择专用 (允许流量)。
      3. 不选择“公共”(阻止流量)。
      4. 选择要允许私人访问的网络区域(例如,特定 VPC 或 IP 范围)。
      5. 点击 “添加” 以创建一个新上下文。
    • 用例 C:完全隔离工作负载

      使用此用例,可通过阻止私人和公共端点,在网络层面完全隔离应用程序和功能。 这对于只进行出站连接的批处理工作负载、只通过消息队列或事件进行通信的内部微服务或正在进行维护的工作负载非常有用。

      1. 将 “端点” 保持为“关闭”状态(不要添加任何端点上下文)。
      2. 不添加上下文,直接点击 “继续”。

      在您确认之前,控制台会显示以下警告:

      未添加上下文。 您的规则将在没有上下文的情况下应用,从而产生完全限制的规则,阻止所有访问。 当您想要保护资源并且不确定要允许的访问权时,这是有益的。 要继续吗?

      注意:必须删除、禁用或更新此规则(至少指定一个上下文),才能允许访问您的资源。

      点击“确认”以保存该规则。 没有上下文的规则将拒绝该项目的一切入站访问。

  8. 单击“继续”提供规则详细信息。

  9. 请为您的规则提供描述。

  10. 选择已启用 执行。

  11. 查看摘要,然后点击 “创建”。

使用 CLI 添加基于上下文的限制

您可以使用 IBM Cloud CLI 为 Code Engine 资源创建基于上下文的限制。 开始之前,请运行 ibmcloud plugin install cbr,确保已 安装 IBM Cloud CLI 和基于上下文的限制插件。

基于上下文的限制规则可以覆盖单个项目、整个资源组、某个位置(区域)或整个账户。 示例中显示的 --service-instance 标志将该规则的作用范围限定在特定项目内。 若要将范围限定为资源组,请使用 --resource-group-id <resource-group-id>。 若要限定到某个位置(区域),请使用 --resource-attributes "region=<region>"。 若要将该规则应用于整个账户,请省略这三个标志。

以下示例将该规则的范围限定为一个名为 my-project 的项目。 要查找您的项目 ID,请运行 ibmcloud ce project get --name my-project --output json | grep guid。 若要将范围限定为某个资源组,请将 --service-instance my-project-id 替换为 --resource-group-id <resource-group-id>。 若要限定为某个位置(区域),请将其替换为 --resource-attributes "region=<region>"。 若要将该规则应用于整个账户,请完全省略该标志。

  • 用例 A:完全阻止公众入站

    使用这种用例,可以使您的应用程序和功能只能通过其专用端点访问,从而消除网络层面的公共互联网访问。

    创建一条允许私人访问并阻止公共访问的规则:

    ibmcloud cbr rule-create --description "Block public inbound entirely" \
    --service-name codeengine \
    --service-instance my-project-id \
    --api-types crn:v1:bluemix:public:context-based-restrictions::::api-type:data-plane \
    --context-attributes endpointType=private
    
  • 用例 B:通过 IP 阻止公开并限制私有

    使用此用例可通过阻止所有公共互联网访问并将私人终端访问限制在特定 IP 地址或网络区域内,从而实现最大程度的控制。 要查找可用的区域 ID,请运行 ibmcloud cbr zones。

    创建一条规则,限制私人访问特定区域,阻止公众访问:

    ibmcloud cbr rule-create --description "Block public and restrict private by IP" \
    --service-name codeengine \
    --service-instance my-project-id \
    --api-types crn:v1:bluemix:public:context-based-restrictions::::api-type:data-plane \
    --context-attributes endpointType=private,networkZoneId=<zone-id>
    
  • 用例 C:完全隔离工作负载

    使用此用例,可通过阻止私人和公共端点,在网络层面完全隔离应用程序和功能。 这对于只进行出站连接的批处理工作负载、只通过消息队列或事件进行通信的内部微服务或正在进行维护的工作负载非常有用。

    要阻止所有传入流量,请使用 --empty-context-list 标志创建一条上下文列表为空的规则。 没有上下文的规则将拒绝该项目的一切入站访问。

    ibmcloud cbr rule-create --description "Isolate workloads entirely" \
    --service-name codeengine \
    --service-instance my-project-id \
    --api-types crn:v1:bluemix:public:context-based-restrictions::::api-type:data-plane \
    --empty-context-list
    

测试基于上下文的入站连接限制规则

创建基于上下文的限制规则后,可以使用应用程序或函数对其进行测试:

  • 如果您阻止了公共端点:尝试通过公共 URL 访问应用程序或函数时,会出现 RBAC Access Denied 错误信息。 您的工作负载仍可通过专用端点(来自 VPC 或同一项目中的其他 Code Engine 组件)进行访问。

  • 如果您通过 IP 限制了专用端点:通过专用端点的访问只能授予允许列表中的网络区域或 IP 地址。 如果请求来自未列入允许列表的来源,则会显示 RBAC Access Denied 错误信息。 例如,如果您只允许 9.9.9.9/32,那么您的应用程序或功能只能通过专用端点从该 IP 范围访问。 任何超出该范围的内容都会出现错误信息。

如果选择了指向 VPC(虚拟私有云)的网络区域,还必须创建一个 VPE(虚拟私有端点)网关,以允许 VPC 访问私有工作负载。 创建网关后,由于 PDNS 解析的原因,可能会出现暂时的延迟。 一开始,您可能会看到 RBAC Access Denied 错误信息,但过一段时间后,您就会获得访问权限。