Как выглядит хорошая политика ключей KMS для AWS Landing Zone (Control Tower)?

Как выглядит хорошая политика ключей KMS для AWS Landing Zone (Control Tower)?

Недавно я «сломал» Control Tower, вручную добавив ключ KMS в темы SNS Control Tower. Это не сработало, когда Control Tower выполнила проверку или обновление стеков. Мне пришлось удалить ключ и подтолкнуть некоторые стеки, чтобы привести их в работоспособное состояние, но теперь темы SNS не зашифрованы, и Security Hub недоволен.

Ранее я развернул ключ KMS для использования в SNS-темах для всех учетных записей организации (по одному в каждой), но теперь я понимаю, что Control Tower может сделать это для меня, если я дам ему ключ при создании или изменении Landing Zone. Насколько я понимаю, этот ключ должен быть единственным ключом в учетной записи управления и с политикой, которая разрешает как минимум службы Config и CloudTrail, но также доступна для использования во всех моих учетных записях.

Если кто-нибудь может предоставить мне шаблон того, как это будет выглядеть, я буду очень благодарен. Пожалуйста и спасибо. :)

решение1

Я не мог оставить это так, поэтому провел тестирование и пришел к выводу, что следующее, вероятно, является хорошим решением.

Ключевые моменты, которые я усвоил:

  • Похоже, службам нужны только разрешения «kms:GenerateDataKey».
  • Используйте условие «StringLike», а не «StringEquals», если вам нужен *-wildcard

Этотдокументациябыло весьма полезно. Мне не удалось создать политику, которая использовала бы "aws:SourceArn" или "aws:SourceAccount", но мне удалось с "kms:EncryptionContext:context".

Вот мой полис, номера счетов отредактированы:

{
    "Version": "2012-10-17",
    "Id": "SNS-KMS-Key",
    "Statement": [
        {
            "Sid": "Key admin in mgmt account",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::112211221122:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "AWS-services permissions in all accounts",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "config.amazonaws.com",
                    "cloudtrail.amazonaws.com"
                ]
            },
            "Action": [
                "kms:GenerateDataKey",
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:DescribeKey",
                "kms:ReEncrypt*"
            ],
            "Resource": "*"
        }
    ]
}

Надеюсь, кто-то найдет это полезным. Обратите внимание, что я подозреваю, что вы могли бы и, возможно, должны использовать условия для ограничения последнего утверждения. У меня самого это не сработало.

решение2

Мне удалось заставить это работать, применив комбинацию из ответа выше, а также разрешив следующим ролям сервиса AWS использовать ключ:

"arn:aws:iam::112211221122:role/service-role/AWSControlTowerConfigAggregatorRoleForOrganizations",
"arn:aws:iam::112211221122:role/service-role/AWSControlTowerStackSetRole",
"arn:aws:iam::112211221122:role/service-role/AWSControlTowerAdmin",
"arn:aws:iam::112211221122:role/service-role/AWSControlTowerCloudTrailRole"

Я не знаю, нужно ли все это или нет, я просто предположил.

Связанный контент