IBM Cloud Docs
基于上下文的限制方案示例

基于上下文的限制方案示例

通过基于上下文的限制,帐户所有者和管理员可以根据访问请求的上下文来定义和实施 IBM Cloud® 资源的访问限制。 可以使用基于上下文的限制以及身份和访问管理策略来控制对 Red Hat OpenShift on IBM Cloud 资源的访问。 有关更多信息,请参阅 使用基于上下文的限制保护 Red Hat OpenShift on IBM Cloud 资源

在Red Hat OpenShift on IBM Cloud集群上运行的应用程序(例如由Kubernetes LoadBalancer,公开的网络服务器)不受 CBR 规则的限制。

了解方案

在此示例场景中,您使用基于上下文的限制来限制集群的流量,方法是仅允许单个 IP 地址通过公用网络连接到 cluster API,同时仍允许所有专用流量。

在以下步骤中,首先创建包含单个 IP 地址的网络区域或允许列表。 然后,为集群创建基于上下文的限制规则,该规则允许所有专用网络访问,并允许列出包含单个 IP 地址的网络区域。 创建规则时,将其与包含单个 IP 地址的网络区域相关联。

先决条件

在开始本教程之前,请确保您已创建或安装了以下资源和工具。

创建网络区域

访问 Red Hat OpenShift 集群

  1. 运行以下示例命令以创建仅包含一个要使用的客户机 IP 的网络。

    ibmcloud cbr zone-create --addresses 129.XX.XX.XX --description "Allow only client IP" --name allow-client-ip
    
  2. 验证是否已创建网络区域。

    ibmcloud cbr zones
    

创建 CBR 规则

  1. 创建网络区域 (允许列表) 后,创建 CBR 规则并添加您在上一步中创建的网络区域。 以下示例创建使用 cluster API 类型的规则。 将 NETWORK-ZONE-ID 替换为您在步骤 1 中创建的 allow-client-ip 网络区域的标识。

    ibmcloud cbr rule-create --api-types crn:v1:bluemix:public:containers-kubernetes::::api-type:cluster --description "privateAccess=allowAll, publicAccess=oneIP" --service-name containers-kubernetes --service-instance CLUSTER-ID --context-attributes endpointType=private --context-attributes endpointType=public,networkZoneId=NETWORK-ZONE-ID
    

    了解命令选项。

    --api-types crn:v1:bluemix:public:containers-kubernetes::::api-type:cluster
    crn:v1:bluemix:public:containers-kubernetes::::api-type:cluster API 设置为仅允许您先前创建的网络区域中的资源仅访问 cluster API,其中包括用于各种 oc 命令的 API。
    --service-instance CLUSTER-ID
    将规则的作用域限定为单个集群,以便只有先前创建的网络区域中的资源才能访问 CLUSTER-ID
    --context-attributes endpointType=private
    在不关联网络区域的情况下设置上下文属性 endpointType=private 将允许所有到集群的专用流量。
    --context-attributes endpointType=public,networkZoneId=all-client-ip
    设置上下文属性 endpointType=public 并关联先前创建的 networkZoneId=allow-client-ip,以仅允许 allow-client-ip 区域中的资源通过公用网络访问集群。
  2. 验证已创建规则。

    ibmcloud cbr rules
    

测试基于上下文的限制

要测试基于上下文的限制设置,您可以尝试在公用网络上通过除您在网络区域中列出的单个 IP 地址以外的 IP 地址来调用集群的集群 API,例如通过列出 pod。 通过此设置,允许所有专用连接,而只有网络区域中的单个 IP 地址可以通过公用网络连接到集群 API。

其他方案

现在,您已创建简单的 CBR 网络区域和规则,请查看以下更高级的示例,以进一步控制对 Red Hat OpenShift on IBM Cloud 资源的访问。

允许不同的 IP 访问公共和专用服务端点

在此场景中,您允许不同的 IP 地址或 CIDR 通过为每个 IP 地址创建单独的网络区域来访问 Red Hat OpenShift on IBM Cloud 集群的公共和专用服务端点。 然后,创建允许每个网络区域访问公共或专用服务端点的规则。

  1. 为公共 IP 地址或 CIDR 创建网络区域,为要允许访问 Red Hat OpenShift on IBM Cloud 集群的专用 IP 地址或 CIDR 创建另一个网络区域。

    用于创建称为 public-IP-zoneprivate-IP-zone 的单独网络区域的示例命令。 在此示例中,每个区域都包含多个 IP 地址或 CIDR (以逗号分隔),您希望允许这些 IP 地址或 CIDR 访问集群。

    ibmcloud cbr zone-create --addresses 1.2.3.4,12.12.12.0/24 --description "Allowed Public IP Addresses Zone" --name "public-ip-zone"
    
    ibmcloud cbr zone-create --addresses 10.20.20.20,10.10.10.0/24 --description "Allowed Private IP Addresses Zone" --name "private-ip-zone"
    
  2. 获取您在上一步中创建的 private-ip-zonepublic-ip-zone 区域的标识。

    ibmcloud cbr zones
    
  3. 创建一个规则,该规则允许 private-ip-zone 连接到集群的专用服务端点,并且还允许 public-ip-zone 仅连接到集群的公共服务端点。 此规则适用于使用 --service-instance 选项指定的集群。 如果要将规则应用于帐户中的所有集群,请不要指定集群。

    ibmcloud cbr rule-create --context-attributes "endpointType=public,networkZoneId=PUBLIC-IP-ZONE-ID" --context-attributes "endpointType=private,networkZoneId=PRIVATE-IP-ZONE-ID" --description "Separate private and public IPs for cluster and management rule" --service-name containers-kubernetes --service-instance CLUSTER-ID
    

允许不同的 IP 通过公共和专用服务端点访问不同的 API 类型

与前一种情况类似,在这种情况下,您允许不同的 IP 地址访问 Red Hat OpenShift on IBM Cloud 集群的公共或私有服务端点。 但是,在此场景中,clustermanagement API 的特定 API 类型进一步限制了访问权。 有关 API 类型的更多信息,请参阅 保护特定 API

  1. 创建四个网络区域,每个网络区域一个用于您希望允许访问公共或专用 cluster API 或公共或专用 management API 的 IP 地址。 请注意,您可以包含多个要允许访问集群的 IP 地址或 CIDR (以逗号分隔)。

    ibmcloud cbr zone-create --addresses 1.2.3.4,12.12.12.0/24 --description "Allowed Public IP Addresses for IKS and ROKS APIs" --name "public-mgmt-zone"
    
    ibmcloud cbr zone-create --addresses 10.20.20.20,10.10.10.0/24 --description "Allowed Private IP Addresses IKS and ROKS APIs" --name "private-mgmt-zone"
    
    ibmcloud cbr zone-create --addresses 11.11.11.0/24 --description "Allowed Public IP Addresses for cluster apiserver" --name "public-cluster-zone"
    
    ibmcloud cbr zone-create --addresses 10.30.30.30 --description "Allowed Private IP Addresses for cluster apiserver" --name "private-cluster-zone"
    
  2. 获取您在上一步中创建的区域的标识。

    ibmcloud cbr zones
    

    示例输出

    OK
    id                                 name                   address_count   
    c14c0839c13d8aa0afa8383e2be2e124   public-mgmt-zone       2   
    f9676ca6ef37685315fa254b89d73159   public-cluster-zone    1   
    c14c0839c13d8aa0afa8383e2be2e843   private-cluster-zone   1   
    b53353de929de39ac2381f9b4cde8507   private-mgmt-zone      2
    
  3. 通过使用先前创建的区域,创建用于保护对公共和专用 clustermanagement API 的访问权的规则。

    ibmcloud cbr rule-create --api-types crn:v1:bluemix:public:containers-kubernetes::::api-type:management --context-attributes "endpointType=public,networkZoneId=PUBLIC-MGMT-ZONE-ID" --context-attributes "endpointType=private,networkZoneId=PRIVATE-MGMT-ZONE-ID" --description "Separate private and public IPs for the management APIs" --service-name containers-kubernetes
    
    ibmcloud cbr rule-create --api-types crn:v1:bluemix:public:containers-kubernetes::::api-type:cluster --context-attributes "endpointType=public,networkZoneId=PUBLIC-CLUSTER-ZONE-ID" --context-attributes "endpointType=private,networkZoneId=PRIVATE-CLUSTER-ZONE-ID" --description "Separate private and public IPs for cluster APIs" --service-name containers-kubernetes