I recently "broke" Control Tower by manually adding a KMS key to the Control Tower SNS-topics. This didn't work very well when Control Tower did a check or upgrade on the stacks. I had to remove the key and nudge some stacks to get it in a healthy state, but now the SNS-topics are unencrypted and Security Hub is unhappy.
Previously I deployed an KMS key for use on SNS-topics to all org accounts (one in each), but I now understand that Control Tower can do this for me if I give it a key on creation or modify of Landing Zone. From what I understand this key has to be a single key in the management account and with a policy that allows at least Config and CloudTrail services, but is also available for use in all my accounts.
If someone could please provide me with a template of how that would look I would be very grateful. Please and thank you. :)
I couldn't let this go so I went testing and found the following is likely a good solution.
Key points I learned:
This documentation was quite useful. I was not successful in crafting a policy that used "aws:SourceArn" or "aws:SourceAccount", but I did succeed with "kms:EncryptionContext:context".
Here is my policy, account no's redacted:
I hope someone finds this useful. Please note that I suspect you could and maybe should use conditions to limit the last statement. Didn't get that to work myself.
I was able to get this to work via a combination of the answer above, plus allowing the following AWS Service roles to use the key:
I don't know if all of these are needed or not, I just guessed.