在前端存储AWS凭证

时间:2018-12-11 16:47:33

标签: javascript amazon-web-services amazon-s3

我正在尝试从JavaScript前端应用程序中获取S3中的图像对象。

根据文档,这些是必需的步骤:

import * as AWS from "aws-sdk";

AWS.config.update({accesKeyId, secretAccesKey, region});

let s3 = new AWS.S3();

然后,您可以像这样获得对象:

function listObjects(bucketName, folderName) {
  return new Promise((resolve) => {
    s3.listObjects({Bucket: bucketName, Prefix: folderName}).promise()
      .then((data) => {
        resolve(data.Contents);
      })
  });
}

一切似乎都能正常工作,但是让我担心的是,为了访问存储桶,我还需要将accessKeyId和secretAccessKey保留在前端应用程序中。

如何在不提供这些机密数据的情况下保护存储桶或访问对象?

3 个答案:

答案 0 :(得分:4)

您是对的担心。任何人都可以从您的应用程序中取出凭据。有几种解决方法:

  • 如果对象实际上不是敏感对象,那么只要凭据只能 采取您希望允许所有人的操作,就不会有任何损失。为此,如果您在存储桶上正确设置权限,则应该能够完全摆脱对凭据的需求。.我认为,如果有必要,则包括列表权限。

  • 如果对象 是敏感的,则您已经为用户提供了某种身份验证系统。如果您使用Oauth帐户进行身份验证(google,amazon,facebook等),则可以使用AWS Cognito生成与该用户关联的短期AWS凭证,这将使您能够区分用户之间的权限...如果已经使用过oauth,则非常光滑且非常合适。如果您不使用oauth,请考虑是否应该使用。它比必须为用户提供自己的身份验证层要安全得多。 https://aws.amazon.com/cognito/

  • 如果您不想或无法使用认知功能,仍然可以从后端承担AWS角色,并生成临时凭证,该凭证将在15分钟到1小时或更长时间内自动失效,然后通过这些凭据到前端。我将其称为“穷人的认知”,但是运行基础设施以提供服务可能比认知成本更昂贵。

  • 或者按照@Tomasz Swinder的建议,您可以简单地通过应用程序代理请求,将用户请求的资产解析为s3资源,然后将其拉到后端,然后再为用户服务。在大多数情况下,这是一个劣等的解决方案,因为您的服务器距离最终用户的距离比s3的终结点可能要远。并且,您必须运行基础结构来代理。但是,话虽如此,它已经到位了。

  • 最后,预签名的s3网址可能非常适合您的应用程序。通常,后端会在将s3网址提供给用户之前直接对其进行签名。签名足以​​授权操作(可以是PUT GET),但其本身并不包含用于签名的私钥-换句话说,预签名的url提供了授权的URL,但没有提供凭证用于对它们进行授权,因此它们是向s3提供临时授权的好方法。

总的来说,拥有一个无后端的应用程序真是太棒了,为此,您将需要第三方身份验证和诸如cognito之类的东西。但是一旦开始使用它,就可以使用各种AWS服务来提供后端可以完成的工作。请注意权限,因为aws都是随用随付的,并且通常没有能力将呼叫限制为服务,以确保残酷的互联网用户努力通过增加大量费用来提高您的AWS账单使用您提供的临时信用进行通话。 API网关是一个值得注意的例外,它确实允许每个用户速率限制,因此非常适合通过认知授权的无服务器后端。

还要记住,列出s3对象比获取s3对象要慢得多,并且昂贵得多(每个op仍然便宜,但10倍),因此通常最好避免调用lIST。我只是把它扔在那里,我怀疑您是在这样做以测试s3连接。

答案 1 :(得分:1)

您可以通过服务器请求吗?还是静态网站?

如果这是一个静态站点,则可以为s3创建IAM用户,该用户只能读取您将要使用的内容并始终显示在前面。

答案 2 :(得分:0)

我们使用的一种方法是将凭据存储在.env文件中,并使用dotenv(https://github.com/motdotla/dotenv)读取变量。然后可以通过process.env访问这些文件。例如,.env文件将包含:

AWSKEY=1234567abcdefg
AWSSECRET=hijklmn7654321
REGION=eu-west

然后在代码中,您将调用require('dotenv').load()来读取环境变量。然后,您以以下方式访问它们:

AWS.config.update({process.env.AWSKEY, process.env.AWSSECRET, process.env.REGION});

确保.env文件未提交到您的存储库中。如果需要,可以提供一个env.example以及有关在创建开发或生产安装时如何创建.env的说明。

关于保护存储桶,您可以通过限制对拥有AWS密钥/秘密对的IAM用户的读取/写入访问权限来实现。

相关问题