启用安全和配额强制执行

本页面适用于 ApigeeApigee Hybrid

查看 Apigee Edge 文档。

本页介绍了如何启用 Apigee Operator for Kubernetes 提供的默认安全性和配额强制执行选项。

准备工作

在开始此任务之前,请务必完成以下步骤:

无论您是使用 ApigeeBackendService 还是 APIMExtensionPolicy 为 GKE 网关创建流量服务扩展程序,都必须完成本演练中的步骤,才能启用添加到后端 APIMExtensionPolicy 的默认 API 密钥和配额政策。

所需的角色

如果您已按照安装适用于 Kubernetes 的 Apigee Operator 中所述的方式向服务账号分配了所需的角色,则无需额外的 IAM 角色或权限即可完成这些任务。

您可以选择使用 Kubernetes 中内置的基于角色的访问控制 (RBAC) 机制对 Google Kubernetes Engine 集群中的资源执行的操作授权。如需了解详情,请参阅使用基于角色的访问控制对集群中执行的操作授权

概览

以下部分介绍了如何启用 Apigee Operator for Kubernetes 提供的默认安全和配额强制执行选项。 在本演示中,您将执行以下操作:

  1. 定义 API 产品
  2. 定义 API 操作集
  3. 测试 Apigee 服务扩展程序
  4. 在 Google Cloud 控制台中查看 Apigee API Analytics 数据。

定义 API 产品和 API 操作集所需的步骤略有不同,具体取决于您是使用 ApigeeBackendService 还是 APIMExtensionPolicy 为 GKE 网关创建流量扩展程序。

定义 API 产品

在此步骤中,您将定义用于管理 API 密钥强制执行和配额政策的 API 产品。

使用 APIMExtensionPolicy

定义 API 产品:

  1. apim 命名空间中创建一个名为 api-product.yaml 的新文件。
  2. 将以下内容复制到新文件中:
    # api-product.yaml
      apiVersion: apim.googleapis.com/v1
      kind: APIProduct
      metadata:
        name: api-product
        namespace: apim
      spec:
        approvalType: auto
        description: Http bin GET calls
        displayName: api-product
        enforcementRefs:
          - name: global-ext-lb1-apim-policy
            kind: APIMExtensionPolicy
            group: apim.googleapis.com
            namespace: apim
        attributes:
          - name: access
            value: private
  3. 使用以下命令将文件应用于网关:
    kubectl -n apim apply -f api-product.yaml

使用 ApigeeBackendService

定义 API 产品:

  1. apim 命名空间中创建一个名为 api-product.yaml 的新文件。
  2. 将以下内容复制到新文件中:
    # api-product.yaml
      apiVersion: apim.googleapis.com/v1
      kind: APIProduct
      metadata:
        name: api-product
        namespace: apim
      spec:
        approvalType: auto
        description: Http bin GET calls
        displayName: api-product
        enforcementRefs:
          - name: global-ext-lb1-apim-policy
            kind: ApigeeBackendService
            group: apim.googleapis.com
            namespace: default
        attributes:
          - name: access
            value: private
  3. 使用以下命令将文件应用于网关:
    kubectl -n default apply -f api-product.yaml

定义 API 操作集

在此步骤中,您将定义用于管理 REST 操作强制执行的 API 操作集。

使用 APIMExtensionPolicy

为在上一步中创建的 API 产品定义 API 操作集:

  1. apim 命名空间中创建一个名为 apim-policies.yaml 的新文件。
  2. 将以下内容复制到新文件中。此文件定义了上一步中所定义 API 产品的配额政策以及可用 REST 操作:
    # apim-policies.yaml
      apiVersion: apim.googleapis.com/v1
      kind: APIOperationSet
      metadata:
        name: item-set
        namespace: apim
      spec:
        apiProductRefs:
          - name: api-product
            kind: APIProduct
            group: apim.googleapis.com
            namespace: apim
        quota:
          limit: 10
          interval: 1
          timeUnit: minute
        restOperations:
          - name: GetItems
            path: /get
            methods:
              - GET
  3. 将该文件应用于网关:
    kubectl -n apim apply -f apim-policies.yaml

使用 ApigeeBackendService

为在上一步中创建的 API 产品定义 API 操作集:

  1. default 命名空间中创建一个名为 apim-policies.yaml 的新文件。
  2. 将以下内容复制到新文件中。此文件定义了上一步中所定义 API 产品的配额政策以及可用 REST 操作:
    # apim-policies.yaml
      apiVersion: apim.googleapis.com/v1
      kind: APIOperationSet
      metadata:
        name: item-set
        namespace: default
      spec:
        apiProductRefs:
          - name: api-product
            kind: APIProduct
            group: apim.googleapis.com
            namespace: default
        quota:
          limit: 10
          interval: 1
          timeUnit: minute
        restOperations:
          - name: GetItems
            path: /get
            methods:
              - GET
  3. 将该文件应用于网关:
    kubectl -n default apply -f apim-policies.yaml

测试 Apigee 服务扩展程序

在此步骤中,您将使用 Google Cloud 控制台中的 Apigee 界面来测试应用于网关的 Apigee 服务扩展程序和 Apigee 扩展程序政策。

测试设置

设置您需要用于测试的 API 资源:

  1. 前往 Google Cloud 控制台中的 Apigee API Management 页面:

    Apigee API Management

  2. 选择您安装 Apigee Operator for Kubernetes 的 Apigee 组织。
  3. 创建开发者:
    1. 依次选择分发 > 开发者
    2. 开发者页面上,点击 + 创建
    3. 添加开发者页面中,使用您希望使用的任何值填写必填字段。
    4. 点击添加
  4. 创建应用:
    1. 依次选择分发> 应用
    2. 应用页面上,点击 + 创建
    3. 创建应用页面上,使用以下值填充应用详情部分中的必填字段:
      • 应用名称:demo-app
      • 开发者:选择您在上一步创建的开发者,或从列表中选择其他开发者。
    4. 应用凭据部分,点击 + 添加凭据
    5. 凭据部分,使用以下值填写凭证详细信息部分的必填字段:
      • 凭据名称:demo-credential
      • 凭据类型:选择 API 密钥
    6. 点击创建
    7. 产品部分中,点击 + 添加产品
    8. 选择上一步创建的 api-product-1
    9. 点击添加
    10. 点击创建
  5. 应用详情页面的凭据部分中,点击 以显示密钥的值。

    复制 Key 值。您将在后续步骤中使用此密钥对您的服务执行 API 调用。

  6. 应用详情页面的凭证部分中,点击 以显示应用密钥的值。

    复制应用 Secret 值。您将在后续步骤中使用此值生成访问令牌。

测试 API 密钥强制执行

使用以下命令,使用前面步骤中获取的 API 密钥向网关发送请求:

curl http://GATEWAY_IP_ADDRESS/get -H "Host: HOST_NAME" -H "x-api-key: API_KEY"

其中:

  • GATEWAY_IP_ADDRESS 是网关的 IP 地址。您可以使用以下命令检索网关 IP 地址,其中 GATEWAY_NAME 是网关的名称:
    kubectl get gateways.gateway.networking.k8s.io GATEWAY_NAME -o=jsonpath="{.status.addresses[0].value}"
  • HOST_NAME 是网关的 HTTPRoute 中定义的主机名。
  • API_KEY 是在测试设置中获取的 API 密钥值。

该请求应该会成功,并返回类似于以下内容的响应:

{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Host": "apigee-apim-operator-test.apigee.net",
    "User-Agent": "curl/8.7.1",
    "X-Api-Key": "f0N6sYYYclGYYYe0oP5YYYdA20PjgrP2x8YYYh7z4YYYKiYt",
    "X-Cloud-Trace-Context": "bb3a768787099bda628781188bfb318b/15554891713516675739"
  },
  "origin": "34.54.193.72",
  "url": "https://34.54.193.72/get"
}

测试配额强制执行

如需测试 APIMExtensionPolicy 中定义的配额强制执行,请在 1 分钟内向网关发送上一步中的请求 10 次。

您可以运行以下脚本来生成请求:

#!/bin/sh
for i in $(seq 1 11); do
    curl http://GATEWAY_IP_ADDRESS/get -H "Host: HOST_NAME" -H "x-api-key: API_KEY"
    sleep 1
done

其中:

  • GATEWAY_IP_ADDRESS 是网关的 IP 地址。您可以使用以下命令检索网关 IP 地址,其中 GATEWAY_NAME 是网关的名称:
    kubectl get gateways.gateway.networking.k8s.io GATEWAY_NAME -o=jsonpath="{.status.addresses[0].value}"
  • HOST_NAME 是网关的 HTTPRoute 中定义的主机名。
  • API_KEY 是在测试设置中获取的 API 密钥值。

此操作应触发配额违规,并引发类似于以下内容的错误:

{"fault":{"faultstring":"Rate limit quota violation. Quota limit  exceeded. Identifier : _default","detail":{"errorcode":"policies.ratelimit.QuotaViolation"}}}

测试 REST 操作强制执行

如需测试 REST 操作强制执行,请使用以下命令,使用不在 API 操作集中的网址向网关发送请求:

curl http://GATEWAY_IP_ADDRESS/post -H "Host: HOST_NAME" -H "x-api-key: API_KEY"

其中:

  • GATEWAY_IP_ADDRESS 是网关的 IP 地址。您可以使用以下命令检索网关 IP 地址,其中 GATEWAY_NAME 是网关的名称:
    kubectl get gateways.gateway.networking.k8s.io GATEWAY_NAME -o=jsonpath="{.status.addresses[0].value}"
  • HOST_NAME 是网关的 HTTPRoute 中定义的主机名。
  • API_KEY 是在测试设置中获取的 API 密钥值。

请求应该会失败,并返回类似于以下内容的响应:

{"fault":{"faultstring":"Invalid ApiKey for given resource","detail":{"errorcode":"oauth.v2.InvalidApiKeyForGivenResource"}}}

在 Google Cloud 控制台中查看 Apigee API Analytics

您可以在 Google Cloud 控制台中使用 Apigee API Analytics 查看 GKE 网关和 APIMExtensionPolicy 处理的 API 流量:

  1. 前往 Google Cloud 控制台中的 Apigee API Management 页面:

    Apigee API Management

  2. 选择您安装了 Apigee Operator for Kubernetes 的 Apigee 组织。
  3. 在侧边导航菜单中,依次选择分析 > API 指标
  4. API 代理性能标签页中,选择您在可选安装步骤 创建 Apigee 环境中创建的环境,或者选择 Apigee Operator for Kubernetes 在安装期间创建的环境。环境的名称将以前缀 apigee-ext-proc-enabled-env 开头。
  5. 观察记录的 API 流量。

问题排查

如果您在将 API 管理政策与 Apigee Operator for Kubernetes 搭配使用时遇到问题,请参阅排查 Apigee Operator for Kubernetes 问题,了解常见错误的解决方案。

后续步骤

如需添加其他政策,请参阅向 GKE 网关添加政策