AWS - разрешить другой учетной записи читать и расшифровывать данные DynamoDB с помощью KMS (Java) - PullRequest
0 голосов
/ 11 мая 2018

У меня есть учетная запись A, в которой есть таблица DynamoDB с содержимым, зашифрованным с использованием ключа KMS, также в учетной записи A.

Я хочу предоставить доступ к учетной записи B, чтобы она могла читать данные DynamoDB и расшифровывать их с помощью того же ключа KMS.

Первый шаг: доступ к DynamoDB между счетами

Я использовал эту статью: https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html.

  • Создана роль в учетной записи A, в которой в качестве доверенного лица указан пользователь IAM учетной записи B
  • Создан пользователь IAM в учетной записи B, у которого есть политика AssumeRole для доступа к роли в учетной записи A
  • Для кода, который выполняется в контексте учетной записи B, создан DynamoDBMapper, который использует STSAssumeRoleSessionCredentialsProvider для принятия роли

AWSSecurityTokenService stsClient =

AWSSecurityTokenServiceClient.builder()
        .withCredentials(awsCredentialsProvider)
        .withRegion(dynamoRegion)
        .build();
STSAssumeRoleSessionCredentialsProvider arscp =
        new STSAssumeRoleSessionCredentialsProvider.Builder(accessRole, accessRoleName)
                .withStsClient(stsClient)
                .build();
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()
        .withRegion(dynamoRegion)
        .withCredentials(arscp)
        .build();

Это работает!

Второй шаг: использование KMS для шифрования / дешифрования данных (не для кросс-аккаунта)

Для этого использовал библиотеку aws-Dynamodb-encryption-java . При создании DynamoDBMapper передайте атрибут AttributeEncryptor, полученный из провайдера материалов KMS:

AWSKMS kms = AWSKMSClientBuilder.standard()
                .withRegion(region)
                .withCredentials(awsCredentialsProvider)
                .build();
EncryptionMaterialsProvider encryptionProvider = new DirectKmsMaterialProvider(kms, keyId);
return new DynamoDBMapper(client, dynamoDBMapperConfig, new AttributeEncryptor(encryptionProvider));

Это тоже работает!

Третий шаг: разрешение учетной записи B расшифровывать данные из DynamoDB

За этой статьей: https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying.html#key-policy-modifying-external-accounts

  • Изменена политика ключей в учетной записи A для предоставления доступа к корню учетной записи B
  • Создана политика IAM в учетной записи B, чтобы иметь соответствующие разрешения для доступа к ключу KMS в учетной записи A.

С точки зрения кода, я использую тот же код, что и на втором шаге, для создания экземпляра AWSKMS, хотя и с политикой IAM, созданной на шаге 3. Я получаю следующую ошибку:

com.amazonaws.services.kms.model.NotFoundException: Key 'arn:aws:kms:us-east-1:<Account B>:key/<KMS Key Id>' does not exist

Почему пытается найти ключ в учетной записи B? Это потому, что мне нужно принять роль для доступа к ключу KMS? Но документация не говорит об этом. Кроме того, я не создал ни одной политики IAM в учетной записи B для принятия роли в KMS.

Любые указатели оценены.

...