跳到主要内容
版本:3.7.x

在 Kubernetes Secret 中引用密钥

Kubernetes Secrets 是用于存储密码、API 密钥和令牌等敏感数据的对象。这些密钥可以作为环境变量暴露给 Pod,或作为 Secret 提供商集成以增强 API 安全性。

本教程演示如何将 API7 企业版与 Kubernetes 集成作为Secret 提供商,使您能够安全地存储和引用消费者凭据及插件配置。

前提条件​

  1. 安装 API7 企业版
  2. 网关组中至少有一个网关实例
  3. 准备用于存储密钥的 Kubernetes 集群
  4. 安装 cURL 用于服务验证

在网关组中新增 Secret 提供商​

  1. 从侧边栏选择网关组的 Secret 提供商,点击 新增 Secret 提供商。
  2. 在对话框中:
    • Secret 提供商 ID 输入 my-kubernetes-secret。
    • 密钥管理器 选择 Kubernetes。
    • 填写 API 服务器地址 如 http://127.0.0.1。
    • 填写 Token。
    • 点击新增。
  3. 复制 密钥变量 供后续使用,所有密钥引用都基于此生成,例如:$secret://kubernetes/my-kubernetes-secret/$namespace/$secret_name/$key。

为 SSL 证书引用密钥​

SSL 证书对象中的敏感字段 certificate 和 private key 可以安全地存储在外部密钥管理器 (如 HashiCorp Vault、 AWS Secret Manager 或 Kubernetes Secret) 中,并在 API7 网关中引用。

存储密钥​

创建 ssl-secret.yaml 文件:

apiVersion: v1
kind: Secret
metadata:
namespace: default
name: ssl
type: kubernetes.io/tls
data: # 必须使用 base64 编码值
tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNVakNDQWJzQ0FnMytNQTBHQ1NxR1NJYjNE
UUVCQlFVQU1JR2JNUXN3Q1FZRFZRUUdFd0pLVURFT01Bd0cKQTFVRUNCTUZWRzlyZVc4eEVEQU9C
Z05WQkFjVEIwTm9kVzh0YTNVeEVUQVBCZ05WQkFvVENFWnlZVzVyTkVSRQpNUmd3RmdZRFZRUUxF
dzlYWldKRFpYSjBJRk4xY0hCdmNuUXhHREFXQmdOVkJBTVREMFp5WVc1ck5FUkVJRmRsCllpQkRR
VEVqTUNFR0NTcUdTSWIzRFFFSkFSWVVjM1Z3Y0c5eWRFQm1jbUZ1YXpSa1pDNWpiMjB3SGhjTk1U
TXcKTVRFeE1EUTFNVE01V2hjTk1UZ3dNVEV3TURRMU1UTTVXakJMTVFzd0NRWURWUVFHREFKS1VE
RVBNQTBHQTFVRQpDQXdHWEZSdmEzbHZNUkV3RHdZRFZRUUtEQWhHY21GdWF6UkVSREVZTUJZR0Ex
VUVBd3dQZDNkM0xtVjRZVzF3CmJHVXVZMjl0TUlHYU1BMEdDU3FHU0liM0RRRUJBUVVBQTRHSUFE
Q0JoQUo5WThFaUhmeHhNL25PbjJTbkkxWHgKRHdPdEJEVDFKRjBReTliMVlKanV2YjdjaTEwZjVN
Vm1UQllqMUZTVWZNOU1vejJDVVFZdW4yRFljV29IcFA4ZQpqSG1BUFVrNVd5cDJRN1ArMjh1bklI
QkphVGZlQ09PekZSUFY2MEdTWWUzNmFScG04L3dVVm16eGFLOGtCOWVaCmhPN3F1TjdtSWQxL2pW
cTNKODhDQXdFQUFUQU5CZ2txaGtpRzl3MEJBUVVGQUFPQmdRQU1meTQzeE15OHh3QTUKVjF2T2NS
OEtyNWNaSXdtbFhCUU8xeFEzazlxSGtyNFlUY1JxTVQ5WjVKTm1rWHYxK2VSaGcwTi9WMW5NUTRZ
RgpnWXcxbnlESnBnOTduZUV4VzQyeXVlMFlHSDYyV1hYUUhyOVNVREgrRlowVnQvRGZsdklVTWRj
UUFEZjM4aU9zCjlQbG1kb3YrcE0vNCs5a1h5aDhSUEkzZXZ6OS9NQT09Ci0tLS0tRU5EIENFUlRJ
RklDQVRFLS0tLS0K
tls.key: RXhhbXBsZSBkYXRhIGZvciB0aGUgVExTIGNydCBmaWVsZA==

应用到 Kubernetes 集群:

kubectl apply -f ssl-secret.yaml

新增 SSL 证书​

  1. 从侧边栏选择网关组的 证书,进入 SSL 证书 标签页。

  2. 点击 新增 SSL 证书。

  3. 在对话框中:

    • 名称 输入 测试 SSL 证书。
    • 证书 输入 $secret://kubernetes/my-kubernetes-secret/default/ssl/tls.crt。
    • 私钥 输入 $secret://kubernetes/my-kubernetes-secret/default/ssl/tls.key。
    • 点击新增。
  4. 完整使用和验证 SSL 证书,参见 配置客户端与 API7 网关间的 mTLS

为消费者凭据引用密钥​

以下消费者凭据中的敏感字段可存储在外部密钥管理器中:

  • 密钥认证凭据中的 key
  • 基础认证凭据中的 password
  • JWT 认证凭据中的 secret、public key
  • HMAC 认证凭据中的 secret key

新增消费者​

  1. 从侧边栏选择网关组的 消费者。
  2. 点击 新增消费者。
  3. 在对话框中:
    • 名称 输入 Alice。
    • 点击新增。

存储密钥​

创建 alice-secret.yaml 文件:

apiVersion: v1
kind: Secret
metadata:
namespace: default
name: alice
type: Opaque
stringData: # 必须使用 base64 编码值
key: alice-key # 用于密钥认证
password: alice-password # 用于基础认证
secret: alice-secret # 用于 JWT 凭据
secret-key: alice-secret-key # 用于 HMAC 认证

应用到 Kubernetes 集群:

kubectl apply -f alice-secret.yaml

新增密钥认证凭据​

  1. 从侧边栏选择网关组的 消费者。
  2. 选择目标消费者如 Alice。
  3. 在 认证凭据 标签页点击 新增密钥认证凭据。
  4. 在对话框中:
    • 名称 输入 primary-key。
    • 密钥 输入 $secret://kubernetes/my-kubernetes-secret/default/alice/key。
    • 点击新增。

新增基础认证凭据​

  1. 从侧边栏选择网关组的 消费者。
  2. 选择目标消费者如 Alice。
  3. 在 认证凭据 标签页的 基础认证 子标签下点击 新增基础认证凭据。
  4. 在对话框中:
    • 名称 输入 primary-basic。
    • 用户名 输入 Alice。
    • 密码 输入 $secret://kubernetes/my-kubernetes-secret/default/alice/password。
    • 点击新增。

新增 JWT 认证凭据​

  1. 从侧边栏选择网关组的 消费者。
  2. 选择目标消费者如 Alice。
  3. 在 认证凭据 标签页的 JWT 子标签下点击 新增 JWT 凭据。
  4. 在对话框中:
    • 名称 输入 primary-jwt。
    • 密钥 输入 alice-key。
    • 算法 选择 HS256。
    • 密钥 输入 $secret://kubernetes/my-kubernetes-secret/default/alice/secret。
    • 点击新增。

新增 HMAC 认证凭据​

  1. 从侧边栏选择网关组的 消费者。
  2. 选择目标消费者如 Alice。
  3. 在 认证凭据 标签页的 HMAC 认证 子标签下点击 新增 HMAC 认证凭据。
  4. 在对话框中:
    • 名称 输入 primary-hmac。
    • 密钥 ID 输入 alice-keyid。
    • 密钥 输入 $secret://kubernetes/my-kubernetes-secret/default/alice/secret-key。
    • 点击新增。

验证消费者凭据​

验证密钥认证​

参见 为 API 启用密钥认证,在服务级别启用 Key Auth 插件。

然后按照 验证密钥认证 操作。

验证基础认证​

参见 为 API 启用基础认证,在服务级别启用 Basic Auth 插件。

然后按照 验证基础认证 操作。

验证 JWT 认证​

参见 为 API 启用 JWT 认证,在服务级别启用 JWT Auth 插件。

然后按照 验证 JWT 认证 操作。

验证 HMAC 认证​

参见 为 API 启用 HMAC 认证,在服务级别启用 HMAC Auth 插件。

然后按照 验证 HMAC 认证 操作。

为插件启用引用密钥​

以下插件配置中的敏感字段可存储在外部密钥管理器中:

插件字段
Limit Countredis_username, redis_password
Authz-Casdoorclient_id, client_secret
Wolf RBACappid
LDAP 认证user_dn

本节以配置 Limit Count 插件 为例。

存储密钥​

创建 redis-secret.yaml 文件:

apiVersion: v1
kind: Secret
metadata:
namespace: default
name: redis
type: Opaque
stringData:
username: YXBpNw==
password: cmVkaXMtYXBpNw==

应用到 Kubernetes 集群:

kubectl apply -f redis-secret.yaml

配置 Limit Count 插件​

关于如何启用 Limit Count 插件,参见 对 API 应用速率限制。

在 JSON 编辑器 中新增以下配置:

{
"count": 3,
"time_window": 60,
"key_type": "var",
"rejected_code": 429,
"rejected_msg": " 请求过多 ",
"key": "remote_addr",
"policy": "redis",
"redis_host": "127.0.0.1",
"redis_port": 6379,
"redis_username": "$secret://kubernetes/my-kubernetes-secret/default/redis/username",
"redis_password": "$secret://kubernetes/my-kubernetes-secret/default/redis/password",
"redis_database": 1,
"redis_timeout": 1001,
"allow_degradation": false,
"show_limit_quota_header": true
}

附加资源​