【问题标题】:AWS S3 - credentials exposed in codeAWS S3 - 在代码中公开的凭证
【发布时间】:2023-03-12 07:46:01
【问题描述】:

我是 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 文件中设置。但是在这里,我将它们暴露在代码中。如何避免这种情况?还是我应该设置一些存储桶权限?

【问题讨论】:

  • 不要这样做。黑客使用机器人 Github 和其他公共网站搜索这些确切的访问令牌,以便他们可以从您的 AWS 账户中挖掘比特币。因为这个,我曾经在我的 AWS 上累积了 8k 的每月费用。此外,如果您公开任何凭据,请尽快更改您的访问令牌
  • 这是客户端代码还是服务器代码?
  • @lukaleli 客户端代码。
  • 您应该在服务器上的 API 中有一个瘦代理层,它可以传递到您的 S3 实例。这样您就不会公开您的凭据。
  • @NicholasKyriakides 谢谢。从来没有想过这些混蛋会这样做。

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


【解决方案1】:

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

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

【讨论】:

  • 谢谢!要点很有帮助,而且很容易阅读。我相信很多用户都会从您的回答中受益!
  • 指向要点的链接已损坏
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    下面列出的一些参考资料可帮助您开始使用签名网址。

    【讨论】:

      【解决方案4】:

      只需调用您的代码process.env.<YOUR_KEY>

      【讨论】:

      • 我已经设置了我的.env 文件,但这是客户端代码,因此可以在浏览器中查看这些凭据。
      猜你喜欢
      • 1970-01-01
      • 2021-03-30
      • 2012-12-20
      • 1970-01-01
      • 2019-04-15
      • 2020-06-25
      • 2019-05-09
      • 1970-01-01
      • 2023-03-10
      相关资源
      最近更新 更多