为什么接口不认永久 AK/SK:一次 STS 临时凭证的落地记录
一、报错先读清楚
把永久 AK/SK 塞进请求头,接口回 400,message 是「缺少最小权限 STS 临时凭证」。这句话有两层含义:一是必须用临时凭证,二是临时凭证本身要带权限收敛策略。永久密钥直接被拒,不是签名算错。
所以正确的路径不是换密钥,而是换凭证类型:用永久凭证去换一个有期限、有策略的临时凭证,再用它调业务接口。
二、AssumeAgency 的四个参数
调用形如 STS AssumeAgency,关键参数四个:region(如 cn-north-4)、agency_urn(形如 iam::<账号ID>:agency:<委托名>)、agency_session_name(会话名,建议带时间戳便于审计)、duration_seconds(最小 900)、policy(可选,进一步收窄权限)。
policy 是一个内联 JSON,只允许真正需要的那几个 action。比如自检场景只需要 sts::GetCallerIdentity 和 iam::listAuthDomains,就不要给通配。这一层和委托本身的权限是取交集,写错了会直接拿不到凭证。
三、委托不存在怎么办
第一次跑最常见的报错是 STS5.1106,意思是 agency:SELF_VERIFY 找不到。IAM 里没有这条委托,任何 AssumeAgency 都会失败,跟 AK/SK 是否有效无关。
解决办法是先在 IAM 建委托:agency.domain_id 填账号 ID,agency.name 填代码里写死的名字,agency.duration 可以设 ONEDAY 让它在一天后自然过期,信任关系指向自己账号。这样既不长期留权限,也保证流水线第二天还能跑。
四、凭证怎么存
临时凭证只在内存里构造,需要落盘时写到一个临时目录、权限收紧、用完立刻删。绝不写进仓库、绝不写进日志、绝不进配置文件的明文段落。
另一个习惯:把刷新所需的元数据(账号、委托 URN、region)和凭证本身分开,只存元数据,凭证过期就重新换。这样即使某次进程崩了,也不会留下可用的长期凭证。
五、验证顺序
先 GetCallerIdentity 确认身份,再调一个只读业务接口确认权限够用,最后才发真实请求。顺序反了会很难判断是凭证问题还是业务参数问题——这次就是先撞了业务校验,白排查了半小时。
- 点赞
- 收藏
- 关注作者
评论(0)