当前位置: 首页 > 知识库问答 >
问题:

不能使用AWS临时凭据(STS)-禁止

郑博
2023-03-14

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

我在具有以下内联策略的角色中使用带有Lambda的assumeRole:

{
    "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,并收到以下错误:

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
        });
    });

错误:

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

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

共有1个答案

逄岳
2023-03-14

发现错误。当与客户端连接时,我需要提供assumeRole创建的会话令牌。

客户端代码:

// 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
});
 类似资料:
  • 我必须在nifi进程中使用aws临时凭证AccessKey、SecretKey和令牌来访问S3对象。AccessKey、SecretKey和Token将由Api调用提供。如何在nifi ListS3对象等中使用这些临时凭证? 我发现的选项之一是使用AWSCre的alsProviderControlllerService,因为这可以根据API调用更新控制器服务的值吗? 在这个场景中我还可以使用其他选

  • 我想使用boto3上传一个文件到AWS S3。但我只能临时访问S3,这是由一个不在我控制之下的Web服务提供的。我获得了以下凭据信息: 据我所知,例如,这些信息可以用于POST请求。但我无法找到如何将此信息与boto3命令结合使用 通常需要aws_访问密钥id和aws_机密访问密钥。这篇文章建议,这应该是可能的: 您应该通过AWS安全令牌服务(STS)生成临时凭证,而不是签署URL(通常在通过we

  • 因此,我正在使用spring boot应用程序,我希望从该应用程序访问AWS资源,我知道如何通过I am凭据和STS凭据访问AWS资源,我正在寻找一个通过spring boot应用程序使用以下临时AWS凭据的示例或方法。 AWS_SECRET_ACCESS_KEY AWS_ACCESS_KEY AWS_SESSION_TOKEN AWS_SESSION_ID 注意:我尝试过通过BasicSessi

  • 为了接收STS临时凭据,我使用以下代码: 调用返回生成的临时凭据。有了这些凭据,我就可以成功地使用java aws sdk AmazonDynamoDBClient(非Spark方法)从DynamoDB获取数据。 用Spark有可能吗?spark是否允许使用以下内容:?

  • 我正在构建一个Kinesis视频流,为此,我需要在源代码中定义我的AWS密钥和秘密,正如您可以看到awslabs https://awslabs.github.io/amazon-kinesis-video-streams-webrtc-sdk-js/examples/的官方演示 假设,一个用户打开网页的源代码并看到临时AWS凭据,现在他们可以执行什么操作?它们能像普通AWS凭据那样执行所有操作吗

  • 有时候,你希望在不会干扰其他工作的情况下临时禁用一个资源。例如, 你可能想要调整服务器上的一个配置文件,经过 Puppet 的不断测试,直到获得你想要的确切设置。 在此期间你不想让 Puppet 覆盖旧版本的配置,为此你可以在资源上设置如下的 noop 元参数: noop => true, 操作步骤 添加如下代码到你的配置清单: file { "/tmp/test.cfg": conte