4. 认证与鉴权:AccessKey/SecretKey 获取、签名算法原理、临时凭证使用
在对象存储接口编排中,每一次 API 调用都必须携带身份凭证,以证明调用者的合法身份并防止请求被篡改。本章围绕 AccessKey/SecretKey 的获取与安全存储、签名算法的数学原理与计算流程,以及临时凭证在编排中的最佳实践展开,帮助你在编排层构建可信、可控的认证体系。
4.1 认证体系核心概念
对象存储的认证模型采用对称密钥机制:调用者持有 AccessKey(AK) 和 SecretKey(SK),通过 HMAC-SHA256 算法对请求参数进行签名,服务端使用相同的 SK 验证签名。下表列出了认证体系中的关键术语与职责:
| 术语 | 长度 | 用途 | 安全等级 |
|---|---|---|---|
| AccessKey (AK) | 20-32 字符 | 标识调用者身份,明文传输 | 低(可公开) |
| SecretKey (SK) | 32-64 字符 | 签名密钥,必须保密存储 | 极高 |
| Signature | 64 字符(Hex) | 请求完整性证明 | — |
| 临时凭证 Token | 可变 | 临时授权,过期自动失效 | 高 |
安全提示:SK 是认证体系的根密钥。严禁在代码中硬编码、日志中打印或版本控制中提交 SK。推荐使用环境变量、密钥管理服务(KMS)或编排平台的密钥注入功能。
4.2 AccessKey/SecretKey 获取与安全存储
获取 AK/SK 的典型路径如下:
- 控制台创建:登录对象存储控制台,进入“安全凭证”或“API 密钥”页面,生成一对 AK/SK。
- 子账号授权:通过 IAM 系统为子用户创建密钥,并绑定最小权限策略。
- 自动轮换:定期(如每 90 天)更换 SK,旧密钥保留 24 小时过渡期。
在编排层,推荐使用以下安全存储策略:
- 环境变量注入:在容器或函数计算环境中通过
OS_ENV注入 AK/SK。 - 密钥管理服务:调用 KMS 的
GetSecretValue接口动态获取 SK。 - 编排平台变量:利用编排引擎的“敏感变量”功能,加密存储且运行时脱敏。
4.3 签名算法原理与计算流程
签名算法的核心是 HMAC-SHA256,它确保请求在传输过程中不被篡改。标准签名流程包含以下步骤:
- 构造规范请求(CanonicalRequest):将 HTTP 方法、URI、查询参数、请求头(Host、Content-Type、X-Amz-Date 等)和请求体哈希按字典序拼接。
- 生成待签字符串(StringToSign):包含算法标识、时间戳、凭证作用域和规范请求的 SHA256 哈希。
- 计算签名:使用 SK 作为密钥,对 StringToSign 执行 HMAC-SHA256,输出 64 位十六进制字符串。
- 添加认证头:将 AK、签名、签名头信息放入
Authorization请求头。
签名示例(伪代码):
// 步骤1: 构造规范请求
canonicalRequest = HTTPMethod + "\n" +
CanonicalURI + "\n" +
CanonicalQueryString + "\n" +
CanonicalHeaders + "\n" +
SignedHeaders + "\n" +
HexEncode(Hash(requestPayload))
// 步骤2: 生成待签字符串
stringToSign = "AWS4-HMAC-SHA256" + "\n" +
ISO8601Timestamp + "\n" +
Scope + "\n" +
HexEncode(Hash(canonicalRequest))
// 步骤3: 计算签名
signingKey = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(
"AWS4" + SK, date), region), service), "aws4_request")
signature = HexEncode(HMAC-SHA256(signingKey, stringToSign))
// 步骤4: 添加认证头
Authorization: AWS4-HMAC-SHA256 Credential=AK/20250331/us-east-1/s3/aws4_request,
SignedHeaders=host;x-amz-date,
Signature=signature
下图展示了签名算法的完整数据流与各环节的输入输出关系:
4.4 临时凭证使用
在编排场景中,长期有效的 AK/SK 存在泄露风险。临时凭证(Temporary Credential)通过 STS(Security Token Service) 颁发,具备以下优势:
- 时效性:最短 15 分钟,最长 36 小时,过期后自动失效。
- 权限范围:可绑定细粒度策略,如只读某个 Bucket 的特定前缀。
- 无需轮换:每次编排任务前动态获取,避免 SK 长期暴露。
临时凭证的获取与使用流程如下:
- 调用 STS 接口:使用主账号或子账号的 AK/SK 调用
AssumeRole或GetFederationToken。 - 获取凭证三元组:返回
AccessKeyId、SecretAccessKey、SessionToken。 - 注入编排上下文:将临时凭证传递给下游的 API 调用节点。
- 签名时附加 Token:在请求头中添加
X-Amz-Security-Token字段。
注意:临时凭证的 SecretAccessKey 同样需要保密传输。在编排引擎中,建议使用内存级变量传递,避免写入磁盘或日志。
下图对比了长期凭证与临时凭证在编排流程中的使用差异:
4.5 编排中的认证最佳实践
| 实践项 | 说明 | 推荐等级 |
|---|---|---|
| 使用临时凭证 | 所有编排任务优先通过 STS 获取临时凭证 | 强制 |
| 最小权限原则 | 临时凭证策略仅包含本次编排所需的操作和资源 | 强制 |
| 签名时间校验 | 服务端校验签名时间戳,偏差超过 15 分钟拒绝请求 | 推荐 |
| 密钥隔离 | 不同环境(开发/测试/生产)使用不同的 AK/SK | 推荐 |
| 签名日志脱敏 | 日志中隐藏 SK 和签名值,仅保留 AK 用于审计 | 推荐 |
编排实战建议:在编排流程的起始节点调用 STS 获取临时凭证,并将其注入到全局上下文变量中。后续所有对象存储 API 节点均引用该变量,避免重复获取。同时设置凭证过期前 5 分钟的自动刷新逻辑,确保长任务不中断。