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
目录
相关文章
|
2月前
|
API 网络架构 开发者
【Azure API 管理】APIM服务资源删除后,为什么不能马上创建相同名称的APIM服务呢?
【Azure API 管理】APIM服务资源删除后,为什么不能马上创建相同名称的APIM服务呢?
|
2月前
|
安全 API 网络安全
【Azure API 管理】APIM如何配置客户端证书的CRL检测策略
【Azure API 管理】APIM如何配置客户端证书的CRL检测策略
|
2月前
|
存储 运维 安全
函数计算产品使用问题之如何获取到访问其他阿里云服务所需的AccessKey、SecretKey或STS Token
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
2月前
|
API 网络架构
【Azure 环境】用 PowerShell 调用 AAD Token, 以及调用Azure REST API(如资源组列表)
【Azure 环境】用 PowerShell 调用 AAD Token, 以及调用Azure REST API(如资源组列表)
|
2月前
|
API Python
【Azure API 管理】API Management 访问限制策略[quota-by-key] 中参数 [renewal-period] 的实验和理解
【Azure API 管理】API Management 访问限制策略[quota-by-key] 中参数 [renewal-period] 的实验和理解
|
2月前
|
API
【Azure API 管理】在 Azure API 管理中使用 OAuth 2.0 授权和 Azure AD 保护 Web API 后端,在请求中携带Token访问后报401的错误
【Azure API 管理】在 Azure API 管理中使用 OAuth 2.0 授权和 Azure AD 保护 Web API 后端,在请求中携带Token访问后报401的错误
|
2月前
|
存储 架构师 数据安全/隐私保护
【Azure 环境】由为存储账号(Storage Account)拒绝分配权限而引出的Azure 蓝图(Blueprint)使用问题
【Azure 环境】由为存储账号(Storage Account)拒绝分配权限而引出的Azure 蓝图(Blueprint)使用问题
|
5月前
|
数据库 数据安全/隐私保护
在阿里云中,访问控制(Resource Access Management,简称RAM)是权限管理系统,主要用于控制账号在阿里云中
在阿里云中,访问控制(Resource Access Management,简称RAM)是权限管理系统,主要用于控制账号在阿里云中
611 3
|
5月前
|
Kubernetes API 容器
|
数据库 Python
django drf 实现只有超级用户才能注册账号(涉及自定义权限permissions,获取token信息解析token信息)
django drf 实现只有超级用户才能注册账号(涉及自定义权限permissions,获取token信息解析token信息)