FCon7折倒计时最后一周:日程已上线70%!查看详情>>> 了解详情
写点什么

AWS STS, OpenID Connect 实现 S3 精细化权限控制

  • 2019-09-20
  • 本文字数:5308 字

    阅读完需:约 17 分钟

AWS STS, OpenID Connect 实现 S3 精细化权限控制

S3 是一个对象存储服务,非常适合存储海量文件。它不仅支持从服务器端上传/下载 S3 中的内容, 同时允许客户从客户端直接上传/下载 S3 中的资源。


在实际应用过程中,我们经常遇到这样的需求:只允许用户 上传/下载/删除/修改(CRUD) 自己的文件。 本文将探讨如何利用 AWS STS, OpenID Connect 实现精细化权限控制,实现用户只能上传和查看自己在 S3 中的文件。


Amazon S3 是一个对象存储服务,非常适合存储海量文件。 它不仅支持从服务器端上传/下载 S3 中的内容,同时允许客户从客户端直接上传/下载 S3 中的资源。


AWS Security Token Service 允许用户通过 API 的方式申请访问 AWS 资源的临时的 AccessKeyID 和 SecretAccessKey. 该用户可以是 IAM User, 也可以是联合登陆的用户。


OpenID Connect 是在基于 OAuth 2.0 协议的基础上提供通过 API 进行身份交互的规范。

前提

  1. 本文将使用 Auth0 作为用户库。请注册 Auth0 账户,并按照 文档添加 application。 这并不要求用户一定使用 Auth0, 只要是支持 OpenID Connect 标准的用户库都 可以使用此方法。

  2. 本文架构部署使用 terraform 一键部署 AWS 资源, 请在本机安装 terraform, 并配置好 AWS Credentials

  3. Demo 包含前端 Web 应用,使用 yarn 做依赖管理,请自行安装 yarn

  4. 需要了解 OpenID Connect 的基本机制,包括 Access Token, ID Token.

  5. 需要了解 IAM Role. IAM 角色 是可在账户中创建的一种具有特定权限的 IAM 身份。 IAM 角色类似于 IAM 用户,因为它是一个 AWS 身份,该身份具有确定其在 AWS 中可执行和不可执行的操作的权限策略。

  6. 本文使用 AWS China Region, 如使用 AWS Global Region, 请参考 AWS 区域与终端节点修改 endpoint。

架构和原理


  1. 客户端检测到用户未登陆,跳转到登陆授权页面。以下是跳转链接:


https://aws-cognito.auth0.com/authorize?client_id=n4JmCUjAA4P7cEIEC3KI9yy8Kt4COqOt&response_type=token%20id_token&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fcallback&scope=openid&state=VkFD4yrt9C2S2_qd67Xs8MHcBhxh2li0&nonce=xXaQ-2sQnBCwMbGc1y7e3r0KgbC5~3sO&auth0Client=eyJuYW1lIjoiYXV0aDAuanMiLCJ2ZXJzaW9uIjoiOS4xMC4xIn0%3D
复制代码


上述 HTTP request 中的 auth0Client 为 Auth0 增加的字段,非 OIDC 标准字段


  1. 客户端向 OpenID Connect Provider(OIDC) 发起登录请求,登陆成功后,跳转回步骤 1 中的 redirect_uri,并且在 HTTP URL 中包含 access token 和 ID Token。如下:


http://localhost:3000/callback#access_token=<access_token>&expires_in=7200&token_type=Bearer&state=vaXfc.jDtU5sr37K75QRw.~ZI4E5uLDA&id_token=<id_token>
复制代码


服务器在授权成功后返回信息如上。其中包含 id_token.


  1. 调用 STS 的 AssumeRole API,获取临时 AK/SK


POST https://sts.cn-north-1.amazonaws.com.cn/?Version=2011-06-15&Action=AssumeRoleWithWebIdentity&RoleArn=arn%3Aaws-cn%3Aiam%3A%3A057005827724%3Arole%2Foidc-role-eziaoubl&RoleSessionName=web-identity&WebIdentityToken=<id_token>
复制代码


在上述接口中 WebIdentityToken 是步骤 2 通过 OIDC 获得的 ID Token, RoleArn 指向 预先创建好的 IAM Role. 通过 AssumeRole 接口返回的 AK/SK 具有该 IAM Role 所具备的权限。


  1. 通过 AK/SK 完成 SigV4 签名,然后直接上传文件到 S3. 通常情况下,我们使用 AWS SDK 完成签名 和上传工作。

  2. 在步骤 3 中使用的 IAM Role 的 Policy 配置如下:


该 Role 所具有的 Policy 配置如下, 将其中的,,替换为实际使用的值。


{    "Version": "2012-10-17",    "Statement": [        {            "Sid": "ListYourObjects",            "Effect": "Allow",            "Action": "s3:ListBucket",            "Resource": [                "arn:aws-cn:s3:::<s3-bucket-name>"            ],            "Condition": {                "StringLike": {                    "s3:prefix": [                        "<app-name>/${<identity-provider-name>:sub}"                    ]                }            }        },        {            "Sid": "ReadWriteDeleteYourObjects",            "Effect": "Allow",            "Action": [                "s3:GetObject",                "s3:PutObject",                "s3:DeleteObject"            ],            "Resource": [                "arn:aws-cn:s3:::<s3-bucket-name>/<app-name>/${<identity-provider-name>:sub}",                "arn:aws-cn:s3:::<s3-bucket-name>/<app-name>/${<identity-provider-name>:sub}/*"            ]        }    ]}

复制代码


${:sub} 是一个变量,实际上是 OpenID Connect 中的 sub 字段, 通常情况下该字段是 OIDC 中的 username 字段。


通过如上的 Policy 配置,我们可以限制用户只能上传/下载/删除自己的文件。

Demo 快速部署

点击此处获取代码<<<


本文使用 Terraform 作为自动化资源创建工具,Terraform 是 一款 IT 基础架构自动化编排工具,如尚未安装,请按照文档下载并安装。


  1. 注册 Auth0 帐号,并添加 Application. 详细步骤请查看 Auth0 操作手册。 请注意,此处不强制使用 Auth0, 只要符合 OIDC 规范即可。记录下 Application 的 Domain 和 Client ID。 在 Settings -> Allowed Callback URLs 中输入 http://localhost:3000/callback

  2. 登陆 AWS 控制台,在 IAM Identity Provider 中点击 Create Provider,

  3. 在 Provider Type 中选择 OpenID Connect; 在 Provider URL 中输入 Auth0 的 Domain 字段(必须是 https://开头); 在 Audience 中输入 Auth0 的 clientID

  4. 在 terraform/variables.tf 中修改变量的值。参数说明请参考注释

  5. 通过 Terraform 自动化部署 IAM Role, IAM Policy



cd terraformterraform initterraform apply
复制代码


  1. 将 terraform 的输出拷贝到 src/config.json 中,并保存配置文件

  2. 在项目根目录下安装 Web 依赖, 并运行前端程序


cd ..yarn installyarn start
复制代码

运行 Demo

  1. 点击页面上的 Log In 按钮,跳转到 Auth0 的认证页面,输入用户名密码。 等待页面跳转回 Web App, 显示已经登陆,页面如下:

  2. 点击 Get AWS Credentials 按钮。等待弹出对话框

  3. 点击 Choose file 选择要上传的文件,此处只支持图片

  4. 4.点击 Upload 按钮,等待文件上传成功,并弹出对话框

  5. 查看 S3 Bucket, 发现 S3 中图片的 keyname 包含 OpenID Connect Sub


至此,实验成功。想知道客户端的实现方式可查看, src 文件夹下的前端代码。 demo 程序的主要逻辑代码在 src/Auth/Auth.js 和 src/Home/Home.js。

故障排除

No OpenIDConnect Provider Found In Your Account

如果您遇到一下 No OpenIDConnect Provider Found In Your Account 错误,请检查你的 IAM Identity Provider 名称是否以 / 结果。



您可以通过 jwt.io 来解码 ID Token 来确认是否需要 IAM Identity Provider 的名称。 正确的名称是 iss 字段中 https://往后的全部内容


如何销毁资源

  1. 删除 S3 内的文件

  2. 在 terraform 目录下运行 terraform destroy

  3. 3.在 IAM Identity Provider 中删除之前创建的 Identity Provider

参考资料

Auth0 配置


JS S3 上传示例代码


作者介绍:


施乔


施乔,亚马逊 AWS 解决方案架构师,负责基于 AWS 的云计算方案的架构设计,在应用开发, Serverless, 大数据,IoT 方向有丰富的实践经验。


本文转载自 AWS 博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/aws-sts-openid-connect-realize-s3-permission-control/


2019-09-20 08:001504
用户头像

发布了 1707 篇内容, 共 80.5 次阅读, 收获喜欢 71 次。

关注

评论

发布
暂无评论
发现更多内容

2021年公有云市场的5大趋势

浪潮云

云计算

网络攻防学习笔记 Day144

穿过生命散发芬芳

高可用 9月日更

Go 语言网络库 getty 的那些事

apache/dubbo-go

dubbo Go 语言 Dubbo3

和声是容介态——为《链政经济:区块链如何服务新时代治国理政》一书作序

CECBC

与顶级互联网公司技术大佬面对面聊聊RocketMQ

阿里巴巴云原生

阿里云 RocketMQ 云原生

iOS开发面试拿offer攻略之数据结构与算法篇附加安全加密

iOSer

ios 数据加密 iOS面试 iOS逆向 iOS算法

作为一线技术人员,如何更好地提升自己

谙忆

管理 成长 引航计划

玩转TypeScript工具类型(下)

有道技术团队

typescript 大前端 网易有道

通俗易懂 即时通讯初学者入门 WhatsApp技术架构

OpenIM

直播预告|如何节省30%人工成本,缩短80%商标办理周期?

京东科技开发者

商标 企业服务 灵活用工

dubbo-go github action 集成测试

apache/dubbo-go

dubbo-go Apache Dubbo Dubbo3

JavaScript进阶(七)call, apply, bind

Augus

JavaScript 9月日更

汽车之家基于dubbo-go云平台的探索和实践

apache/dubbo-go

dubbo dubbo-go dubbogo Dubbo3

Mp3文件结构全解析(一)

轻口味

android 音视频 9月日更

深入理解掌握零拷贝技术

Linux服务器开发

网络协议 零拷贝 Linux服务器开发 Linux内核 用户态

【音视频专题】音频质量评估方法那些事

声网

算法 音视频

Golang正确使用kafka的姿势-细节决定成败

OpenIM

幻读是啥,会有什么问题?如何解决?

Java MySQL 数据库 面试 后端

国庆高质量出行,可视化开启智慧旅游

ThingJS数字孪生引擎

大前端 物联网 可视化 旅游 数字孪生

Tapdata 实时数据中台在智慧教育中的实践

tapdata

低代码应用:软件开发的一体化最新形态!

优秀

低代码

银行数字化转型指南:《区域性银行数字化转型白皮书》完整版重磅发布

百度开发者中心

最佳实践 银行数字化转型

基于Tensorflow + Opencv 实现CNN自定义图像分类

华为云开发者联盟

tensorflow KNN OpenCV CNN

金融级分布式事务解决方案DTC

tom

我愿意招什么样的产品经理?

石云升

产品经理 招聘 9月日更

二十不惑的年纪,我简直走了狗屎运(4面拿字节跳动offer)

Java 程序员 架构 面试 计算机

区块链军事应用探析

CECBC

服务实体经济,银行区块链应用正在画一个更大的圆

CECBC

【初恋系列】那年的雨还在下...

人工智能~~~

谈 C++17 里的 Observer 模式 - 4 - 信号槽模式

hedzr

c++ 算法 设计模式 Design Patterns c++17

云栖大会抢先看,提前探秘云栖数字谷

阿里巴巴云原生

阿里巴巴 云原生 云栖大会

  • 扫码添加小助手
    领取最新资料包
AWS STS, OpenID Connect 实现 S3 精细化权限控制_服务革新_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章