跳到主要内容
版本: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 证书对象中的敏感字段 certificateprivate 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 认证凭据中的 secretpublic 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
}

附加资源