具有动态策略的 AWS STS Tem 凭证

AWS STS Tem credentials with dynamic policy

我正在尝试 运行 lambda 函数中的一些代码,该函数将发出签名的 URL,该签名是使用一组具有自定义策略的临时凭据签名的。

基本思想是签名允许用户连接到 AWS IOT,但只能使用特定的客户端 ID,并且对订阅主题和接收的消息有限制。

如果我使用本机分配给 Lambda 函数的凭据执行签名(即在它们被 Lambda 函数采用之前,代码有效)。但是,运行在 Lambda 函数中使用它确实会生成一个假定角色并生成一组临时凭证,但生成的签名不会与 AWS IOT 端点建立连接。

基本代码为:

    AWSSecurityTokenService tokenService = 
    AWSSecurityTokenServiceClientBuilder.standard()
            .withCredentials(new EnvironmentVariableCredentialsProvider())
            .build();

    AssumeRoleRequest assumeRoleRequest = new AssumeRoleRequest();
    assumeRoleRequest.setRoleSessionName(UidGenerator.generateId(16));
    assumeRoleRequest.setRoleArn("arn:aws:iam::xxxxxxxxxxx:role/websocket_signer");
    assumeRoleRequest.setDurationSeconds(60 * 60);
    assumeRoleRequest.setPolicy(policy);

    AssumeRoleResult assumeRoleResult = tokenService.assumeRole(assumeRoleRequest);

    // Create signed url
    WebSocketUrlSigner signer = new WebSocketUrlSigner(
            this.request.getStage(),
            assumeRoleResult.getCredentials().getAccessKeyId(),
            assumeRoleResult.getCredentials().getSecretAccessKey());

我试图担任的角色 websocket_signer 本身没有分配给它的策略,但确实与 arn:aws:sts::xxxxxxxxx:assumed-role/lambda_role/lambda_function_name.

有信任关系

分配给 Lambda 函数的角色(在其承担之前)具有以下信任关系:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "lambda.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

为了消除策略的任何潜在问题,我将以下策略动态传递给承担的角色(应该与现有的角色策略合并,这什么都不是):

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

我最终应该得到的是一个签名的 URL,它可以使用任何客户端 ID 连接到任何主题并接收任何消息。函数和 AWS 中没有异常 returns 一切正确所以我一定是配置错误了。

角色的权限和传递的策略相交,不合并: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_assumerole.html

如果起始角色没有任何权限,那么aasumed角色也是如此。