从 React Amplify APP 访问 AWS Secret

Posted

技术标签:

【中文标题】从 React Amplify APP 访问 AWS Secret【英文标题】:Access AWS Secrets from React Amplify APP 【发布时间】:2021-08-24 05:35:08 【问题描述】:

这可能是一个愚蠢的问题,但是以这种方式从我的 React 前端应用程序(托管在 AWS Amplify 上)访问 AWS 机密是否安全?

这些秘密显然不打算公开,所以我不想使用放大环境变量选项。

如果这不是将 API 机密和密钥加载到前端应用程序的适当方式,那么什么是?

var AWS = require('aws-sdk'),
    region = "us-east-2",
    secretName = "MNTSWP",
    secret,
    decodedBinarySecret;

// Create a Secrets Manager client
var client = new AWS.SecretsManager(
    region: region
);



client.getSecretValue(SecretId: secretName, function(err, data) 
    if (err) 
        if (err.code === 'DecryptionFailureException')

            throw err;
        else if (err.code === 'InternalServiceErrorException')

            throw err;
        else if (err.code === 'InvalidParameterException')

            throw err;
        else if (err.code === 'InvalidRequestException')

            throw err;
        else if (err.code === 'ResourceNotFoundException')

            throw err;
    
    else 

        if ('SecretString' in data) 
            secret = data.SecretString;
         else 
            let buff = new Buffer(data.SecretBinary, 'base64');
            decodedBinarySecret = buff.toString('ascii');
        
    
    
    // Your code goes here. 
);

【问题讨论】:

【参考方案1】:

那您可能需要先将您的凭据信息保存到 Secret Manager 中,然后按如下方式获取:

var AWS = require('aws-sdk'),
  region = "ap-southeast-1",
  secretName = `my-secret`, rds_username, rds_password;

var awsSecretClient = new AWS.SecretsManager(
  region: region
);

let result = await awsSecretClient.getSecretValue( SecretId: secretName ).promise();
rds_username = Buffer.from(JSON.parse(result.SecretString).rds_username, 'base64').toString();
rds_password = Buffer.from(JSON.parse(result.SecretString).rds_password, 'base64').toString();

【讨论】:

【参考方案2】:

由于您的前端在 Web 浏览器中运行,因此中等技术用户可以轻松检查代码,因此您无法将凭证(例如您的 AWS 凭证)安全地保存在那里。如果您这样做,不仅会暴露您的秘密,还会暴露您的 AWS 凭证,攻击者可能会对这些凭证造成很大破坏(并且有工具可以扫描 AWS 密钥)。

老实说,在前端应用程序中并没有真正可靠的方法来保护凭据,因此您可以:

使用安全地保存凭证的后端 API 但是您只是在解决问题吗?现在您需要验证用户是否应该有权访问后端 API? 让用户提供凭据 这是最常见的方法 -- 用户提供用户名和密码,然后您使用它来控制访问 这可能仍需要后端 API 或可以解析凭证的东西(例如 AWS API Gateway + Authorizer) 制定复杂的规则来保护后端资源,即使在某些级别的密钥暴露时也是如此(例如,请参阅 Firebase 安全规则)。

【讨论】:

【参考方案3】:

为了使其正常工作,您必须在有权访问该密钥的客户端上拥有一些凭据。如果它们确实是秘密的,那么您应该这样做。您通过应用程序请求的任何内容都不再是秘密。如果您尝试提供对后端资源的安全访问,您应该使用 Cognito 之类的工具并传递 JWT。

【讨论】:

以上是关于从 React Amplify APP 访问 AWS Secret的主要内容,如果未能解决你的问题,请参考以下文章

AWS Amplify Auth Login 从 React Native 上的 React Native Webview

AWS Amplify in React,如何从订阅的侦听器呈现新数据

在 React 中使用 AWS Amplify Appsync 上传图像

aws-amplify-react 和 @aws-amplify/ui-react 有啥区别?

使用 AWS Amplify 和 App Sync 与使用 Mongodb 的现有节点服务器

没有当前用户 AWS Amplify 身份验证错误 - 无需登录即可访问