保护 AWS JS SDK Api 调用

Posted

技术标签:

【中文标题】保护 AWS JS SDK Api 调用【英文标题】:Securing AWS JS SDK Api Calls 【发布时间】:2015-01-03 02:41:28 【问题描述】:

我有一个网站,我使用 AWS S3 JS sdk 从 S3 服务器存储桶上传/删除图像。 目前我只在 JS 文件中以原始格式传递凭据,这是不安全的。 AWS 建议使用网络身份联合技术来确保其安全。

我读到了它们,并有一些疑问。

1:这种技术是否意味着,我网站的每个用户都需要使用它来上传图片,需要验证他们的登录?

2 : 还有一种叫做预签名的 URL。这也让我们隐藏了凭据。

但我对实现我的目标究竟应该遵循什么感到困惑,即,

我不想在 js 文件中向最终用户显示我的凭据。此外,我不希望我的最终用户以任何形式对自己进行身份验证。

有可能吗?如何实现?

【问题讨论】:

下面的答案对你有帮助吗? 【参考方案1】:

您确实应该使用一些身份联合来以某种方式验证您的用户并为您的用户获取临时访问密钥/秘密密钥。

AWS 有一项服务可以帮助您实现这一点:AWS Cognito (http://aws.amazon.com/cognito/) Cognito Identity 是一种身份联合服务,可让您在知名的 Web 身份服务(例如 Facebook、Google、Amazon、任何 OpenID Connect 服务(SalesForce...)或您自己的身份验证后端)上对您的用户进行身份验证。一旦用户在其中一项服务中通过身份验证,Cognito 将用联合令牌交换 AWS 访问密钥和秘密密钥。这些访问密钥的范围将限制为您在 Cognito 角色中定义的任何权限,并且时间有限(默认为 15 分钟)

这篇博文介绍了如何将 AWS Cognito Identity 与您自己的后端身份验证服务结合使用。它为 Java 和 .Net 提供了服务器端示例代码:http://mobile.awsblog.com/post/TxBVEDL5Z8JKAC/Use-Amazon-Cognito-in-your-website-for-simple-AWS-authentication

AWS Cognito Identity 还允许您与未经身份验证的用户合作,即在用户通过身份验证之前接收他们的访问密钥/秘密密钥。

AWS Cognito 将为您的用户维护一个唯一的身份 ID,无论他们使用何种身份验证方法(即同一个人通过 Google 进行一次身份验证,通过 Facebook 进行一次身份验证,并且将具有相同的身份 ID)

https://identity-demo.aws-emea.info 是一个演示用户身份验证和身份联合的网站。该网站实现了多种联合技术:服务器端 Web 身份联合(标签 #1)、客户端 (javascript) Web 身份联合(标签 #2)和客户端 (JavaSCript) AWS Cognito 身份验证(标签 #3)

回答您的第二个问题:S3 签名 URL:这些是允许从 S3 下载/上传内容的 URL。它们通常由应用服务器生成并嵌入网页中。 S3 签名 URL 不需要对您的用户进行身份验证,也不需要每个用户拥有一个密钥。您可以选择使用用户特定密钥还是应用通用密钥来生成 S3 签名 URL。所有 AWS SDK 都有帮助您生成预签名 URL 的方法。

鉴于您要求不对用户进行身份验证,您有两个选择。使用带有 AWS Cognito 的未经身份验证的用户或使用 S3 预签名 URL。然后必须在服务器端生成签名,使用服务器端密钥(如果您的应用服务器在 Amazon EC2 上运行,则使用 E​​C2 角色)

【讨论】:

以上是关于保护 AWS JS SDK Api 调用的主要内容,如果未能解决你的问题,请参考以下文章

使用 AWS Cognito 保护 REST API

测试受保护的 api 调用、mocha、supertest、node js、passport

AWS Cognito 模拟

如何保护移动和 AJAX 调用的 JSON RESTful API?

从本地系统而不是S3上运行的node.js应用程序调用AWS Lambda

无法从 /.aws/credentials 读取凭证 - PHP 脚本调用 AWS-SDK