AWSのポリシー試験メモ

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

## 基本構造

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

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

## 一般的なパターン集

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

#### 1.1 フルアクセス権限
```json
{
    "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 読み取り専用アクセス
```json
{
    "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 特定パスへのアクセス制限
```json
{
    "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制限によるアクセス制御
```json
{
    "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範囲以外からのアクセスを拒否
- `Deny`は`Allow`より優先される
- すべてのリソースとアクションに適用

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

#### 3.1 EC2インスタンスの制御
```json
{
    "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 時間制限付きアクセス
```json
{
    "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 リクエスト条件による制御
```json
{
    "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 複数条件の組み合わせ
```json
{
    "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バケットポリシーの基本構造は以下の通りです：

```json
{
    "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 特定のフォルダを公開
```json
{
    "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からのアクセス制限
```json
{
    "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アカウントへの権限付与
```json
{
    "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 ロールベースのクロスアカウントアクセス
```json
{
    "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エンドポイントからのアクセス制御

```json
{
    "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 暗号化の強制
```json
{
    "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アドレスとタイムベース制御
```json
{
    "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）やアカウントに対して、最大許可権限を制御するポリシーです。

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

## 一般的なユースケース

### 1. リージョン制限

#### 1.1 特定リージョンのみ許可
```json
{
    "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 特定サービスの使用禁止
```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DenySpecificServices",
            "Effect": "Deny",
            "Action": [
                "lambda:*",
                "dynamodb:*",
                "eks:*"
            ],
            "Resource": "*"
        }
    ]
}
```

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

#### 2.2 特定のインスタンスタイプのみ許可
```json
{
    "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 必須タグの強制
```json
{
    "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 パブリックアクセスの制限
```json
{
    "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 暗号化の強制
```json
{
    "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 時間帯による制限
```json
{
    "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強制
```json
{
    "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. 最小権限の原則
```json
{
    "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. 段階的な制限
```json
{
    "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）へのアクセスを制御するリソースベースのポリシーです。

### 基本構造
```json
{
    "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 基本的なアクセス制御
```json
{
    "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アカウントへの暗号化権限付与
```json
{
    "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 ロールベースのクロスアカウントアクセス
```json
{
    "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暗号化用の設定
```json
{
    "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関数用の設定
```json
{
    "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 暗号化コンテキストの強制
```json
{
    "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 キーの使用制限
```json
{
    "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. キー管理者と利用者の分離
```json
{
    "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. 監査と制御
```json
{
    "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/*"
                    ]
                }
            }
        }
    ]
}
```