标题:阿里云 STS 临时凭证怎么发:有效期与权限怎么设
长期 AccessKey 如果直接写进客户端或脚本,一旦泄露,攻击者就能长期访问账号下的资源。阿里云 STS(Security Token Service)可以签发临时凭证,有效期从 15 分钟到几小时不等,到期自动失效。下面先讲 STS 怎么用,再用移动端图片直传 OSS 的例子走一遍完整流程。

STS 解决什么问题
STS 返回的是一组临时凭证,包括 AccessKeyId、AccessKeySecret、SecurityToken,以及过期时间 Expiration。调用方用这三个值访问云资源,能做什么由 RAM 角色的权限和请求里附带的策略共同决定。过了过期时间,凭证就不能再用。
实际场景里,常见的有三种:
- 移动端或浏览器需要直接读写 OSS、表格存储等服务,但不能拿到主账号或子账号的长期密钥。
- 一个阿里云账号要临时访问另一个账号的资源,也就是跨账号授权。
- 企业已经有 SSO 或 OIDC 身份系统,员工想用原来的账号换取云上的临时权限。
核心接口和参数
最常用的是 AssumeRole。先在 RAM 里建一个角色,再配置信任策略,写明哪些主体可以扮演这个角色。之后调用 AssumeRole,传入角色 ARN、会话名称和有效期,就能拿到临时凭证。
调用时主要看下面几个参数:
- RoleArn:目标角色的 ARN,格式是 acs:ram::账号ID:role/角色名。
- RoleSessionName:会话名称。操作审计里靠它区分是谁发起的调用,建议直接填用户 ID。
- DurationSeconds:有效期,单位秒。最小 900。最大值受角色的最大会话时长限制,默认是 1 小时,可以在控制台改。
- Policy:会话策略,在角色已有权限的基础上再缩小范围。签发出的凭证只能用两者的交集,所以它是限制权限最直接的办法。
AssumeRoleWithOIDC 和 AssumeRoleWithSAML 分别对应 OIDC 和 SAML 身份提供商,已经有统一身份认证的企业多用这两个。ECS 实例绑定的 RAM 角色则通过实例元数据服务自动获取临时凭证,代码里不需要写任何密钥。
案例:移动端图片直传 OSS
某社区 App 允许用户上传头像和动态配图,图片都放在同一个 OSS Bucket 里。早期做法是服务端把 AccessKey 下发给客户端。后来一个安装包被反编译,密钥随之泄露,团队才改用 STS。改造后的流程分三步。
第一步:建一个权限很窄的角色
- 在 RAM 控制台新建角色。角色类型按调用方选择:阿里云服务,或者其他云账号。本例的调用方是本账号内的服务端应用,所以选当前账号。
- 给角色添加权限策略,只授予 oss:PutObject,资源范围限定在 acs:oss:*:*:社区图片桶/*。
- 把最大会话时长设为 1 小时。即使凭证被截获,能利用的时间也很短。
第二步:服务端按用户签发凭证
服务端收到上传请求后,先校验登录态,再调用 AssumeRole。传入的 Policy 要把资源路径缩到当前用户自己的目录,比如 users/用户ID/*。这样即使某个用户的凭证外泄,对方也只能写自己的目录,覆盖不了别人的文件。RoleSessionName 填用户 ID,DurationSeconds 设为 900,也就是 15 分钟。服务端把三个凭证字段和过期时间一起返回给客户端。
第三步:客户端直传,并处理过期
- 客户端用 OSS SDK 的 STS 模式,拿临时凭证直接上传到 OSS。图片数据不经过应用服务器,服务器带宽不会因为上传增加。
- 客户端检查 Expiration。距离过期不到 2 分钟就重新向服务端申请,避免大文件传到一半时凭证失效。
- 上传完成后,服务端通过回调或事件通知确认文件已经存在,再写入数据库。不要只相信客户端上报的结果。
改造之后,安装包里不再有长期密钥。团队还开启了 ActionTrail 审计日志,按 RoleSessionName 查每个用户的上传记录。出现异常时,可以直接定位到具体用户。
实施时要注意的几点
- 签发接口必须做鉴权。任何人都能调用 AssumeRole,所以服务端要先验证调用者身份,确认后才签发凭证。没有鉴权的签发接口等于把密钥交给所有人。
- 策略写具体。只给必要的操作和资源路径。资源范围尽量不用通配符 *,否则角色能碰到的文件会比业务需要的多得多。
- 有效期取够用的最短值。普通上传 15 分钟一般够用,没必要统一设成 1 小时。
- 凭证不写日志,也不落本地缓存。SecurityToken 属于敏感信息,只放在内存里用,用完即弃。
- AssumeRole 和 GetCallerIdentity 要分清。前者是换取凭证,后者是确认当前凭证属于哪个身份。权限报错时,先用 GetCallerIdentity 看一眼身份,排查会快很多。
STS 的思路是让角色和策略决定“谁能做什么”,并让凭证到期自动失效。签发环节做好身份校验,再把权限范围和有效期压到最小,就能在不影响上传体验的前提下,把密钥泄露后的影响控制住。