背景
之前项目中用到文件上传的场景中,都是由服务端做转发到OSS,存在着性能损耗。我们在 高德文件直传能力建设 项目中需要探索使用客户端直连OSS的方式来做,了解到OSS提供了STS认证的方式,通过子账号生成的临时AK作为客户端短期访问OSS的凭证,也不同担心AK安全的问题。具体方案见官方文档:STS临时授权访问OSS
OSS可以通过阿里云STS(Security Token Service)进行临时授权访问。通过STS,您可以为第三方应用或子用户(即用户身份由您自己管理的用户)颁发一个自定义时效和权限的访问凭证。
根据STS的技术规范,我们需要申请子账号及对应的角色,才能完成STS的认证。具体接入代码见下图:
了解到集团对云资源的需求都统一走诺曼底申请,所以我们尝试在诺曼底申请。整个过程还挺费劲的。主要是STS认证的方式,集团基本没有团队接入,所以在诺曼底上没有子账号创建角色的入口。我们找到相关人聊了好久才解决。下面记录一下接入过程
接入过程
1.创建bucket
首先需要申请OSS云资源,操作路径为【云资源管理】/【云资源申请】,点击创建bucket。
申请完成后在云资源筛选里能看到刚才申请的bucket。
2.关联子账号
然后在云资源列表中找到bucket,点击【bucket授权】,关联子账号。
子账号授权有两种方式。
选择已有RAM子账号
创建新的RAM子账号
按自己实际情况选择 。目前代码中不允许明文AK存在,所以两种方式差别不大。
如果要获取明文AK可以选择【创建新的RAM子账号】,这种方式能直接看到AK、SK,不需要走审批流程;选择已有已有RAM子账号的方式需要走获取明文AK的审批流程;
操作完成后就关联上子账号了。
3.查看AK、SK
普通场景下不需要获取明文AK,直接使用集团的无AK化方案。
集团在推行无AK化方案,不需要明文获取AK了。具体接入文档见:
https://yuque.antfin-inc.com/docs/share/6e5423a2-61e2-486f-9980-3421cbdfa283?#
但是我们这种属于平台模式,无AK化方案不支持,需要拿到AK、由平台自己利用KC做加密存储
如何特殊场景需要获取到明文AK、SK,可以参考如下:
如果在关联子账号时选择了【创建新的RAM子账号】,需要走审批流程获取AK、SK。在【云账号管理】/ 【子账号管理】/【我管理的子账号】列表中找到对应账号,点击【操作列表】/【获取明文AK】走审批流程获取
如果选择了【选择已有RAM子账号】,在【云账号管理】/ 【子账号管理】/【我管理的子账号】中可以看到AK、SK,不需要申请了
4.申请角色
在【云账号管理】/【角色管理】下创建角色。填写角色名称、关联子账号就可以了。
创建完成就能再角色列表中看到了
如何拿到roleArn?
在进行STS认证时需要有roleArn参数,目前诺曼底上看不到,需要提需求解决。但是roleArn 有拼接规则,可以临时拼一下使用。
拼接规则为:
var roleArn = "acs:ram::${主账号uid}:role/${角色名}"
1647796581073291 这个是生产网vpc的主账号id
还有个办法,在角色列表页用浏览器查看HTTP请求,接口中已经返回了arn,拷贝出来直接使用~
5.为角色申请权限
【云账号管理】/【角色管理】
在角色列表点击【权限管理】,为角色申请bucket读写权限;诺曼底里有读写权限的模板,一般只申请读写权限就行了。也可以自定义语句申请。
申请通过后就能在权限信息里看到申请的权限了。
点击【查看策略】,可以查看具体的权限信息
6.给子账号申请assumeRole 权限
申请了这个权限子账号才可以进行STS认证流程
【云账号管理】/【子账号管理】
在我管理的子账号列表中找到子账号,点击权限管理,进行assumeRole 权限申请。会跳一个新页面,点击【申请新权限】.
这个权限没有现成的模板选择,选择自定义语句申请。确认提交后进入审批流程。这个要经过安全、sre等多层审批,流程较长
自定义语句可参考如下:
{
"Statement":[
{
"Action":"sts:AssumeRole",
"Effect":"Allow",
"Resource":"acs:ram:*:1647796581073291:role/aos-read-role"
}
],
"Version":"1"
}
1647796581073291 是集团公共主账号ID,role 后面是角色名
Resource的写法也可参考:
https://help.aliyun.com/document_detail/93744.html?spm=a2c4g.11186623.6.705.3f674781h714Tq
审批通过后就能进行验证了
7.验证
调用STS认证接口验证。认证通过就没啥问题了。
8.常见问题
申请完权限后进行STS认证还是提示?
NoPermission : You are not authorized to do this action.
You should be authorized by RAM.\r\nRequestId :
419F92CB-17F3-4684-9E9E-E1EF8A58453C
检查assumeRole 是否申请给了角色而不是子账号。应该是给子账号申请assumeRole 权限
附录:https://yuque.antfin-inc.com/docs/share/c129be7f-e995-4767-94fe-c079c9cbbe75?#