Como é uma boa política de chave KMS para AWS Landing Zone (Control Tower)?

Como é uma boa política de chave KMS para AWS Landing Zone (Control Tower)?

Recentemente, "quebrei" a Control Tower adicionando manualmente uma chave KMS aos tópicos SNS da Control Tower. Isso não funcionou muito bem quando a Control Tower fez uma verificação ou atualização nas pilhas. Tive que remover a chave e empurrar algumas pilhas para colocá-la em um estado íntegro, mas agora os tópicos do SNS não estão criptografados e o Security Hub está insatisfeito.

Anteriormente, implantei uma chave KMS para uso em tópicos SNS em todas as contas organizacionais (uma em cada), mas agora entendo que o Control Tower pode fazer isso por mim se eu fornecer uma chave na criação ou modificação da zona de destino. Pelo que entendi essa chave tem que ser uma chave única na conta de gerenciamento e com uma política que permita pelo menos os serviços Config e CloudTrail, mas também esteja disponível para uso em todas as minhas contas.

Se alguém pudesse me fornecer um modelo de como ficaria, ficaria muito grato. Por favor e obrigado. :)

Responder1

Eu não poderia deixar isso passar, então fui testar e descobri que o seguinte é provavelmente uma boa solução.

Pontos principais que aprendi:

  • Parece que os serviços só precisam de permissões "kms: GenerateDataKey".
  • Use a condição "StringLike", não "StringEquals" se desejar *-wildcard

Essedocumentaçãofoi bastante útil. Não tive sucesso na elaboração de uma política que usasse "aws:SourceArn" ou "aws:SourceAccount", mas tive sucesso com "kms:EncryptionContext:context".

Aqui está minha política, os números da conta foram redigidos:

{
    "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": "*"
        }
    ]
}

Espero que alguém ache isso útil. Observe que suspeito que você poderia e talvez devesse usar condições para limitar a última instrução. Não consegui fazer isso funcionar sozinho.

Responder2

Consegui fazer isso funcionar por meio de uma combinação da resposta acima, além de permitir que as seguintes funções de serviço da AWS usassem a chave:

"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"

Não sei se tudo isso é necessário ou não, apenas adivinhei.

informação relacionada