У меня есть учетная запись 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.
Любые указатели оценены.