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

引用 Kubernetes Secret 中的密钥

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

本教程演示了如何将 API7 企业版与 Kubernetes 作为密钥提供商进行集成,使你能够从 Kubernetes secrets 中安全地存储和引用消费者凭证及插件配置。如果你使用的是 Ingress Controller,则无需将 Kubernetes 添加为密钥提供商即可使用 Kubernetes Secrets。

前置条件​

  1. 安装 API7 企业版。
  2. 在你的网关组中至少有一个网关实例。
  3. 准备你的 Kubernetes 集群以存储 secrets。
  4. 安装 cURL 以向服务发送请求进行验证。

在网关组中添加密钥提供商​

  1. 从侧边导航栏选择你的网关组下的 Secret 提供商,然后点击 新增 Secret 提供商。
  2. 在弹出的对话框中,执行以下操作:
  • 在 Secret 提供商 ID 字段中,输入 my-kubernetes-secret。
  • 在 Secret 管理服务 字段中,选择 Kubernetes。
  • 填写 API 服务器地址 字段。例如:http://127.0.0.1。
  • 填写 令牌 字段。
  • 点击 新增。
  1. 复制 Secret 变量 以供将来引用。所有密钥引用均由此生成,例如:$secret://kubernetes/my-kubernetes-secret/$namespace/$secret_name/$key。

引用 SSL 证书的密钥​

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

存储密钥​

为 SSL secret 创建一个 Kubernetes 资源清单文件:

ssl-secret.yaml
apiVersion: v1
kind: Secret
metadata:
namespace: api7
name: my-kubernetes-secret
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. 在弹出的对话框中,执行以下操作:
  • 在 名称字段中,输入 Test SSL Certificate。
  • 在 证书字段中,输入 $secret://kubernetes/my-kubernetes-secret/api7/ssl/tls.crt。
  • 在 私钥字段中,输入 $secret://kubernetes/my-kubernetes-secret/api7/ssl/tls.key。
  • 点击 新增。
  1. 想要全面使用和验证 SSL 证书,请参阅在客户端与 API7 网关之间配置 mTLS。

引用密钥创建消费者凭证​

消费者凭证中的以下敏感字段可存储在外部密钥管理器(HashiCorp Vault、AWS Secret 管理服务 或 Kubernetes Secret)中并在 API7 网关中引用:

  • 密钥认证(Key Authentication)凭证中的 key
  • 基本认证(Basic Authentication)凭证中的 password
  • JWT 认证凭证中的 secret 和 public key
  • HMAC 认证凭证中的 secret key

添加消费者​

  1. 从侧边导航栏选择你的网关组下的 消费者。
  2. 点击 Add Consumer(添加消费者)。
  3. 在弹出的对话框中,执行以下操作:
  • 在 名称字段中,输入 Alice。
  • 点击 新增。

存储密钥​

为消费者 Alice 的凭证创建一个 Kubernetes 资源清单文件:

alice-secret.yaml
apiVersion: v1
kind: Secret
metadata:
namespace: api7
name: alice
type: Opaque
stringData:
key: alice-key # 用于 key auth
username: alice # 用于 basic auth
password: alice-password # 用于 basic auth
secret: alice-secret # 用于 JWT auth
secret_key: alice-secret-key # 用于 HMAC auth

然后将其应用到你的 Kubernetes 集群:

kubectl apply -f alice-secret.yaml

添加密钥认证(Key Authentication)凭证​

  1. 从侧边导航栏选择你的网关组下的 消费者。
  2. 选择你的目标消费者,例如 Alice。
  3. 在 认证凭据 选项卡下,点击 新增 Key Authentication 凭据。
  4. 在弹出的对话框中,执行以下操作:
  • 在 名称字段中,输入 primary-key。
  • 在 Key字段中,输入 $secret://kubernetes/my-kubernetes-secret/api7/alice/key。
  • 点击 新增。

添加基本认证(Basic Authentication)凭证​

  1. 从侧边导航栏选择你的网关组下的 消费者。
  2. 选择你的目标消费者,例如 Alice。
  3. 在 认证凭据选项卡下,点击 Basic Authentication选项卡,然后点击 新增 Basic Authentication 凭据。
  4. 在弹出的对话框中,执行以下操作:
  • 在 名称字段中,输入 primary-basic。
  • 在 用户名 字段中,输入 Alice。
  • 在 密码 字段中,输入 $secret://kubernetes/my-kubernetes-secret/api7/alice/password。
  • 点击 新增。

添加 JWT 认证凭证​

  1. 从侧边导航栏选择你的网关组下的 消费者。
  2. 选择你的目标消费者,例如 Alice。
  3. 在 认证凭据选项卡下,点击 JWT 选项卡,然后点击 新增 JWT 凭据。
  4. 在弹出的对话框中,执行以下操作:
  • 在 名称 字段中,输入 primary-jwt。
  • 在 Key 字段中,输入 alice-key。
  • 在 算法 字段中,选择 HS256。
  • 在 密钥 字段中,输入 $secret://kubernetes/my-kubernetes-secret/api7/alice/secret。
  • 点击 新增。

添加 HMAC 认证凭证​

  1. 从侧边导航栏选择你的网关组下的 消费者。
  2. 选择你的目标消费者,例如 Alice。
  3. 在 认证凭据选项卡下,点击 HMAC Authentication选项卡,然后点击 新增 HMAC Authentication 凭据。
  4. 在弹出的对话框中,执行以下操作:
  • 在 名称字段中,输入 primary-hmac。
  • 在 Key ID 字段中,输入 alice-keyid。
  • 在 Secret Key字段中,输入 $secret://kubernetes/my-kubernetes-secret/api7/alice/secret-key。
  • 点击 新增。

验证消费者凭证​

验证密钥认证​

请参阅为 API 启用密钥认证在服务级别启用 key-auth 插件,然后按照验证密钥认证进行验证。

验证基本认证​

请参阅为 API 启用基本认证在服务级别启用 basic-auth 插件,然后按照验证基本认证进行验证。

验证 JWT 认证​

请参阅为 API 启用 JWT 认证在服务级别启用 jwt-auth 插件,然后按照验证 JWT 认证进行验证。

验证 HMAC 认证​

请参阅为 API 启用 HMAC 认证在服务级别启用 hmac-auth 插件,然后按照验证 HMAC 认证进行验证。

引用密钥来启用插件​

插件配置中的以下敏感字段可存储在外部密钥管理器(HashiCorp Vault、AWS Secret 管理服务、Kubernetes Secret)中并在 API7 网关中引用:

插件字段
Limit Countredis_username, redis_password
Authz-Casdoorclient_id, client_secret
Wolf RBACappid
LDAP Authenticationuser_dn

本节以配置 Limit Count 插件为例进行演示。

存储密钥​

为 Redis 用户名和密码创建一个 Kubernetes 资源清单文件:

redis-secret.yaml
apiVersion: v1
kind: Secret
metadata:
namespace: api7
name: redis
type: Opaque
stringData:
username: api7
password: redis-api7

然后将其应用到你的 Kubernetes 集群:

kubectl apply -f redis-secret.yaml

配置 Limit Count 插件​

有关在何处以及如何启用 Limit Count 插件的信息,请参阅对 API 应用限流。

将以下配置添加到 **JSON Editor(JSON 编辑器)**中:

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

额外资源​