KMSキーポリシーの権限の見直し

KMSキーの実際の権限を確認し、必要な利用者・サービスに限定しながら管理と復旧の経路を維持してください。

説明

KMSキーポリシーで不要な主体に復号やキー管理の権限を与えると、データ保護やキーの可用性に影響する可能性があります。キーの利用と管理を分け、実際のキーポリシー、IAM権限、KMSグラントを併せて確認してください。

キーポリシーのResource: "*"は、すべてのキーではなく、そのポリシーを関連付けたキーを表します。APIでポリシーを省略して新しいキーを作ると、所有アカウントがIAMポリシーで権限を委任できるデフォルトポリシーが適用されます。ワイルドカードを使うという理由だけで、この委任や必要な管理権限を削除しないでください。

想定される影響

  • 不要な復号・管理権限が実際に付与されると、データへのアクセスが広がったり、キーを使うサービスが中断したりする可能性があります。
  • 必要な管理権限を削除すると、以後キーポリシーを変更できなくなる場合があります。形式的に条件を追加するだけではアクセスを制限できません。

対処方法

  1. 実際のポリシーと必要なユーザー・ロール・サービスを確認し、利用と管理の権限をそれぞれ最小限にしてください。amazon.aws 11.4.0では、既存キーの管理時にポリシーを省略すると現在のポリシーが維持されます。
  2. 必要な主体・操作と有効な条件にアクセスを限定してください。kms:CallerAccountは要求を開始したアカウント、kms:ViaServiceは主体に代わって要求する対応AWSサービスを制限します。実際のアカウント、リージョン、サービス経路に合わせて許可・拒否をテストしてください。
  3. 今後kms:PutKeyPolicyを呼び出すための管理経路を維持し、ロックアウト安全性チェックを回避しないでください。変更後にキーの管理、復旧、必要なサービスアクセスを確認してください。

例

my-kms-keyは実際のエイリアスに置き換えてください。変更後のkey_account_idはキーの所有アカウント、aws_regionはEC2/EBSがキーを使うリージョンです。既存ポリシーの必要なステートメントを残し、デプロイ主体がIAM権限を通じて引き続きポリシーを管理できることを適用前に確認してください。

変更前

yaml
- name: Update IAM policy on an existing KMS key
  amazon.aws.kms_key:
    alias: my-kms-key
    policy:
      Version: "2012-10-17"
      Id: auto-ebs-2
      Statement:
        - Action:
            - "kms:*"
          Effect: Allow
          Principal:
            AWS: "*"
          Resource: "*"
          Sid: Allow access through EBS for all principals
    state: present

アカウントやサービスの条件を設けず、主体と操作を広く許可しています。実際に適用されるほかの制御も確認する必要があります。

変更後

yaml
- name: Update IAM policy on an existing KMS key
  amazon.aws.kms_key:
    alias: my-kms-key
    policy: |
      {
        "Id": "auto-ebs-2",
        "Statement": [
          {
            "Sid": "EnableIAMUserPermissions",
            "Effect": "Allow",
            "Principal": {"AWS": "arn:aws:iam::{{ key_account_id }}:root"},
            "Action": "kms:*",
            "Resource": "*"
          },
          {
            "Action": [
              "kms:Encrypt",
              "kms:Decrypt",
              "kms:ReEncrypt*",
              "kms:GenerateDataKey*",
              "kms:CreateGrant",
              "kms:DescribeKey"
            ],
            "Condition": {
              "StringEquals": {
                "kms:CallerAccount": "{{ key_account_id }}",
                "kms:ViaService": "ec2.{{ aws_region }}.amazonaws.com"
              }
            },
            "Effect": "Allow",
            "Principal": {
              "AWS": "*"
            },
            "Resource": "*",
            "Sid": "Allow controlled access through EBS"
          }
        ],
        "Version": "2012-10-17"
      }
    state: present

最初のステートメントは、所有アカウントのIAMポリシーによる委任を維持します。二つ目は、指定アカウントのEC2/EBSを経由する利用に限定します。必要な利用・管理権限と、既存ポリシーのほかのステートメントを併せて確認してください。

参考資料