无法使用 AWS 临时凭证 (STS) - 禁止



我需要给我的客户端临时访问密钥来连接到物联网服务(发布,接收等)。为了提供这种访问,我创建了一个Lambda函数,它调用sts.assumeRole来创建临时STS键。这些键正在被创建并且看起来很好。

我在一个具有以下内联策略的角色中使用了Lambda的假设角色:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "iot:Connect",
                "iot:Subscribe",
                "iot:Publish",
                "iot:Receive"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "ec2:*"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "sts:AssumeRole"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}

注意:我已经添加了ec2权限来尝试二次(简化)测试。

这个角色有一个开放的信任关系:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

然而,在我的客户端代码(浏览器),我无法连接到物联网,我收到以下错误:

WebSocket连接到'wss://my-endpoint.iot.us-east-1.amazonaws.com/mqtt?X-Amz-Algorithm=AWS4-H...Signature=my-signature'失败:WebSocket握手时错误:意外响应码:403

尝试简化测试,我使用EC2,但收到另一个权限错误。使用的代码如下(使用browserify在browse中绑定)。

const AWS = require('aws-sdk');
// connect to Lambda to retrieve accessKeyId and secretAccessKey
$.ajax({ 
    method: 'GET', 
    url: 'my-url',
    success: function(res) {
        // connect to EC2
        AWS.config.update({accessKeyId: res.accessKeyId, secretAccessKey: res.secretAccessKey, region: res.region});
        const ec2 = new AWS.EC2();
        ec2.describeInstances({}, function(err, data) {
            if (err) console.log(err, err.stack); // an error occurred
            else     console.log(data);           // successful response
        });
    });
错误:

POST https://ec2.us-east-1.amazonaws.com/401(未经授权)

错误:AWS无法验证提供的访问凭据(…)"AuthFailure: AWS无法验证提供的访问凭据"

找到错误。当与客户端连接时,我需要提供由假设角色创建的sessionToken。

客户机代码:

// connect to EC2
AWS.config.update({accessKeyId: res.accessKeyId, secretAccessKey: res.secretAccessKey, sessionToken: res.sessionToken, region: res.region});
const ec2 = new AWS.EC2();
ec2.describeInstances({}, function(err, data) {
    if (err) console.log(err, err.stack); // an error occurred
    else     console.log(data);           // successful response
});

相关内容

  • 没有找到相关文章

最新更新