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
目录
相关文章
|
29天前
|
前端开发 API
【Azure 环境】从Azure AD(Entra ID)中获取的Token在访问自定义的接口应用时验证不通过
集成Azure AD(新名称Microsoft Entra ID),拿到对应的accessToken作为登录用的凭证。这个 AccessToken 能够正常返回,并作为Microsoft Graph userinfo API的Authorization,因为应用中会对前端传递过来的 AccessToken进行校验合法性。但目前遇见的问题时这个 Token 签名校验失败。 “'IDX10503: Signature validation failed. Keys tried: 'Microsoft.IdentityModel.Tokens.X509SecurityKey , KeyId: xxx
【Azure 环境】从Azure AD(Entra ID)中获取的Token在访问自定义的接口应用时验证不通过
|
4月前
|
存储 Kubernetes 安全
在k8S中,Secret 有哪些使用方式?
在k8S中,Secret 有哪些使用方式?
|
4月前
|
存储 运维 安全
函数计算产品使用问题之如何获取到访问其他阿里云服务所需的AccessKey、SecretKey或STS Token
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
4月前
|
存储 Shell 容器
【Azure 存储服务】使用PowerShell脚本创建存储账号(Storage Account)的共享访问签名(SASToken) : New-AzStorageContainerSASToken
【Azure 存储服务】使用PowerShell脚本创建存储账号(Storage Account)的共享访问签名(SASToken) : New-AzStorageContainerSASToken
|
4月前
【Azure 环境】Azure CLI 获取Access Token的脚本实例
【Azure 环境】Azure CLI 获取Access Token的脚本实例
|
4月前
|
API 网络架构
【Azure 环境】用 PowerShell 调用 AAD Token, 以及调用Azure REST API(如资源组列表)
【Azure 环境】用 PowerShell 调用 AAD Token, 以及调用Azure REST API(如资源组列表)
|
4月前
|
存储 架构师 数据安全/隐私保护
【Azure 环境】由为存储账号(Storage Account)拒绝分配权限而引出的Azure 蓝图(Blueprint)使用问题
【Azure 环境】由为存储账号(Storage Account)拒绝分配权限而引出的Azure 蓝图(Blueprint)使用问题
|
7月前
|
弹性计算 运维 安全
访问控制(RAM)|云上程序使用临时凭证的最佳实践
STS临时访问凭证是阿里云提供的一种临时访问权限管理服务,通过STS获取可以自定义时效和访问权限的临时身份凭证,减少长期访问密钥(AccessKey)泄露的风险。本文将为您介绍产品原理,以及具体的使用步骤。
151404 5
|
存储 算法 Java
Java实现AWS S3 V4 Authorization自定义验证
最近在开发文件存储服务,需要符合s3的协议标准,可以直接接入aws-sdk,本文针对sdk发出请求的鉴权信息进行重新组合再签名验证有效性,sdk版本如下
177 0
|
7月前
|
数据库 数据安全/隐私保护
在阿里云中,访问控制(Resource Access Management,简称RAM)是权限管理系统,主要用于控制账号在阿里云中
在阿里云中,访问控制(Resource Access Management,简称RAM)是权限管理系统,主要用于控制账号在阿里云中
682 3