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

额外资源