2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWSのポリシー試験メモ

Posted at

AWS IAMポリシー完全解説:実践的なパターンと詳細解説

基本構造

すべてのIAMポリシーは以下の基本構造に従います:

{
    "Version": "2012-10-17",
    "Statement": [/* ステートメントの配列 */]
}

一般的なパターン集

1. S3バケットの基本的なアクセス制御

1.1 フルアクセス権限

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowS3FullAccess",
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket",
                "arn:aws:s3:::my-bucket/*"
            ]
        }
    ]
}

解説:

  • s3:*: すべてのS3アクションを許可
  • バケット自体(my-bucket)とその中のオブジェクト(my-bucket/*)の両方を指定
  • 本番環境では避けるべき広範な権限

1.2 読み取り専用アクセス

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowS3ReadOnly",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket",
                "arn:aws:s3:::my-bucket/*"
            ]
        }
    ]
}

解説:

  • s3:GetObject: オブジェクトの読み取りのみ許可
  • s3:ListBucket: バケット内のオブジェクト一覧表示を許可

2. 条件付きアクセス制御

2.1 特定パスへのアクセス制限

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowSpecificPathAccess",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::my-bucket/specific-path/*",
            "Condition": {
                "StringEquals": {
                    "aws:username": "specific-user"
                }
            }
        }
    ]
}

解説:

  • 特定のパス配下のみにアクセスを制限
  • 特定のユーザーのみにアクセスを許可
  • Get/Putの操作のみを許可

2.2 IP制限によるアクセス制御

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DenyAccessFromUntrustedNetwork",
            "Effect": "Deny",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "192.0.2.0/24",
                        "203.0.113.0/24"
                    ]
                }
            }
        }
    ]
}

解説:

  • 特定のIP範囲以外からのアクセスを拒否
  • DenyAllowより優先される
  • すべてのリソースとアクションに適用

3. タグベースのアクセス制御

3.1 EC2インスタンスの制御

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowTagBasedAccess",
            "Effect": "Allow",
            "Action": [
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/Environment": "Production"
                }
            }
        }
    ]
}

解説:

  • タグに基づいてEC2インスタンスの操作を制限
  • "Environment": "Production"タグが付いたリソースのみ操作可能

4. 高度な条件設定

4.1 時間制限付きアクセス

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowAccessDuringBusinessHours",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "*",
            "Condition": {
                "DateGreaterThan": {
                    "aws:CurrentTime": "2024-01-01T09:00:00Z"
                },
                "DateLessThan": {
                    "aws:CurrentTime": "2024-12-31T17:00:00Z"
                },
                "Bool": {
                    "aws:MultiFactorAuthPresent": "true"
                }
            }
        }
    ]
}

解説:

  • 特定の時間帯のみアクセスを許可
  • MFA認証を必須に設定
  • 時間制限とMFA認証の組み合わせによる多層防御

4.2 リクエスト条件による制御

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowSecureTransport",
            "Effect": "Deny",
            "Action": "s3:*",
            "Resource": "*",
            "Condition": {
                "Bool": {
                    "aws:SecureTransport": "false"
                }
            }
        },
        {
            "Sid": "AllowSpecificEncryption",
            "Effect": "Deny",
            "Action": "s3:PutObject",
            "Resource": "*",
            "Condition": {
                "StringNotEquals": {
                    "s3:x-amz-server-side-encryption": "AES256"
                }
            }
        }
    ]
}

解説:

  • HTTPS通信の強制
  • サーバーサイド暗号化の強制
  • セキュリティ要件の確実な実施

5. 複合条件を使用した高度な制御

5.1 複数条件の組み合わせ

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ComplexConditionAccess",
            "Effect": "Allow",
            "Action": [
                "ec2:RunInstances"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:RequestTag/Project": "Alpha",
                    "ec2:InstanceType": ["t2.micro", "t3.micro"]
                },
                "DateGreaterThan": {
                    "aws:CurrentTime": "2024-01-01T00:00:00Z"
                },
                "NumericLessThanEquals": {
                    "aws:MultiFactorAuthAge": "3600"
                }
            }
        }
    ]
}

解説:

  • 特定のプロジェクトタグを持つインスタンスのみ起動可能
  • インスタンスタイプを制限
  • MFA認証後1時間以内のみ有効
  • 開始日時の指定

AWS S3バケットポリシー完全解説:実践パターンと詳細ガイド

基本構造

S3バケットポリシーの基本構造は以下の通りです:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ステートメントの識別子",
            "Effect": "Allow/Deny",
            "Principal": {"AWS": "arn:aws:iam::アカウントID:ユーザー/グループ"},
            "Action": ["s3:アクション"],
            "Resource": ["arn:aws:s3:::バケット名/*"],
            "Condition": {
                "条件演算子": {
                    "条件キー": "値"
                }
            }
        }
    ]
}

一般的なユースケース

1. パブリックアクセスの許可

1.1 特定のフォルダを公開

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowPublicRead",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::my-website-bucket/public/*"
        }
    ]
}

解説:

  • Principal: "*" で全ユーザーにアクセスを許可
  • Resource: public/配下のみを公開
  • 静的ウェブサイトホスティングに適している

1.2 CloudFrontからのアクセス制限

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowCloudFrontOnly",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::my-cdn-bucket/*",
            "Condition": {
                "StringEquals": {
                    "aws:UserAgent": "Amazon CloudFront"
                }
            }
        },
        {
            "Sid": "DenyDirectAccess",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::my-cdn-bucket/*",
            "Condition": {
                "StringNotEquals": {
                    "aws:UserAgent": "Amazon CloudFront"
                }
            }
        }
    ]
}

解説:

  • CloudFront Origin Access Identity (OAI)経由のアクセスのみ許可
  • 直接アクセスを明示的に拒否
  • CDNを使用したコンテンツ配信に最適

2. クロスアカウントアクセス

2.1 特定のAWSアカウントへの権限付与

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowCrossAccountAccess",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:root"
            },
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::shared-bucket",
                "arn:aws:s3:::shared-bucket/*"
            ]
        }
    ]
}

解説:

  • 特定のAWSアカウントに読み取り権限を付与
  • バケットとオブジェクトレベルの両方の権限を指定
  • 組織間でのデータ共有に使用

2.2 ロールベースのクロスアカウントアクセス

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowCrossAccountRole",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:role/CrossAccountS3Access"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::shared-bucket/*",
            "Condition": {
                "StringEquals": {
                    "aws:PrincipalOrgID": "o-xxxxxxxxxxx"
                }
            }
        }
    ]
}

解説:

  • 特定のIAMロールにアクセス権限を付与
  • AWS Organizations IDによる制限
  • より細かな権限管理が可能

3. VPCエンドポイントからのアクセス制御

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VPCEndpointAccess",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::private-bucket/*",
            "Condition": {
                "StringEquals": {
                    "aws:sourceVpce": "vpce-11111111"
                }
            }
        },
        {
            "Sid": "DenyNonVPCAccess",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::private-bucket/*",
            "Condition": {
                "StringNotEquals": {
                    "aws:sourceVpce": "vpce-11111111"
                }
            }
        }
    ]
}

解説:

  • 特定のVPCエンドポイントからのアクセスのみを許可
  • プライベートネットワークからのアクセスを強制
  • セキュアなデータアクセスに適している

4. 暗号化とセキュリティ設定

4.1 暗号化の強制

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DenyUnencryptedUploads",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::encrypted-bucket/*",
            "Condition": {
                "StringNotEquals": {
                    "s3:x-amz-server-side-encryption": "AES256"
                }
            }
        },
        {
            "Sid": "DenyHTTP",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::encrypted-bucket/*",
            "Condition": {
                "Bool": {
                    "aws:SecureTransport": "false"
                }
            }
        }
    ]
}

解説:

  • サーバーサイド暗号化を強制
  • HTTPSのみを許可
  • セキュリティ要件の厳格な環境に適している

5. 高度な条件設定

5.1 IPアドレスとタイムベース制御

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ComplexConditionAccess",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:root"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::restricted-bucket/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "192.0.2.0/24",
                        "203.0.113.0/24"
                    ]
                },
                "DateGreaterThan": {
                    "aws:CurrentTime": "2024-01-01T00:00:00Z"
                },
                "DateLessThan": {
                    "aws:CurrentTime": "2024-12-31T23:59:59Z"
                }
            }
        }
    ]
}

解説:

  • IP制限による access制御
  • 時間ベースのアクセス制限
  • 複数の条件を組み合わせた高度な制御

AWS Service Control Policy (SCP) 完全解説:実践パターンと詳細ガイド

SCPの基本概念

SCPとは

Service Control Policy (SCP)は、AWS Organizations内の組織単位(OU)やアカウントに対して、最大許可権限を制御するポリシーです。

基本構造

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ステートメントの識別子",
            "Effect": "Allow/Deny",
            "Action": ["サービス名:アクション"],
            "Resource": ["リソースARN"],
            "Condition": {
                "条件演算子": {
                    "条件キー": "値"
                }
            }
        }
    ]
}

一般的なユースケース

1. リージョン制限

1.1 特定リージョンのみ許可

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowSpecificRegions",
            "Effect": "Deny",
            "NotAction": [
                "iam:*",
                "organizations:*",
                "route53:*",
                "budgets:*",
                "support:*",
                "health:*"
            ],
            "Resource": "*",
            "Condition": {
                "StringNotEquals": {
                    "aws:RequestedRegion": [
                        "ap-northeast-1",
                        "us-east-1"
                    ]
                }
            }
        }
    ]
}

解説:

  • グローバルサービスを除外
  • 指定したリージョン以外でのリソース作成を禁止
  • コンプライアンス要件に対応

2. サービス制限

2.1 特定サービスの使用禁止

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DenySpecificServices",
            "Effect": "Deny",
            "Action": [
                "lambda:*",
                "dynamodb:*",
                "eks:*"
            ],
            "Resource": "*"
        }
    ]
}

解説:

  • 特定のサービスの使用を完全に禁止
  • コスト管理やセキュリティ要件に有効
  • 組織の標準化を促進

2.2 特定のインスタンスタイプのみ許可

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowSpecificEC2Types",
            "Effect": "Deny",
            "Action": "ec2:RunInstances",
            "Resource": "arn:aws:ec2:*:*:instance/*",
            "Condition": {
                "StringNotLike": {
                    "ec2:InstanceType": [
                        "t3.*",
                        "t4g.*"
                    ]
                }
            }
        }
    ]
}

解説:

  • コスト効率の高いインスタンスタイプのみを許可
  • 予期しないコストの発生を防止
  • リソース使用の標準化

3. タグ付けポリシー

3.1 必須タグの強制

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "EnforceTagging",
            "Effect": "Deny",
            "Action": [
                "ec2:RunInstances",
                "rds:CreateDBInstance",
                "s3:CreateBucket"
            ],
            "Resource": "*",
            "Condition": {
                "Null": {
                    "aws:RequestTag/Environment": "true",
                    "aws:RequestTag/CostCenter": "true"
                }
            }
        }
    ]
}

解説:

  • 必須タグが付与されていない場合、リソース作成を拒否
  • コスト管理とガバナンスの強化
  • リソースの追跡性向上

4. セキュリティ制御

4.1 パブリックアクセスの制限

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DenyPublicAccess",
            "Effect": "Deny",
            "Action": [
                "s3:PutBucketPublicAccessBlock",
                "s3:DeleteBucketPublicAccessBlock",
                "s3:PutBucketPolicy",
                "s3:DeleteBucketPolicy"
            ],
            "Resource": "*"
        },
        {
            "Sid": "DenyPublicRDSInstances",
            "Effect": "Deny",
            "Action": "rds:CreateDBInstance",
            "Resource": "*",
            "Condition": {
                "Bool": {
                    "rds:PubliclyAccessible": "true"
                }
            }
        }
    ]
}

解説:

  • S3バケットの公開設定変更を禁止
  • パブリックにアクセス可能なRDSインスタンスの作成を禁止
  • セキュリティリスクの低減

4.2 暗号化の強制

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "EnforceEncryption",
            "Effect": "Deny",
            "Action": [
                "s3:PutObject",
                "ebs:CreateVolume",
                "rds:CreateDBInstance"
            ],
            "Resource": "*",
            "Condition": {
                "Bool": {
                    "aws:SecureTransport": "false"
                }
            }
        },
        {
            "Sid": "DenyUnencryptedVolumes",
            "Effect": "Deny",
            "Action": "ec2:CreateVolume",
            "Resource": "*",
            "Condition": {
                "Bool": {
                    "ec2:Encrypted": "false"
                }
            }
        }
    ]
}

解説:

  • HTTPS通信の強制
  • 暗号化されていないボリュームの作成を禁止
  • データ保護要件への対応

5. 高度な制御パターン

5.1 時間帯による制限

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DenyOutOfBusinessHours",
            "Effect": "Deny",
            "Action": [
                "ec2:RunInstances",
                "rds:CreateDBInstance"
            ],
            "Resource": "*",
            "Condition": {
                "DateNotEquals": {
                    "aws:CurrentTime": [
                        "2024-T09:00:00Z",
                        "2024-T17:00:00Z"
                    ]
                }
            }
        }
    ]
}

解説:

  • 業務時間外のリソース作成を制限
  • コスト管理の強化
  • 運用の標準化

5.2 IP制限とMFA強制

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "EnforceSecureAccess",
            "Effect": "Deny",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "192.0.2.0/24",
                        "203.0.113.0/24"
                    ]
                }
            }
        },
        {
            "Sid": "RequireMFA",
            "Effect": "Deny",
            "Action": [
                "iam:*",
                "ec2:*"
            ],
            "Resource": "*",
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": "false"
                }
            }
        }
    ]
}

解説:

  • 特定のIP範囲からのアクセスのみ許可
  • 重要な操作にMFAを強制
  • セキュリティの多層防御

セキュリティベストプラクティス

1. 最小権限の原則

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowBasicServices",
            "Effect": "Allow",
            "Action": [
                "ec2:Describe*",
                "s3:List*",
                "rds:Describe*"
            ],
            "Resource": "*"
        },
        {
            "Sid": "DenyAllElse",
            "Effect": "Deny",
            "NotAction": [
                "ec2:Describe*",
                "s3:List*",
                "rds:Describe*",
                "iam:GetUser",
                "sts:GetCallerIdentity"
            ],
            "Resource": "*"
        }
    ]
}

2. 段階的な制限

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowProductionOU",
            "Effect": "Allow",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:PrincipalOrgPath": "/Production/"
                }
            }
        },
        {
            "Sid": "RestrictDevelopmentOU",
            "Effect": "Deny",
            "Action": [
                "organizations:*",
                "account:*"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:PrincipalOrgPath": "/Development/"
                }
            }
        }
    ]
}

制限と注意点

1. SCPの継承と優先順位

  • SCPは組織のルートから継承される
  • Deny は常に Allow よりも優先される
  • 親OUの制限は子OUやアカウントに引き継がれる

AWS KMS Key Policy 完全解説:実践パターンと詳細ガイド

基本概念

Key Policyとは

KMS Key Policyは、AWS KMSカスタマーマスターキー(CMK)へのアクセスを制御するリソースベースのポリシーです。

基本構造

{
    "Version": "2012-10-17",
    "Id": "key-policy-1",
    "Statement": [
        {
            "Sid": "Enable IAM User Permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        }
    ]
}

一般的なユースケース

1. デフォルトKey Policy

1.1 基本的なアクセス制御

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "EnableIAMUserPermissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "AdminAccess",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/AdminUser"
            },
            "Action": [
                "kms:Create*",
                "kms:Describe*",
                "kms:Enable*",
                "kms:List*",
                "kms:Put*",
                "kms:Update*",
                "kms:Revoke*",
                "kms:Disable*",
                "kms:Get*",
                "kms:Delete*",
                "kms:ScheduleKeyDeletion",
                "kms:CancelKeyDeletion"
            ],
            "Resource": "*"
        }
    ]
}

解説:

  • アカウントrootユーザーに完全な権限を付与
  • 管理者ユーザーに管理権限を付与
  • 基本的なキー管理操作を許可

2. クロスアカウントアクセス

2.1 特定のAWSアカウントへの暗号化権限付与

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DefaultKeyPolicy",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "CrossAccountEncryption",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::444455556666:root"
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:DescribeKey"
            ],
            "Resource": "*"
        }
    ]
}

解説:

  • 別のAWSアカウントに暗号化/復号の権限を付与
  • 必要最小限の権限のみを許可
  • キー管理操作は制限

2.2 ロールベースのクロスアカウントアクセス

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DefaultKeyPolicy",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "CrossAccountRole",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::444455556666:role/CrossAccountKMSRole"
            },
            "Action": [
                "kms:Decrypt",
                "kms:GenerateDataKey*"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:PrincipalOrgID": "o-xxxxxxxxxxx"
                }
            }
        }
    ]
}

解説:

  • 特定のIAMロールに限定的な権限を付与
  • Organizations IDによる追加制限
  • 復号と鍵生成のみを許可

3. サービス固有の権限

3.1 S3暗号化用の設定

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DefaultKeyPolicy",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "AllowS3Encryption",
            "Effect": "Allow",
            "Principal": {
                "Service": "s3.amazonaws.com"
            },
            "Action": [
                "kms:GenerateDataKey*",
                "kms:Decrypt"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "111122223333"
                }
            }
        }
    ]
}

解説:

  • S3サービスに必要な暗号化権限を付与
  • ソースアカウントによる制限
  • 最小権限の原則に従う

3.2 Lambda関数用の設定

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DefaultKeyPolicy",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "AllowLambdaEncryption",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:role/LambdaExecutionRole"
            },
            "Action": [
                "kms:Decrypt",
                "kms:GenerateDataKey"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "kms:ViaService": "lambda.amazonaws.com"
                }
            }
        }
    ]
}

解説:

  • Lambda実行ロールに必要な権限を付与
  • サービス制限による追加のセキュリティ
  • 特定のサービスからの使用に限定

4. 高度な条件付きアクセス

4.1 暗号化コンテキストの強制

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DefaultKeyPolicy",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "RequireEncryptionContext",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:role/AppRole"
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:GenerateDataKey*"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "kms:EncryptionContext:AppName": "MyApp",
                    "kms:EncryptionContext:Environment": [
                        "Production",
                        "Staging"
                    ]
                }
            }
        }
    ]
}

解説:

  • 暗号化コンテキストの必須化
  • アプリケーションとデータの関連付け
  • 環境による制限

4.2 キーの使用制限

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DefaultKeyPolicy",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "RestrictKeyUsage",
            "Effect": "Deny",
            "Principal": "*",
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:GenerateDataKey*"
            ],
            "Resource": "*",
            "Condition": {
                "DateNotEquals": {
                    "aws:CurrentTime": [
                        "2024-T09:00:00Z",
                        "2024-T17:00:00Z"
                    ]
                }
            }
        }
    ]
}

解説:

  • 時間帯による使用制限
  • 明示的な拒否による強制
  • 業務時間外の使用防止

セキュリティベストプラクティス

1. キー管理者と利用者の分離

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "KeyAdministration",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:role/KeyAdminRole"
            },
            "Action": [
                "kms:Create*",
                "kms:Describe*",
                "kms:Enable*",
                "kms:List*",
                "kms:Put*",
                "kms:Update*",
                "kms:Revoke*",
                "kms:Disable*",
                "kms:Get*",
                "kms:Delete*",
                "kms:TagResource",
                "kms:UntagResource"
            ],
            "Resource": "*"
        },
        {
            "Sid": "KeyUsage",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:role/KeyUserRole"
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:GenerateDataKey*"
            ],
            "Resource": "*"
        }
    ]
}

2. 監査と制御

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "EnableAuditLogging",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudtrail.amazonaws.com"
            },
            "Action": [
                "kms:GenerateDataKey*",
                "kms:DescribeKey"
            ],
            "Resource": "*",
            "Condition": {
                "StringLike": {
                    "kms:EncryptionContext:aws:cloudtrail:arn": [
                        "arn:aws:cloudtrail:*:111122223333:trail/*"
                    ]
                }
            }
        }
    ]
}
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?