在 Kubernetes Secret 中引用密钥
Kubernetes Secrets 是用于存储密码、API 密钥和令牌等敏感数据的对象。这些密钥可以作为环境变量暴露给 Pod,或作为 Secret 提供商集成以增强 API 安全性。
本教程演示如何将 API7 企业版与 Kubernetes 集成作为Secret 提供商,使您能够安全地存储和引用消费者凭据及插件配置。
前提条件
- 安装 API7 企业版
- 网关组中至少有一个网关实例
- 准备用于存储密钥的 Kubernetes 集群
- 安装 cURL 用于服务验证
在网关组中新增 Secret 提供商
- 控制台
- ADC
- Ingress 控制器
- 从侧边栏选择网关组的 Secret 提供商,点击 新增 Secret 提供商。
- 在对话框中:
- Secret 提供商 ID 输入
my-kubernetes-secret
。 - 密钥管理器 选择
Kubernetes
。 - 填写 API 服务器地址 如
http://127.0.0.1
。 - 填写 Token。
- 点击新增。
- Secret 提供商 ID 输入
- 复制 密钥变量 供后续使用,所有密钥引用都基于此生成,例如:
$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 证书
从侧边栏选择网关组的 证书,进入 SSL 证书 标签页。
点击 新增 SSL 证书。
在对话框中:
- 名称 输入
测试 SSL 证书
。 - 证书 输入
$secret://kubernetes/my-kubernetes-secret/default/ssl/tls.crt
。 - 私钥 输入
$secret://kubernetes/my-kubernetes-secret/default/ssl/tls.key
。 - 点击新增。
- 名称 输入
完整使用和验证 SSL 证书,参见 配置客户端与 API7 网关间的 mTLS
为消费者凭据引用密钥
以下消费者凭据中的敏感字段可存储在外部密钥管理器中:
- 密钥认证凭据中的
key
- 基础认证凭据中的
password
- JWT 认证凭据中的
secret
、public key
- HMAC 认证凭据中的
secret key
新增消费者
- 控制台
- ADC
- Ingress 控制器
- 从侧边栏选择网关组的 消费者。
- 点击 新增消费者。
- 在对话框中:
- 名称 输入
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
新增密钥认证凭据
- 控制台
- ADC
- Ingress 控制器
- 从侧边栏选择网关组的 消费者。
- 选择目标消费者如
Alice
。 - 在 认证凭据 标签页点击 新增密钥认证凭据。
- 在对话框中:
- 名称 输入
primary-key
。 - 密钥 输入
$secret://kubernetes/my-kubernetes-secret/default/alice/key
。 - 点击新增。
- 名称 输入
即将推出
即将推出
新增基础认证凭据
- 控制台
- ADC
- Ingress 控制器
- 从侧边栏选择网关组的 消费者。
- 选择目标消费者如
Alice
。 - 在 认证凭据 标签页的 基础认证 子标签下点击 新增基础认证凭据。
- 在对话框中:
- 名称 输入
primary-basic
。 - 用户名 输入
Alice
。 - 密码 输入
$secret://kubernetes/my-kubernetes-secret/default/alice/password
。 - 点击新增。
- 名称 输入
即将推出
即将推出
新增 JWT 认证凭据
- 控制台
- ADC
- Ingress 控制器
- 从侧边栏选择网关组的 消费者。
- 选择目标消费者如
Alice
。 - 在 认证凭据 标签页的 JWT 子标签下点击 新增 JWT 凭据。
- 在对话框中:
- 名称 输入
primary-jwt
。 - 密钥 输入
alice-key
。 - 算法 选择
HS256
。 - 密钥 输入
$secret://kubernetes/my-kubernetes-secret/default/alice/secret
。 - 点击新增。
- 名称 输入
即将推出
即将推出
新增 HMAC 认证凭据
- 控制台
- ADC
- Ingress 控制器
- 从侧边栏选择网关组的 消费者。
- 选择目标消费者如
Alice
。 - 在 认证凭据 标签页的 HMAC 认证 子标签下点击 新增 HMAC 认证凭据。
- 在对话框中:
- 名称 输入
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 Count | redis_username , redis_password |
Authz-Casdoor | client_id , client_secret |
Wolf RBAC | appid |
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 应用速率限制。
- 控制台
- ADC
- Ingress 控制器
在 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
}
以下仅为插件配置,非完整同步配置文件。使用 ADC 启用 Limit Count 插件的位置和方法,参见 对 API 应用速率限制。
limit-count:
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
即将推出