node.js - AWS Lambda 安全 - 默认访问 Cognito?

标签 node.js amazon-web-services security aws-lambda amazon-cognito

我最近编写了一个简单的 Lambda 函数来向 AWS Cognito 注册新用户。我将该函数的执行角色保留为默认的 AWSLambdaBasicExecutionRole,它对 CloudWatch 的访问权限有限。

因此,我预计在运行函数时会收到一条错误消息,内容大致为“您的函数无权访问 Cognito 等...”,但是,令我惊讶的是该函数运行成功。

这是我的函数代码(Node.js 10.x):

const AWS = require("aws-sdk");
const crypto = require("crypto");

const Cognito = new AWS.CognitoIdentityServiceProvider();

exports.handler = async (event) => {
  const clientId = process.env.COGNITO_CLIENT_ID;
  const clientSecret = process.env.COGNITO_CLIENT_SECRET;
  const {username, password, email} = event;

  const secretHash = crypto.createHmac("SHA256", clientSecret).update(email + clientId).digest("base64");

  const params = {
    ClientId: clientId,
    SecretHash: secretHash,
    Password: password,
    Username: username,
    UserAttributes: [
        {
            Name: "email",
            Value: email
        }    
    ]
  };

  try {
      const authRes = await Cognito.signUp(params).promise();
      return {
          data: authRes
      }
  } catch(err) {
      console.log("Error: ", err);
      return {
          err
      }
  }
};

以下是该函数执行角色的 IAM 策略:

{
  "Version": "2012-10-17",
  "Statement": [
      {
        "Effect": "Allow",
        "Action": "logs:CreateLogGroup",
        "Resource": "arn:aws:logs:us-east-1:<account_id>:*"
      },
      {
        "Effect": "Allow",
        "Action": [
            "logs:CreateLogStream",
            "logs:PutLogEvents"
        ],
        "Resource": [
            "arn:aws:logs:us-east-1:<account_id>:log-group:/aws/lambda/create_user:*"
        ]
      }
  ]
}

那么为什么我的 Lambda 函数能够访问 Cognito?由于 Lambda 不应该具有任何隐式权限,这是否会带来巨大的安全风险?

如果有人能解释一下,我们将不胜感激

最佳答案

Cognito API 分为两种类型。已签名和未签名。您正在使用 (signUp) 的 API 是未签名的 API,因此不受 IAM 策略的限制。

基本上所有的管理员调用都像 adminsignup您可以限制为某人注册您的服务的位置,但您调用的电话是为用户自行注册您的服务而设计的。在 IAM 中限制该 API 并不是很有用。

您可以看到所有未签名的API here

关于node.js - AWS Lambda 安全 - 默认访问 Cognito?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57070510/

相关文章:

jquery - 当浏览器和 CURL 工作时,ajax GET 请求 URL 超时

mysql - 数据库版本更改后,不会自动使用索引

php - 如何防止 PHP 中的 SQL 注入(inject)?

php - 使用 salt login 的 Symfony 2 总是返回 Bad credentials

node.js - fs.write 仅在关闭服务器后注册

javascript - 在第一个函数之后执行第二个函数 - REST

node.js - npm 安装较新版本的对等依赖项

amazon-web-services - 将丢失的数据字段提取到 SageMaker Feature Store 的功能组中

asp.net - FormsAuthenticationTicket上Version属性的目的/含义是什么?

javascript - 如何使用 docx 包附加文件