【问题标题】:Can't use AWS temporary credentials (STS) - forbidden无法使用 AWS 临时凭证 (STS) - 禁止
【发布时间】:2016-10-30 22:13:00
【问题描述】:

我需要向我的客户提供临时访问密钥以连接到 IoT 服务(发布、接收等)。为了提供这种访问权限,我创建了一个调用 sts.assumeRole 的 Lambda 函数来创建临时 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"
    }
  ]
}

但是,在我的客户端代码(浏览器)中,我无法连接到 IoT,并且收到以下错误:

与“wss://my-endpoint.iot.us-east-1.amazonaws.com/mqtt?X-Amz-Algorithm=AWS4-H...Signature=my-signature”的 WebSocket 连接失败:WebSocket 期间出错握手:意外响应代码:403

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

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 无法验证提供的访问凭证”

【问题讨论】:

    标签: amazon-web-services amazon-ec2 aws-sdk amazon-iam aws-iot


    【解决方案1】:

    发现错误。与客户端连接时,需要提供assumeRole创建的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
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-24
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      • 2020-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多