引用 Kubernetes Secret 中的密钥
Kubernetes Secrets 是存储密码、API 密钥和令牌等敏感数据的对象。它们可以作为环境变量暴露在 Pod 中,或者集成为密钥提供商以增强 API 安全性。
本教程演示了如何将 API7 企业版与 Kubernetes 作为密钥提供商进行集成,使你能够从 Kubernetes secrets 中安全地存储和引用消费者凭证及插件配置。如果你使用的是 Ingress Controller,则无需将 Kubernetes 添加为密钥提供商即可使用 Kubernetes Secrets。
前置条件
- 安装 API7 企业版。
- 在你的网关组中至少有一个网关实例。
- 准备你的 Kubernetes 集群以存储 secrets。
- 安装 cURL 以向服务发送请求进行验证。
在网关组中添加密钥提供商
- Dashboard
- ADC
- 从侧边导航栏选择你的网关组下的 Secret 提供商,然后点击 新增 Secret 提供商。
- 在弹出的对话框中,执行以下操作:
- 在 Secret 提供商 ID 字段中,输入
my-kubernetes-secret。 - 在 Secret 管理服务 字段中,选择
Kubernetes。 - 填写 API 服务器地址 字段。例如:
http://127.0.0.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 资源清单文件:
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 证书
- 从侧边导航栏选择你的网关组下的 证书,进入 SSL 证书选项卡。
- 点击 新增 SSL 证书。
- 在弹出的对话框中,执行以下操作:
- 在 名称字段中,输入
Test SSL Certificate。 - 在 证书字段中,输入
$secret://kubernetes/my-kubernetes-secret/api7/ssl/tls.crt。 - 在 私钥字段中,输入
$secret://kubernetes/my-kubernetes-secret/api7/ssl/tls.key。 - 点击 新增。
- 想要全面使用和 验证 SSL 证书,请参阅在客户端与 API7 网关之间配置 mTLS。
引用密钥创建消费者凭证
消费者凭证中的以下敏感字段可存储在外部密钥管理器(HashiCorp Vault、AWS Secret 管理服务 或 Kubernetes Secret)中并在 API7 网关中引用:
- 密钥认证(Key Authentication)凭证中的
key - 基本认证(Basic Authentication)凭证中的
password - JWT 认证凭证中的
secret和public key - HMAC 认证凭证中的
secret key
添加消费者
- Dashboard
- ADC
- 从侧边导航栏选择你的网关组下的 消费者。
- 点击 Add Consumer(添加消费者)。
- 在弹出的对话框中,执行以下操作:
- 在 名称字段中,输入
Alice。 - 点击 新增。
若使用 ADC 创建消费者,请创建以下配置:
consumers:
- username: Alice
将配置同步到 API7 企业版:
adc sync -f consumer.yaml
存储密钥
为消费者 Alice 的凭证创建一个 Kubernetes 资源清单文件:
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)凭证
- Dashboard
- ADC
- 从侧边导航栏选择你的网关组下的 消费者。
- 选择你的目标消费者,例如
Alice。 - 在 认证凭据 选项卡下, 点击 新增 Key Authentication 凭据。
- 在弹出的对话框中,执行以下操作:
- 在 名称字段中,输入
primary-key。 - 在 Key字段中,输入
$secret://kubernetes/my-kubernetes-secret/api7/alice/key。 - 点击 新增。
若使用 ADC 创建包含 key-auth 的消费者,请更新你的配置:
consumers:
- username: Alice
credentials:
- name: primary-key
type: key-auth
config:
key: $secret://kubernetes/my-kubernetes-secret/api7/alice/key
将配置同步到 API7 企业版:
adc sync -f consumer.yaml
添加基本认证(Basic Authentication)凭证
- Dashboard
- ADC
- 从侧边导航栏选择你的网关组下的 消费者。
- 选择你的目标消费者,例如
Alice。 - 在 认证凭据选项卡下,点击 Basic Authentication选项卡,然后点击 新增 Basic Authentication 凭据。
- 在弹出的对话框中,执行以下操作:
- 在 名称字段中,输入
primary-basic。 - 在 用户名 字段中,输入
Alice。 - 在 密码 字段中,输入
$secret://kubernetes/my-kubernetes-secret/api7/alice/password。 - 点击 新增。
若使用 ADC 创建包含 basic-auth 的消费者,请更新你的配置:
consumers:
- username: Alice
credentials:
- name: primary-basic
type: basic-auth
config:
password: $secret://kubernetes/my-kubernetes-secret/api7/alice/password
username: Alice
将配置同步到 API7 企业版:
adc sync -f consumer.yaml
添加 JWT 认证凭证
- Dashboard
- ADC
- 从侧边导航栏选择你的网关组下的 消费者。
- 选择你的目标消费者,例如
Alice。 - 在 认证凭据选项卡下,点击 JWT 选项卡,然后点击 新增 JWT 凭据。
- 在弹出的对话框中,执行以下操作:
- 在 名称 字段中,输入
primary-jwt。 - 在 Key 字段中,输入
alice-key。 - 在 算法 字段中,选择
HS256。 - 在 密钥 字段中,输入
$secret://kubernetes/my-kubernetes-secret/api7/alice/secret。 - 点击 新增。
若使用 ADC 创建包含 jwt-auth 的消费者,请更新你的配置:
consumers:
- username: Alice
credentials:
- name: primary-jwt
type: jwt-auth
config:
algorithm: HS256
key: alice-key
secret: $secret://kubernetes/my-kubernetes-secret/api7/alice/secret
将配置同步到 API7 企业版:
adc sync -f consumer.yaml
添加 HMAC 认证凭证
- Dashboard
- ADC
- 从侧边 导航栏选择你的网关组下的 消费者。
- 选择你的目标消费者,例如
Alice。 - 在 认证凭据选项卡下,点击 HMAC Authentication选项卡,然后点击 新增 HMAC Authentication 凭据。
- 在弹出的对话框中,执行以下操作:
- 在 名称字段中,输入
primary-hmac。 - 在 Key ID 字段中,输入
alice-keyid。 - 在 Secret Key字段中,输入
$secret://kubernetes/my-kubernetes-secret/api7/alice/secret-key。 - 点击 新增。
若使用 ADC 创建包含 hmac-auth 的消费者,请更新你的配置:
consumers:
- username: Alice
credentials:
- name: primary-hmac
type: hmac-auth
config:
key_id: alice-keyid
secret_key: $secret://kubernetes/my-kubernetes-secret/api7/alice/secret-key
将配置同步到 API7 企业版:
adc sync -f consumer.yaml
验证消费者凭证
验证密钥认证
请参阅为 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 Count | redis_username, redis_password |
| Authz-Casdoor | client_id, client_secret |
| Wolf RBAC | appid |
| LDAP Authentication | user_dn |
本节以配置 Limit Count 插件为例进行演示。
存储密钥
为 Redis 用户名和密码创建一个 Kubernetes 资源清单文件:
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 应用限流。
- Dashboard
- ADC
将以下配置添加到 **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
}
以下仅为插件配置,而不是要同步的完整配置文件。请参阅对 API 应用限流以了解有关在何处以及如何使用 ADC 启用 Limit Count 插件的说明。
limit-count:
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
额外资源
- 核心概念
- API 消费