AWS S3 - 代码中公开的凭据

时间:2017-09-22 15:44:38

标签: javascript amazon-web-services amazon-s3 aws-sdk-js

我是AWS的新手,并且存在一些安全问题。

我想允许我的用户上传个人资料图片,我想将其保存在S3中。 我的代码如下所示:

import AWS_S3 from 'aws-sdk/clients/s3';
import config from '../../config';

const myS3Credentials = {
  accessKeyId: config('AWSS3AccessKeyID'),
  secretAcccessKey: config('AWSS3SecretAccessKey'),
};

console.log('myS3Credentials:', myS3Credentials);

const S3 = new AWS_S3({
  credentials: myS3Credentials,
  region: config('AWSS3Region'),
});

所有变量(如AWSS3Region和我的凭据)都在.env文件中设置。但在这里,我在代码中暴露它们。怎么避免呢?或者我应该设置一些存储桶权限吗?

4 个答案:

答案 0 :(得分:3)

您应该never, ever直接在客户端代码中发送/公开AWS访问令牌。

将该代码放在服务器上并调用您的服务器代码,然后调用AWS。

在您的服务器上,您也不应该使用硬编码的访问密钥。正如亚历杭德罗在下面的answer中所述,使用环境变量来获取访问令牌。

答案 1 :(得分:3)

您可以使用在S3对象上公开的aws sdk getSignedUrl方法。这将允许您直接从客户端上传到您的存储桶,而不会暴露您的访问令牌。您可以将访问权限保存在.env文件中,并将该文件保留在您的存储库之外,从而使您的访问权限保持安全。

创建签名网址需要在服务器上创建一个返回签名网址的端点。从那里你将执行包含图像的放置请求。我用一个例子创造了一个要点。在要点中有客户端和服务器代码。 https://gist.github.com/pizza-r0b/35be6dd3e992ef1ebb2159772cb768c0

答案 2 :(得分:2)

强烈建议不要在客户端代码中存储永久凭据,以便将文件上传到S3。有几种方法可以安全地处理这个问题。

  • 使用AWS STS SDK或使用AWS Cognito等服务从后端获取临时访问凭据。
  • 使用AWS CloudFront Signed URLsSigned Cookies从服务器发送回客户端,以便使用它们将文件上传到S3。

下面列出了很少的参考资料,以帮助您开始使用签名网址。

答案 3 :(得分:0)

只需拨打您的代码process.env.<YOUR_KEY>