Siam博客

AWS-assumeRole.控制不同token访问不同目录

2022-12-07

aws

问题背景

应用程序需要做sessionToken,提供给用户访问S3的存储资源,但是需要做用户隔离(只能访问自己应用内的资源,不能访问别的用户的资源)

思路:

基本条件 S3资源库都设为私有

  1. 方案一,每次获取资源前都来server接口获取临时下载token
  2. 方案二,生成短时间内有效的(比如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
本文链接:
版权声明: 本文由 Siam原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权
Tags: aws

扫描二维码,分享此文章