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
扫描二维码,分享此文章