Upgrade to Pro — share decks privately, control downloads, hide ads and more …

KMSカスタマーマネージドキーのちょっと特殊な仕様3選

Avatar for Yuki Y Yuki Y
August 06, 2025
150

 KMSカスタマーマネージドキーのちょっと特殊な仕様3選

Avatar for Yuki Y

Yuki Y

August 06, 2025
Tweet

Transcript

  1. 2 • 氏名 - 山下 祐樹(やました ゆうき) • 所属 -

    日本アイ・ビー・エム システムズ・エンジニアリング 株式会社(ISE) • 普段の業務 - AWSインフラの設計構築案件に従事 • AWS資格 - 2023/2025 Japan AWS All Certifications Engineers 自己紹介
  2. 8 • 以下サンプルのようにキーポリシーを記載する。 • サンプルのPrincipal(赤枠)はrootユーザーのみではなく、アカウント全体を指している。(※1) • この状態で、IAMポリシーにKMSキーの許可設定を追加すれば、キーの操作が可能。(※2) KMSのキーポリシーでIAMによるアクセスを許可する方法 { "Id":

    "sample-key-policy", "Version": "2012-10-17", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::{accound-id}:root" }, "Action": "kms:*", "Resource": "*" } ] } (※1) https://docs.aws.amazon.com/IAM/lates t/UserGuide/reference_policies_element s_principal.html#principal-accounts (※2) https://docs.aws.amazon.com/ja_jp/kms /latest/developerguide/key-policy- default.html#key-policy-default-allow- root-enable-iam
  3. 10 • 具体例 - KMSカスタマーマネージドキーで暗号化したS3に対し、ファイルアップロード・ダウンロードができない。 - KMSカスタマーマネージドキーで暗号化したEBSボリュームを、EC2にアタッチできない。 (※) • 原因

    - KMSで暗号化されたリソースを操作しようとした場合、送信元IPがIAMユーザーではなく、そのリソース に関連付けられたIPアドレスになる場合があるため。 - 上記の例では、S3やEC2に関連づけられたIPアドレス。 - CloudTrailログでは、具体的なアドレスは表示されず、”AWS Internal” と表示される。(次項参照) IAMユーザーにIP制限がかかった状態で、KMSが利用できない具体例と原因 (※) https://docs.aws.amazon.com/ja_jp/kms/latest/developerguide/conditions-aws.html#conditions-aws-ip-address
  4. 11 CloudTrailのログサンプル(関係ない項目は一部省略) { "eventVersion": "1.09", "userIdentity": { "type": "IAMUser", "principalId":

    "AIDATO53XXXXXXXXKR5DN", "arn": "arn:aws:iam::xxxxxxxxxxxx:user/KMS-SourceIP-Limit-Test", "accountId": "xxxxxxxxxxxx", "accessKeyId": "ASIATO53XXXXXXXX4B3N", "userName": "KMS-SourceIP-Limit-Test", "sessionContext": { "attributes": { "creationDate": "2024-09-11T23:27:27Z", "mfaAuthenticated": "false" } }, "invokedBy": "AWS Internal" }, "eventTime": "2024-09-11T23:29:45Z", "eventSource": "kms.amazonaws.com", "eventName": "GenerateDataKey", "awsRegion": "ap-northeast-1", "sourceIPAddress": "AWS Internal", "userAgent": "AWS Internal", "errorCode": "AccessDenied", "errorMessage": "User: arn:aws:iam::xxxxxxxxxxxx:user/KMS-SourceIP-Limit-Test is not authorized to perform: kms:GenerateDataKey on resource: arn:aws:kms:ap-northeast-1:xxxxxxxxxxxx:key/c9cdbfe6-xxxx- xxxx-xxxx-7adba90f5f3d with an explicit deny in an identity-based policy", "readOnly": true, "eventType": "AwsApiCall", "managementEvent": true, "eventCategory": "Management", "sessionCredentialFromConsole": "true" } アクションの実行者は IAMユーザーになっている 送信元IPアドレスが “AWS Internal” になっている IAMポリシーでDenyされたと いうエラーメッセージが表示 されている
  5. 14 ECRの場合 – キーポリシーサンプル • IAMユーザーに、kms:CreateGrant・ kms:DescribeKey・kms:RetireGrant権限が必要。 • kms:RetireGrantは、キーポリシーではなくIAM ポリシー側に付与する必要がある。(※)

    (他の二つはIAMポリシーとキーポリシーのど ちらでも良い) { "Id": "sample-key-policy", "Version": "2012-10-17", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::{accound-id}:root" }, "Action": "kms:*", "Resource": "*" }, { "Sid": "Allow Grant", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::{accound-id}:user/{user-name}" }, "Action": [ "kms:CreateGrant", "kms:DescribeKey" ], "Resource": "*" } ] } (※) https://docs.aws.amazon.com/AmazonECR/latest/userg uide/encryption-at-rest.html#encryption-at-rest-iam
  6. 16 Secrets Managerの場合 – キーポリシーサンプル • シークレットを利用する主体に、KMSの利用権 限を付与。 (左図の赤枠) •

    IAMにKMSへのアクセス権限を与えたうえで、 IAMポリシーに権限を追加する方式でもOK。 • シークレットを取得するだけならDecrypt権限の みでOK。シークレット操作と必要なKMS権限の 関係性は下記公式ドキュメントを参照 (※) { "Version": "2012-10-17", "Id": “Secrets-Manager-sample-policy", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::{accound-id}:root" }, "Action": "kms:*", "Resource": "*" }, { "Sid": "Enable IAM Role Permissions", "Effect": "Allow", "Principal": { “AWS": "arn:aws:iam::{accound-id}:role/{role-name}" }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:GenerateDataKey", "kms:Describe*" ], "Resource": "*" } ] } (※) https://docs.aws.amazon.com/ja_jp/secretsmanager/lat est/userguide/security-encryption.html#security- encryption-using-cmk
  7. 18 CloudWatch Logsの場合 – キーポリシーサンプル • PrincipalにCloudWatch Logsのサービスプリンシ パルを指定。 •

    Condition句でEncriptionContextを指定すること で、KMSキーを利用可能なロググループを指定 することが可能。 { "Version": "2012-10-17", "Id": "logs-sample-policy", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "logs.{region}.amazonaws.com" }, "Action": [ "kms:Encrypt*", "kms:Decrypt*", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:Describe*" ], "Resource": "*", "Condition": { "ArnEquals": { "kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:{region}:{account-id}:log-group:{log-group- name}" } } } ] } https://docs.aws.amazon.com/ja_jp/AmazonCloudWatc h/latest/logs/encrypt-log-data-kms.html
  8. FIN