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範囲以外からのアクセスを拒否
-
Deny
はAllow
より優先される - すべてのリソースとアクションに適用
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/*"
]
}
}
}
]
}