我最近编写了一个简单的 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/