AWSecretsManager GetSecretValueRequest не использует правильную роль IAM во время чтения секрета

У меня есть служба ECS с fargate, которая имеет два контейнера.

У меня есть роль IAM arn:aws:iam::468589876897:role/app/my-test-app, эта роль добавлена ​​в мои ecs task_role и execute_role

Также у меня есть секрет с путем /myapp/secret/key_1-zbv0eq, который имеет разрешение, как показано ниже.

"Effect":"Deny",
"action" : "secretsmanager:getsecretvalue", "resource" : "*", "condition" : { "arnnotlike" : { "aws:principalarn" : [ "arn:aws:iam::468589876897:role/app/my-test-app" ] } } }  

и у меня есть код ниже, чтобы прочитать мой секретный менеджер

      String secretName = "/myapp/secret/key_1-zbv0eq";
      String endpoint = "secretsmanager.us-west-2.amazonaws.com";
      String region = "us-west-2";

      AwsClientBuilder.EndpointConfiguration config = new AwsClientBuilder.EndpointConfiguration(endpoint, region);
      AWSSecretsManagerClientBuilder clientBuilder = AWSSecretsManagerClientBuilder.standard();
      clientBuilder.setEndpointConfiguration(config);
      AWSSecretsManager client = clientBuilder.build();

      String secret;
      ByteBuffer binarySecretData;
      GetSecretValueRequest getSecretValueRequest = new GetSecretValueRequest()
              .withSecretId(secretName).withVersionStage("AWSCURRENT");
      GetSecretValueResult getSecretValueResult = null;
      try {
          getSecretValueResult = client.getSecretValue(getSecretValueRequest);

      } catch(ResourceNotFoundException e) {
          System.out.println("The requested secret " + secretName + " was not found");
      } catch (InvalidRequestException e) {
          System.out.println("The request was invalid due to: " + e.getMessage());
      } catch (InvalidParameterException e) {
          System.out.println("The request had invalid params: " + e.getMessage());
      }

       
      // Depending on whether the secret was a string or binary, one of these fields will be populated
      if(getSecretValueResult.getSecretString() != null) {
          secret = getSecretValueResult.getSecretString();
          System.out.println(secret);
      }
      else {
          binarySecretData = getSecretValueResult.getSecretBinary();
          System.out.println(binarySecretData.toString());
      }

  }

когда я запускаю этот код, я получаю ошибку ниже,

user: arn:aws:sts::468589876897:assumed-role/my-test-app/41810bc3cf2b4c99ad87f641810bc3cf 
is not authorized to perform: secretsmanager:getsecretvalue on resource: 
/myapp/secret/key_1-zbv0eq (service: awssecretsmanager; status code: 400; error code: accessdeniedexception; request id: 8254cdd0-3ce4-4485-bcd8-8af4b08e6fa2

Я не уверен, как эта роль используется arn:aws:sts::468589876897:assumed-role/my-test-app/41810bc3cf2b4c99ad87f641810bc3cf вместо arn:aws:iam::468589876897: роль/приложение/мое-тестовое-приложение

Я дважды проверил на консоли AWS, задача ECS, имеющая task_iam_role, и роль выполнения в определении контейнера, показывающая: arn:aws:iam::468589876897:role/app/my-test-app

Что может отсутствовать?


person kcoder    schedule 04.05.2021    source источник
comment
предполагается, что роль, на которую вы ссылаетесь, - это роль выполнения задачи, а не обязательно роль экземпляра ec2 (если она работает на ec2). См. это в качестве справки. Они открыто выдают секреты. В качестве побочной мысли, может ли это быть политика KMS, если секрет зашифрован, вам часто нужен доступ к ключу в дополнение к secretsmanager.   -  person John Hoffmeyer    schedule 05.05.2021
comment
Я проверил в консоли aws, что роль выполнения задачи такая же, я запускаю ECS с fargate, и эта задача имеет 2 контейнера. И один из контейнеров запускает тестовый java-код, упомянутый здесь.   -  person kcoder    schedule 05.05.2021


Ответы (1)


Чтобы получить ваши учетные данные, ваша среда должна иметь доступ к диспетчеру секретов aws. Это дается через роль IAM. В политике вы используете Запретить вместо Разрешить. Метод получения секретного значения вернет json, в котором будут все учетные данные в формате словаря. Ошибка, которую вам дают, говорит, что у вас нет разрешения на вашу среду. Я думаю, что изменение вашей политики сделает вашу работу (измените метод «Разрешить для получения секрета», а также разрешите доступ к другим службам, если вы используете любой другой, или вы можете использовать диспетчер секретов для чтения и записи, встроенный в политику AWS)

person Fahad Vadakkumpadatah    schedule 10.05.2021