AWS S3 - 凭据在代码中公开

AWS S3 - credentials exposed in code

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

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

您应该 never, ever send/expose 直接在您的客户端代码中访问 AWS 令牌。

将该代码放在服务器上并调用您的服务器代码,这反过来又调用 AWS。

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

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

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

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

  • 使用 AWS STS SDK 或使用类似 AWS Cognito.
  • 的服务从您的后端获取临时访问凭证
  • 使用 AWS CloudFront Signed URLs or Signed Cookies 从服务器发回客户端,这样您就可以使用它们将文件上传到 S3。

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