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 的典型路径如下:

  1. 控制台创建:登录对象存储控制台,进入“安全凭证”或“API 密钥”页面,生成一对 AK/SK。
  2. 子账号授权:通过 IAM 系统为子用户创建密钥,并绑定最小权限策略。
  3. 自动轮换:定期(如每 90 天)更换 SK,旧密钥保留 24 小时过渡期。

在编排层,推荐使用以下安全存储策略:

  • 环境变量注入:在容器或函数计算环境中通过 OS_ENV 注入 AK/SK。
  • 密钥管理服务:调用 KMS 的 GetSecretValue 接口动态获取 SK。
  • 编排平台变量:利用编排引擎的“敏感变量”功能,加密存储且运行时脱敏。

4.3 签名算法原理与计算流程

签名算法的核心是 HMAC-SHA256,它确保请求在传输过程中不被篡改。标准签名流程包含以下步骤:

  1. 构造规范请求(CanonicalRequest):将 HTTP 方法、URI、查询参数、请求头(Host、Content-Type、X-Amz-Date 等)和请求体哈希按字典序拼接。
  2. 生成待签字符串(StringToSign):包含算法标识、时间戳、凭证作用域和规范请求的 SHA256 哈希。
  3. 计算签名:使用 SK 作为密钥,对 StringToSign 执行 HMAC-SHA256,输出 64 位十六进制字符串。
  4. 添加认证头:将 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

下图展示了签名算法的完整数据流与各环节的输入输出关系:

签名算法数据流图 签名算法数据流图 请求参数 规范请求 待签字符串 签名密钥 签名值 Authorization 头 输入说明 • AK/SK 来自安全存储 • 时间戳防重放 • 请求体哈希防篡改

4.4 临时凭证使用

在编排场景中,长期有效的 AK/SK 存在泄露风险。临时凭证(Temporary Credential)通过 STS(Security Token Service) 颁发,具备以下优势:

  • 时效性:最短 15 分钟,最长 36 小时,过期后自动失效。
  • 权限范围:可绑定细粒度策略,如只读某个 Bucket 的特定前缀。
  • 无需轮换:每次编排任务前动态获取,避免 SK 长期暴露。

临时凭证的获取与使用流程如下:

  1. 调用 STS 接口:使用主账号或子账号的 AK/SK 调用 AssumeRole 或 GetFederationToken。
  2. 获取凭证三元组:返回 AccessKeyId、SecretAccessKey、SessionToken。
  3. 注入编排上下文:将临时凭证传递给下游的 API 调用节点。
  4. 签名时附加 Token:在请求头中添加 X-Amz-Security-Token 字段。
注意:临时凭证的 SecretAccessKey 同样需要保密传输。在编排引擎中,建议使用内存级变量传递,避免写入磁盘或日志。

下图对比了长期凭证与临时凭证在编排流程中的使用差异:

长期凭证 vs 临时凭证编排对比 长期凭证 vs 临时凭证编排对比 长期凭证(不推荐) AK/SK 硬编码在编排脚本 所有 API 调用使用同一密钥 泄露后需手动轮换 安全审计困难 临时凭证(推荐) STS 动态颁发临时凭证 每次编排使用独立凭证 过期自动失效,无需轮换 可绑定最小权限策略

4.5 编排中的认证最佳实践

实践项 说明 推荐等级
使用临时凭证 所有编排任务优先通过 STS 获取临时凭证 强制
最小权限原则 临时凭证策略仅包含本次编排所需的操作和资源 强制
签名时间校验 服务端校验签名时间戳,偏差超过 15 分钟拒绝请求 推荐
密钥隔离 不同环境(开发/测试/生产)使用不同的 AK/SK 推荐
签名日志脱敏 日志中隐藏 SK 和签名值,仅保留 AK 用于审计 推荐
编排实战建议:在编排流程的起始节点调用 STS 获取临时凭证,并将其注入到全局上下文变量中。后续所有对象存储 API 节点均引用该变量,避免重复获取。同时设置凭证过期前 5 分钟的自动刷新逻辑,确保长任务不中断。