Javascript 如何在没有访问密钥和密钥的情况下写入仅写SQS队列
我有一个网站,可以将来自客户端的消息写入AmazonSQS队列。每个人都可以写入队列。我们有一个服务器端进程,它读取队列消息并对其进行处理 队列配置了对所有人的写访问权限,其策略如下:Javascript 如何在没有访问密钥和密钥的情况下写入仅写SQS队列,javascript,amazon-web-services,amazon-sqs,Javascript,Amazon Web Services,Amazon Sqs,我有一个网站,可以将来自客户端的消息写入AmazonSQS队列。每个人都可以写入队列。我们有一个服务器端进程,它读取队列消息并对其进行处理 队列配置了对所有人的写访问权限,其策略如下: { "Version": "2012-10-17", "Id": "arn:aws:sqs:.../SQSDefaultPolicy", "Statement": [{ "Sid": "Sid1537097246229", "Effect": "Allow", "P
{
"Version": "2012-10-17",
"Id": "arn:aws:sqs:.../SQSDefaultPolicy",
"Statement": [{
"Sid": "Sid1537097246229",
"Effect": "Allow",
"Principal": "*",
"Action": "SQS:SendMessage",
"Resource": "arn:aws:sqs:..."
}]
}
但是,如果没有访问密钥和密钥,我们似乎无法写入队列。AWS SDK返回一个错误,表示未提供凭据。我们使用的代码如中所述。您的
默认策略“主体”:“*”
仍然要求发送方提供一些AWS主体。如您提供的文件的先决条件所述:
使用您的用户凭据创建共享配置文件。有关提供共享凭据文件的更多信息,请参阅从共享凭据文件在Node.js中加载凭据
您是否考虑过使用API网关作为SQS队列的代理?在中定义了这样做的一个示例。我建议为SQS设置一个代理,并设置一个POST端点,例如
POST::/myQueueName/messages
这将改变用户与队列的交互方式,但它允许您仅将队列锁定给服务用户进行读写,这遵循最小特权策略。然后,您的API网关端点可以使用API密钥进行保护,完全开放到internet,甚至可以根据您的首选项使用IAM角色进行保护。我不建议允许未经身份验证的访问SQS队列,但如果必须这样做,则应能够通过JavaScript SDK发出未经验证的请求,如下所示:
const AWS = require('aws-sdk');
AWS.config.update({ region: 'us-east-1' });
const sqs = new AWS.SQS({ apiVersion: '2012-11-05' });
const params = {
DelaySeconds: 10,
MessageAttributes: {
Title: {
DataType: 'String',
StringValue: 'The Whistler',
},
Author: {
DataType: 'String',
StringValue: 'John Grisham',
},
},
MessageBody: 'NY Times fiction bestseller 12/11/2016.',
QueueUrl: 'QUEUE_URL_HERE',
};
sqs.makeUnauthenticatedRequest('sendMessage', params, (err, data) => {
if (err) {
console.log('Error', err);
} else {
console.log('Success', data.MessageId);
}
});
好建议,API网关。。。感觉比匿名队列访问要好得多。另一个(轻量级)示例:为什么?为什么对API网关的匿名访问优于直接对SQS的匿名访问?在这两种情况下,每个人都可以写入队列,在这两种情况下,如果我决定关闭公共访问,我只需要更改网关或队列上的权限。在您描述的场景中,SQS基本上是应用程序的后端数据库。在传统的观点中,让这些东西与你认识的用户和你不认识的用户直接交互是更安全的。无论是否匿名,APIG都允许您在有人尝试发出过多请求时定义每个IP的限制,这与SQS不同。有了网关,您可以灵活地切换到后端的不同队列,或者在存储到队列之前,如果您需要在入口端进行更多处理,可以使用lambda函数替换它。每个IP的限制和限制!这是使用它的一个很好的理由!在这种情况下,不需要灵活地切换队列,甚至不需要用其他东西替换队列。谢谢。我真的不明白为什么未经验证的请求在这里是个问题。在一个甚至没有用户注册的系统中,每个人都可以写入队列。无论我使用什么其他机制,基本上都允许每个人向队列写入消息。风险可能不高,但开放的SQS队列显然容易被发现URL的任何人滥用。这可能会给你的应用程序带来问题(读取意外的消息内容)并让你花钱(SQS不是免费服务)。的确,但如果我限制对队列的访问,让每个人都下载写入队列的javascript代码,同样存在同样的风险。对,客户端硬编码的凭据也同样存在问题。理想情况下,所有客户机都会进行身份验证(例如通过Cognito),但我知道在某些情况下,这可能看起来很繁重。无论如何,我只是想强调潜在的风险,让读者充分了解。