AWS Control Tower の有効化時に使用するAWS KMS KeyをCloudFormationで作成して、暗号化を有効にしてみた

2024.03.25

AWS Control Tower でランディングゾーンの作成また更新時にKMS キーによる暗号化また復号の設定を行うことができます。

その際に必要となるKMS キーなのですが、いくつか条件があり、手作業でやると煩雑でしたので、CloudFormationテンプレートを作成して、リソースの作成を行いましたのでテンプレートを共有します。

AWS KMS キーの条件

ランディングゾーンで使用する際に、使用できるKMSキーは以下の条件があります。

  • 有効である
  • 対称キーである
  • マルチリージョンキーではない
  • ポリシーに正しい許可が追加されている
    • Config サービスに対して、暗号化また復号の許可が設定されている
    • CloudTrailサービスに対して、暗号化また復号の許可が設定されている
  • キーが管理アカウントにある
  • ランディングゾーンのホームリージョンと同一のリージョンにある

参考

AWS KMS keysの設定 (任意) - AWS Control Tower

やってみた

CloudFormation テンプレート

Parameters:
  ControlTowerKmsAliasName:
    Type: String
    Default: ct-kms-key

Resources:
  ControlTowerKmsKey:
    Type: "AWS::KMS::Key"
    Properties:
      Description: "The AWS Key used in AWS Control Tower for encryption and decryption in the landing zone"
      Origin: "AWS_KMS"
      KeyUsage: "ENCRYPT_DECRYPT"
      Enabled: true
      KeySpec: "SYMMETRIC_DEFAULT"
      MultiRegion: false
      KeyPolicy:
        Version: "2012-10-17"
        Statement:
        - Sid: "Enable IAM User Permissions"
          Effect: "Allow"
          Action: "kms:*"
          Principal:
            AWS: !Sub "arn:aws:iam::${AWS::AccountId}:root"
          Resource: "*"
        - Sid: "Allow Config to use KMS for encryption"
          Effect: "Allow"
          Action: 
            - "kms:GenerateDataKey"
            - "kms:Decrypt"
          Principal:
            Service: "config.amazonaws.com"
          Resource: "*"
        - Sid: "Allow CloudTrail to use KMS for encryption"
          Effect: "Allow"
          Action: 
            - "kms:GenerateDataKey"
            - "kms:Decrypt"
          Principal:
            Service: "cloudtrail.amazonaws.com"
          Condition:
            StringEquals:
              aws:SourceArn: !Sub "arn:aws:cloudtrail:${AWS::Region}:${AWS::AccountId}:trail/aws-controltower-BaselineCloudTrail"
            StringLike:
              kms:EncryptionContext:aws:cloudtrail:arn: !Sub "arn:aws:cloudtrail:*:${AWS::AccountId}:trail/*"
          Resource: "*"
      EnableKeyRotation: false
      Tags: []

  ControlTowerKmsAlias:
    Type: "AWS::KMS::Alias"
    Properties:
      TargetKeyId: !Ref ControlTowerKmsKey
      AliasName: !Sub alias/${ControlTowerKmsAliasName}

Outputs:
  ControlTowerKmsKeyId:
    Description: "ID of Control Tower KMS key"
    Value: !Ref ControlTowerKmsKey

AWS KMS キーの作成

上記のテンプレートを使用して、CloudFormationよりKMSキーのスタックを作成します。

スタック名また、パラメータを設定します。

ControlTowerKmsAliasName は作成したAWS KMSキーのエイリアス名となります。任意のキー名を設定してください

その他はデフォルトの設定でスタックの作成を行います。

KMS Key ID の取得

正常にスタックが作成されたら、KMS Key また、KSM Aliasが作成されているかと思います。

また、出力に、ランディングゾーンの作成、また更新時に指定するKMS Key ID が出力されていますので、メモします

AWS Contorl Tower のランディングゾーンのKMS 暗号化設定を行う

AWS コンソールより、AWS Control Tower ランディングゾーン設定 の更新を行います。新規作成の場合もKMS キーの選択部分は大きく差異ありませんのでご参考ください

ランディングゾーンのページより設定を変更するを押下します。

KMS 暗号化の設定で、

[暗号化設定を有効にして、カスタマイズする] にチェックをいれます。

先ほど、メモした、KMS Key ID を [AWS KMS カスタマーキーを選択する]の部分に設定すると、情報が取得されます。

キーエイリアスなどが、設定した KMS キー と一致するか確認してください。

ランディングゾーンの更新を行います。

更新が完了するまで待ちます。

正常に設定が行われると下記状態となり、KMS キーの暗号化の部分に KMS Key ID が表示されます。

なお、ランディングゾーンの更新がおこなわれているので、メッセージにあるとおり、必要に応じて、アカウントの更新 を行ってください

更新したいアカウントを選択し、アカウントの更新を実施します

まとめ

繰り返しになりますが、KMS キーの設定を間違うとキーへのアクセスができなくなる場合や、ランディングゾーンの更新が失敗してしまう状況もありえますので、Cloudformationでさくっと作れるようにしてみました。

ログの暗号化要件が出てきた場合などにご参考ください

また、同設定をコンソールから実施する場合は、下記の参考情報などをご参考ください

参考

[アップデート] Control Tower で管理下アカウントに対して一括で KMS 暗号化設定ができる様になりました https://dev.classmethod.jp/articles/update-control-tower-kms-support/