API 密钥轮转的核心价值在于缩短泄露后的有效窗口期,但一旦发生疑似泄露,首要动作是立即撤销旧密钥而非等待轮转周期。
先说结论:轮转机制是降低长期暴露风险的有效手段,但不能替代泄露后的紧急撤销操作。
- 先判断:确认密钥是否已泄露或达到预设有效期
- 优先做:生成新密钥并更新业务配置,确保无缝切换
- 再验证:确认旧密钥失效且新密钥业务调用正常
核心处理流程
API 密钥轮转涉及控制台操作与代码配置更新,建议按以下顺序执行,避免服务中断:
- 生成新密钥:在云服务商控制台创建新 Key,确保旧 Key 仍有效。
- 更新配置:将新密钥写入配置中心或环境变量,避免硬编码。
- 灰度验证:观察业务监控,确认新密钥生效且无报错。
- 撤销旧密钥:确认稳定后,在控制台禁用或删除旧密钥。
云平台操作路径参考
不同云厂商控制台路径略有差异,以下是常见平台的操作入口:
- AWS IAM:Users -> 选择用户 -> Security credentials -> Create access key。
- 阿里云 RAM:身份管理 -> 用户 -> 选择用户 -> 创建 AccessKey。
- 腾讯云 CAM:用户列表 -> 选择用户 -> 安全凭证 -> 新建密钥。
注意:创建后密钥 Secret 通常仅显示一次,请立即保存至安全存储。
安全配置与代码加载
避免使用 export 命令直接设置环境变量,这会泄露到 Shell 历史且重启失效。生产环境建议采用以下两种方式:
方式 1:配置文件权限控制
echo "API_KEY=new_secret_value" >> .env chmod 600 .env
在代码中加载(Python 示例):
import os
from dotenv import load_dotenv
load_dotenv()
api_key = os.getenv("API_KEY")方式 2:使用密钥管理服务(推荐)
使用 AWS Secrets Manager 或 Kubernetes Secrets 动态注入,避免密钥落地。
import boto3
client = boto3.client('secretsmanager')
secret = client.get_secret_value(SecretId='prod/api/key')自动化轮转脚本示例
对于高频轮转需求,可编写脚本自动化流程。以下 Bash 脚本 skeleton 供参考:
#!/bin/bash # 1. 创建新密钥 NEW_KEY=$(cloud-cli create-key `--user`=app-user) # 2. 更新配置中心 config-center set API_KEY=$NEW_KEY # 3. 触发服务重载 kubectl rollout restart deployment/app # 4. 验证新密钥 curl -H "Authorization: $NEW_KEY" https://api.example.com/health # 5. 删除旧密钥 cloud-cli delete-key `--key-id`=$OLD_KEY_ID
紧急撤销 API 调用
若控制台不可用,可通过 API 紧急撤销泄露密钥。以 AWS IAM 为例:
aws iam delete-access-key `--access-key-id` $LEAKED_KEY_ID `--user-name` $USER_NAME
验证是否生效
1. 业务调用测试
使用新密钥发起请求,确认 HTTP 状态码为 200。
curl -H "Authorization: Bearer $NEW_KEY" https://api.example.com/v1/resource
2. 旧密钥失效测试
使用旧密钥请求,应返回 401 Unauthorized 或 403 Forbidden。
3. 审计日志检查
检查云厂商审计日志(如 AWS CloudTrail),确认旧密钥 ID 不再有调用记录。
常见坑与排查
1. 密钥泄露历史
避免在终端直接明文输入密钥。若已执行过明文命令,立即清理 history:history -c 并检查 ~/.bash_history。
2. 缓存未清除
部分 SDK 或网关会缓存 Token。更换密钥后,若遇到鉴权失败,尝试清除本地缓存或重启网关服务。
3. 切换期间服务中断
若不支持多密钥并存,切换瞬间可能导致请求失败。建议在低峰期操作,或采用蓝绿部署方式逐步切换。
4. 权限过度
新密钥应遵循最小权限原则。不要直接复制旧密钥的权限,借此机会审查并缩减不必要的接口访问权限。