aws
问题背景
应用程序需要做sessionToken,提供给用户访问S3的存储资源,但是需要做用户隔离(只能访问自己应用内的资源,不能访问别的用户的资源)
思路:
基本条件 S3资源库都设为私有
- 方案一,每次获取资源前都来server接口获取临时下载token
- 方案二,生成短时间内有效的(比如1个小时)token,针对目录设置访问权限
方案一很简单,使用的是AWS的“预签名”GetObject即可
主要记录一下在实践方案二的过程
基本知识储备
- policy 权限
- IMA(Identiy and Acess Management) 理解为访问控制 角色权限控制
- 用户
- 权限策略 —— 用N个小权限组成一个小的策略 帮助快速配置
- 角色
- 组
角色、组、用户都是很基本的概念了 ,这里就不做解释
对于小公司来说,可能我们只有一个用户账号
,开通了所有AWS产品的权限 比如S3 OSS存储,CDN管理,日志管理
如果在大一点规模的公司,你所在部门/产品线,只有一小部分权限
所有的API和后台操作都需要管理员向你的用户账号授权才可以操作。
assumeRole
它的翻译为承担角色/假设角色。我的理解它可能翻译为虚拟生成角色下的用户账号更实在。
毫无疑问,我们虚拟生成这个动作,也是调用API,需要权限授权。所以请管理员在你的用户账号上赋予这个权限吧
创建角色
wait!!等等
我们的API名字叫什么? 假设 + 角色
角色呢?
在这个API中,我们想生成一个虚拟用户,是依赖“角色”作为权限模板的。所以我们还需要创建一个角色
同时我们在生成用户账号的时候也可以自定义policy权限
自定义权限与角色权限的关系是 【交集】
赋予虚拟用户
在我们这个例子中,
- 角色的权限我们可以设置为读取整个S3桶、上传资源
- 自定义权限可以指定不同的目录的读取权限
那么产生的结果就是以我们自定义权限为准(因为它比较小,交集后等于自己)
授权高级账号 生成虚拟用户的权限
以JSON为例
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::用户id:role/角色名" } ] }
ok ,现在我们可以使用这个高级账号来生成虚拟用户了
PHP-SDK 生成虚拟用户
注意 在以下代码中使用[]包起来的就是需要替换成你自己的参数
use Aws\Sts\StsClient; $stsClient = new StsClient([ 'version' => 'latest', 'region' => "ap-northeast-1", 'credentials' => [ 'key' => "[高级账号的key]", 'secret' => "[高级账号的secret]", ], ]); // 定义一下虚拟用户的权限,这里限制了只能访问1开头的目录资源 $policy = <<<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:*", "Resource": [ "[arn:aws:s3:::siam/1/]", "[arn:aws:s3:::siam/1/*]" ] } ] } EOF; // 生成虚拟用户(返回的是token) $result = $stsClient->assumeRole([ 'RoleArn' => 'arn:aws:iam::[用户arn]:role/[read-only]',// 这里是基于什么角色来生成 总得有个模板吧 'RoleSessionName' => '[newsession]',// 直接叫newsession也可以 'Policy' => $policy ]); $credentials = $result['Credentials'];
总结
没啥说的,一开始我测试的时候,是创建了俩个用户账号,然后A用B当模板去创建,一直报错没权限
后面想清楚了,名字就叫Role 所以我需要创建一个Role
- 一个高级账号
- 一个Role当模板
- 高级账号操作API,使用Role + Policy 生成虚拟用户token