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

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

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
目录
相关文章
|
4月前
|
Kubernetes API 容器
|
4月前
|
数据库 数据安全/隐私保护
在阿里云中,访问控制(Resource Access Management,简称RAM)是权限管理系统,主要用于控制账号在阿里云中
在阿里云中,访问控制(Resource Access Management,简称RAM)是权限管理系统,主要用于控制账号在阿里云中
523 3
|
8月前
|
前端开发 数据库 数据安全/隐私保护
DRF--认证和权限
DRF--认证和权限
|
11月前
|
数据库 Python
django drf 实现只有超级用户才能注册账号(涉及自定义权限permissions,获取token信息解析token信息)
django drf 实现只有超级用户才能注册账号(涉及自定义权限permissions,获取token信息解析token信息)
|
Linux 数据安全/隐私保护
设计并实现请求路径权限认证
设计并实现请求路径权限认证
设计并实现请求路径权限认证
|
安全 API 数据安全/隐私保护
api漏洞系列-通过access_token绕过权限
主要业务逻辑 Zopim仪表板帐户的所有者具有创建代理和禁用代理的能力,当禁用代理时,它限制用户访问他登录到仪表板(这是可以的),但没有使access_token过期。如果access_tokens被重用,我们就可以再次获得对帐户的访问权! 想象一下这样一种情况:所有者创建代理并提供管理访问权,当所有者知道其配置文件时,他只禁用它!但是在这里禁用帐户似乎不安全,帐户可以通过access_token使用。
427 0
|
消息中间件 监控 API
通过sts token 实现跨账户消费日志服务资源
阿里云账号可以通过创建并授权用户角色的方式赋予其他云账号一定的资源权限,其他云账号扮演该角色,并为其名下的RAM用户授予AssumeRole权限之后,其他云账号或其子账号可以通过访问STS接口获取临时AK和Token函数,调用日志服务API接口。
9474 1
通过sts token 实现跨账户消费日志服务资源
|
Java
如何获取第三方应用授权app_auth_token
一,说明    1.第三方应用文档:[url]https://docs.open.alipay.com/20160728150111277227/intro[/url]     2.作用:代替商户发起相关逻辑请求 二,配置    1.
4903 0
企业内部应用的access_token
企业内部应用调用本接口获取access_token。调用服务端API获取应用资源时,需要通过access_token来鉴权调用者身份进行授权。
企业内部应用的access_token
|
Java 专有云 开发工具
阿里云基于STS获取临时访问权限使用示例
通过STS服务,您所授权的身份主体(RAM用户或RAM角色)可以获取一个自定义时效和访问权限的临时访问令牌。本文基于JAVA SDK演示如何使用RAM子账户进行STS认证信息的获取以及使用。
3116 0
阿里云基于STS获取临时访问权限使用示例