Учетные данные AWS STS Tem с динамической политикой

Я пытаюсь запустить некоторый код внутри лямбда-функции, которая выдаст подписанный URL-адрес, который был подписан с набором временных учетных данных, имеющих собственную политику.

Основная идея заключается в том, что подпись позволяет пользователю подключаться к AWS IOT, но только с определенным идентификатором клиента и с ограничениями по темам подписки, а также по полученным сообщениям.

Если я выполняю подпись, используя учетные данные, которые изначально присваиваются функции Lambda (т. Е. До того, как они будут приняты функцией Lambda, код работает). Однако запуск его внутри функции Lambda создает предполагаемую роль и создает набор временных учетных данных, но итоговая подпись не будет устанавливать соединение с конечной точкой IOT AWS.

Основной код:

    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,

Роль, назначенная лямбда-функции (до ее принятия), имеет следующие доверительные отношения:

{
  "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-адрес, который может подключаться с использованием любого идентификатора клиента, к любой теме и получать любые сообщения. В этой функции нет исключений, и AWS возвращает все правильно, поэтому я должен что-то неправильно настроить.

1 ответ

Решение

Разрешения роли и переданной политики пересекаются, а не объединяются: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_assumerole.html

Если исходная роль не имеет каких-либо разрешений, то это же относится и к исполняемой роли.

Другие вопросы по тегам