引用 AWS Secrets Manager 中的密钥
AWS Secrets Manager 是一项完全托管的服务,你可以将其与 API7 企业版集成,以安全地存储、管理和检索敏感信息,例如 API 密钥、密码和其他类型的凭据。它允许自动轮换密钥,降低了凭证随时间推移而泄露的风险。
本教程演示了如何将 API7 企业版与 AWS Secrets Manager 集成,使你能够安全地存储和引用消费者凭证及插件配置。
下面是一个交互式演示,提供了将 API7 企业版与 AWS Secrets Manager 集成存储和检索 key-auth 密钥的动手实践。
前置条件
- 安装 API7 企业版。
- 在你的网关组中至少有一个网关实例。
- 拥有一个 AWS 帐户以访问 IAM 和 Secrets Manager 模块。
获取 IAM Access Key ID 和 Secret Access Key
获取 IAM 用户访问密钥 (Access Key ID) 和秘密访问密钥 (Secret Access Key),它们将在下一步中配置在 API7 企业版中,以便访问 AWS Secrets Manager。
请确保为用户正确分配了适当的权限,以避免因权限不足而导致验证失败。
在网关组中添加密钥提供商
- Dashboard
- ADC
- Ingress Controller
- 从侧边导航栏选择你的网关组下的 Secret 提供商,然后点击 新增 Secret 提供商。
- 在弹出的对话框中,执行以下操作:
- 在 Secret 提供商 ID 字段中,输入
my-secrets-manager。 - 在 Secret 管理服务 字段中,选择
AWS Secrets Manager。 - 选择你的 AWS Secrets Manager 服务的区域。例如,
us-east-1。 - 将上一步骤获取的访问密钥和秘密访问密钥填入 Access Key ID 和 Secret Access Key 字段。
- 点击 新增。
- 复制 Secret 变量以供将来引用。所有密钥引用均由此生成,例如:
$secret://aws/my-secrets-manager/$secret_name/$key。
不适用。
API7 Ingress Controller 目前不支持密钥提供商。
引用 SSL 证书的密钥
SSL 证书对象中的敏感字段 certificate 和 private key 可以安全地存储在外部密钥管理器(例如 HashiCorp Vault 或 AWS Secret 管理服务)中,并在 API7 网关中引用。
在 AWS Secrets Manager 中 创建密钥
在本节中,你将创建一个密钥(secret)来存储消费者 alice 的凭证。你也可以参考 Create an AWS Secrets Manager secret。
- 在控制台中导航到 AWS Secrets Manager 并存储一个新的密钥。选择 其他类型的密钥 作为密钥类型,并在键值对中输入键名
crt及其 base64 值。 - 在下一步中,将密钥名称配置为
ssl,你可以选择添加描述。 - 点击 下一步 以查看其余信息并完成密钥创建。你应该可以在 AWS Secrets Manager 中看到列出的该密钥。
- 重复上述步骤创建另一个键值对:
private-key: {private key base64}。
添加 SSL 证书
- 从侧边导航栏选择你的网关组下的 证书,进入 SSL 证书选项卡。
- 点击 新增 SSL 证书。
- 在弹出的对话框中,执行以下操作:
- 在 名称字段中,输入
Test SSL Certificate。 - 在 证书字段中,输入
$secret://aws/my-secrets-manager/ssl/crt。 - 在 私钥字段中,输入
$secret://aws/my-secrets-manager/ssl/private-key。 - 点击 新增。
所有的密钥引用均由密钥提供商的 Secret 变量生成:$secret://aws/my-secrets-manager/$secret_name/$key。
- 想要全面使用和验证 SSL 证书,请参阅在客户端与 API7 网关之间配置 mTLS。
引用密钥创建消费者凭证
消费者凭证中的以下敏感字段可存储在外部密钥管理器(HashiCorp Vault、AWS Secrets Manager 等)中并在 API7 企业版中引用:
- 密钥认证(Key Authentication)凭证中的
key - 基本认证(Basic Authentication)凭证中的
password - JWT 认证凭证中的
secret和public key - HMAC 认证凭证中的
secret_key
添加消费者
- Dashboard
- ADC
- Ingress Controller
- 从侧边导航栏选择你的网关组下的 消费者。
- 点击 新增消费者。
- 在弹出的对话框中,执行以下操作:
- 在 名称 字段中,输入
Alice。 - 点击 新增。
若使用 ADC 创建消费者,请创建以下配置:
consumers:
- username: Alice
API7 Ingress Controller 目前不支持密钥提供商。
在 AWS Secrets Manager 中创建密钥
在本节中,你将创建一个密钥来存储消费者 alice 的凭证。你也可以参考 Create an AWS Secrets Manager secret。
- 在控制台中导航到 AWS Secrets Manager 并存储一个新的密钥。选择 其他类型的密钥 作为密钥类型,并在键值对中输入键名
alice-key-auth及其对应的值alice-key。 - 在下一步中,将密钥名称配置为
alice-credentials,你可以选择添加描述。 - 点击 下一步 以查看其余信息并完成密钥创建。你应该可以在 AWS Secrets Manager 中看到列出的该密钥。
- 重复上述步骤为其他消费者凭证创建更多键值对:
- 对于基本认证(Basic Authentication)凭证:
password: alice-password。 - 对于 JWT 认证凭证:
secret: alice-secret。 - 对于 HMAC 认证凭证:
secret-key: alice-secret-key。
添加密钥认证(Key Authentication)凭证
- Dashboard
- ADC
- Ingress Controller
- 从侧边导航栏选择你的网关组下的 消费者。
- 选择你的目标消费者,例如
Alice。 - 在 认证凭据选项卡下,点击 新增 Key Authentication 凭据。
- 在弹出的对话框中,执行以下操作:
- 在 名称字段中,输入
primary-key。 - 在 Key字段中,输入
$secret://aws/my-secrets-manager/alice-credentials/alice-key-auth。 - 点击 新增。
若使用 ADC 创建包含 key-auth 的消费者,请更新你的配置:
consumers:
- username: Alice
credentials:
- name: primary-key
type: key-auth
config:
key: $secret://aws/my-secrets-manager/alice-credentials/alice-key-auth
API7 Ingress Controller 目前不支持密钥提供商。
添加基本认证(Basic Authentication)凭证
- Dashboard
- ADC
- Ingress Controller
- 从侧边导航栏选择你的网关组下的 消费者。
- 选择你的目标消费者,例如
Alice。 - 在 认证凭据选项卡下,点击 Basic Authentication选项卡,然后点击 A新增 Basic Authentication 凭据。
- 在弹出的对话框中,执行以下操作:
- 在 名称字段中,输入
primary-basic。 - 在 用户名字段中,输入
alice。 - 在 密码字段中,输入
$secret://aws/my-secrets-manager/alice-credentials/password。 - 点击 新增。
若使用 ADC 创建包含 basic-auth 的消费者,请更新你的配置:
consumers:
- username: Alice
credentials:
- name: primary-basic
type: basic-auth
config:
password: $secret://aws/my-secrets-manager/alice-credentials/password
username: Alice
API7 Ingress Controller 目前不支持密钥提供商。
添加 JWT 认证凭证
- Dashboard
- ADC
- Ingress Controller
- 从侧边导航栏选择你的网关组下的 消费者。
- 选择你的目标消费者,例如
Alice。 - 在 认证凭据选项卡下,点击 JWT 选项卡,然后点击 新增 JWT 凭据。
- 在弹出的对话框中,执行以下操作:
- 在 名称字段中,输入
primary-jwt。 - 在 Key字段中,输入
alice-key。 - 在 算法字段中,选择
HS256。 - 在 密钥字段中,输入
$secret://aws/my-secrets-manager/alice-credentials/secret。 - 点击 新增。
若使用 ADC 创建包含 jwt-auth 的消费者,请更新你的配置:
consumers:
- username: Alice
credentials:
- name: primary-jwt
type: jwt-auth
config:
algorithm: HS256
key: alice-key
secret: $secret://aws/my-secrets-manager/alice-credentials/secret
API7 Ingress Controller 目前不支持密钥提供商。
添加 HMAC 认证凭证
- Dashboard
- ADC
- Ingress Controller
- 从侧边导航栏选择你的网关组下的 消费者。
- 选择你的目标消费者,例如
Alice。 - 在 认证凭据 选项卡下,点击 HMAC Authentication 选项卡,然后点击 新增 HMAC Authentication 凭据。
- 在弹出的对 话框中,执行以下操作:
- 在 名称 字段中,输入
primary-hmac。 - 在 Key ID 字段中,输入
alice-keyid。 - 在 Secret Key 字段中,输入
$secret://aws/my-secrets-manager/alice-credentials/secret-key。 - 点击 新增。
若使用 ADC 创建包含 hmac-auth 的消费者,请更新你的配置:
consumers:
- username: Alice
credentials:
- name: primary-hmac
type: hmac-auth
config:
key_id: alice-keyid
secret_key: $secret://aws/my-secrets-manager/alice-credentials/secret-key
API7 Ingress Controller 目前不支持密钥提供商。
验证
请参阅为 API 启用密钥认证的相关说明,并在服务级别启用 Key Auth 插件。
使用有效凭证向路由发送请求:
curl -i "http://127.0.0.1:9080/ip" -H 'apikey: alice-key'
你应该会收到 HTTP/1.1 200 OK 响应。
alice-key 是你在 AWS Secrets Manager 上创建的键值对的值(value),而不是键的名称。
- 对于基本认证凭证,验证时使用:
password: alice-password。 - 对于 JWT 认证凭证,验证时使用:
secret: alice-secret。 - 对于 HMAC 认证凭证,验证时使用:
secret-key: alice-secret-key。
引用密钥来启用插件
插件配置中的以下敏感字段可存储在外部密钥管理器(HashiCorp Vault、AWS Secrets Manager 等)中并在 API7 网关中引用:
| 插件 | 字段 |
|---|---|
| Limit Count | redis_username, redis_password |
| Authz-Casdoor | client_id, client_secret |
| Wolf RBAC | appid |
| LDAP Authentication | user_dn |
本节以配置 limit-count 插件为例进行演示 。
创建密钥
在 AWS Secrets Manager 中,在密钥名称 redis 下创建一个使用键值对 username:api7 和 password:redis-api7 的密钥。
配置 limit-count 插件
有关在何处以及如何启用 limit-count 插件的信息,请参阅对 API 应用限流。
- Dashboard
- ADC
- Ingress Controller
将以下配置添加到 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://aws/my-secrets-manager/redis/username",
"redis_password": "$secret://aws/my-secrets-manager/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://aws/my-secrets-manager/redis/username
redis_password: $secret://aws/my-secrets-manager/redis/password
redis_database: 1
redis_timeout: 1001
allow_degradation: false
show_limit_quota_header: true
API7 Ingress Controller 目前不支持密钥提供商。
额外资源
- 核心概念
- API 消费