はじめに
Amazon Web Services (AWS) は強力なクラウドプラットフォームですが、その利点を安全に活用するには適切なアクセス管理が不可欠です。特に個人開発者やスモールチームにとって、IAM(Identity and Access Management)の適切な設計は、セキュリティリスクの低減と運用効率の向上に直結します。
本記事では、個人開発者がAWSアカウントで実践すべきIAM管理のベストプラクティスを、具体的な手順とコード例を交えて解説します。このガイドに沿って設定することで、安全かつ効率的なAWS環境を構築しましょう。
1. IAMの基本概念と重要性
IAMはAWSリソースへのアクセスを安全に制御するためのサービスです。個人開発者であっても、適切なIAM設計は以下のメリットをもたらします:
- セキュリティリスクの低減: 不要な権限を持つアカウントが侵害された場合の影響を最小化
- 操作ミスの防止: 必要な権限のみを付与することで、誤ったリソース削除などを防止
- コスト管理: 権限制限によって意図しないリソース作成を防止
- 運用効率の向上: 適切な権限分離による管理負担の軽減
IAMの主要コンポーネント
コンポーネント | 説明 |
---|---|
ユーザー | 個々の人やアプリケーションを表す認証エンティティ |
グループ | 複数のIAMユーザーをまとめて管理する手段 |
ロール | 一時的に権限を付与するためのメカニズム |
ポリシー | アクセス権限を定義するJSONドキュメント |
2. ルートアカウントの保護
ルートアカウントは無制限の権限を持ち、最も重要な保護対象です。以下の手順で厳重に保護しましょう。
ステップ1: ルートアカウントのセキュリティ強化
- 強力なパスワードの設定
- 最低20文字以上の複雑なパスワードを使用
- パスワードマネージャーで安全に保管
- MFA(多要素認証)の有効化
# これはAWSマネジメントコンソールでの操作が必要です
# 1. AWSマネジメントコンソールにログイン
# 2. 右上のアカウント名 → 「セキュリティ認証情報」を選択
# 3. 「多要素認証(MFA)」セクションで「MFAの有効化」をクリック
# 4. MFAデバイスを設定(物理デバイスまたは仮想MFAアプリ)
- アカウント連絡先情報の更新
- 最新の連絡先メールとバックアップメールを設定
- 電話番号を更新し、アカウント復旧用に確認
ステップ2: ルートアカウントの使用制限
ルートアカウントは以下の操作のみに使用し、それ以外は管理者IAMユーザーを利用します:
- AWS Support Planの変更
- アカウントの解約
- 特定のサービス制限の変更
- 特定の税金関連の設定
# 管理者IAMユーザーを作成する(CLIの例)
aws iam create-user --user-name AdminUser
# 管理者権限ポリシーをアタッチ
aws iam attach-user-policy --user-name AdminUser --policy-arn arn:aws:iam::aws:policy/AdministratorAccess
# コンソールアクセス用のパスワードを設定
aws iam create-login-profile --user-name AdminUser --password 'StrongPassword123!' --password-reset-required
3. IAMユーザーとロールの設計
個人プロジェクトでは、複雑すぎるIAM構成は避けつつも、適切なアクセス制御が必要です。
ステップ1: IAMユーザー設計の基本方針
個人プロジェクトにおける推奨アプローチ:
- 管理者IAMユーザーの作成
- コンソールとAPI両方のアクセス権限を付与
- MFAを必須に設定
- 用途別IAMユーザーの分離(必要に応じて)
- デプロイ用:CI/CDパイプライン用の制限付きアクセス
- 監視用:読み取り専用アクセス
- アプリケーション用:特定サービスのみへのアクセス
ステップ2: IAMロール設計の実践
IAMロールは、一時的な権限付与のため、より安全なアクセス制御を実現します。
設計例:基本的なロール構成
# デプロイ用ロールの作成
aws iam create-role \
--role-name DeploymentRole \
--assume-role-policy-document file://trust-policy.json
# 信頼ポリシー(trust-policy.json)
cat > trust-policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/AdminUser"
},
"Action": "sts:AssumeRole"
}
]
}
EOF
# ロールに必要なポリシーをアタッチ
aws iam attach-role-policy \
--role-name DeploymentRole \
--policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess
aws iam attach-role-policy \
--role-name DeploymentRole \
--policy-arn arn:aws:iam::aws:policy/AmazonDynamoDBFullAccess
共通ロールのユースケース
ロール名 | 目的 | 主な権限 |
---|---|---|
AdminRole | 管理作業 | AdministratorAccess |
DeploymentRole | アプリケーションデプロイ | S3, EC2, CloudFormation など |
DatabaseAccessRole | DB操作 | RDS, DynamoDB の特定アクション |
ReadOnlyRole | 監視・分析 | 各種サービスの読み取り専用権限 |
LambdaExecutionRole | Lambda関数実行 | CloudWatch Logs, S3, DynamoDB など |
4. 最小権限の原則の実践
最小権限の原則(Principle of Least Privilege)は、必要最小限の権限のみを付与する考え方で、セキュリティ上極めて重要です。
ステップ1: 適切な権限スコープの決定
以下のフローで必要な権限を特定します:
- 使用するAWSサービスの特定
- 各サービスで必要なアクション(API)の特定
- アクセスが必要なリソースの特定(ARN)
- 条件(リクエスト条件、IPアドレス制限など)の検討
ステップ2: カスタムポリシーの作成
必要に応じてカスタムIAMポリシーを作成します。
ウェブアプリケーション用S3ポリシーの例
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-website-bucket",
"arn:aws:s3:::my-website-bucket/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::my-website-bucket/uploads/*",
"Condition": {
"StringEquals": {
"s3:x-amz-acl": "public-read"
}
}
}
]
}
# カスタムポリシーの作成
aws iam create-policy \
--policy-name WebAppS3Policy \
--policy-document file://webapp-s3-policy.json
# ポリシーをロールにアタッチ
aws iam attach-role-policy \
--role-name WebAppRole \
--policy-arn arn:aws:iam::123456789012:policy/WebAppS3Policy
ステップ3: 権限境界(Permission Boundaries)の設定
権限境界を使用して、IAMエンティティ(ユーザーまたはロール)に許可される最大権限を制限します。
# 権限境界の設定
aws iam put-user-permissions-boundary \
--user-name DevUser \
--permissions-boundary arn:aws:iam::aws:policy/PowerUserAccess
# 権限境界付きのロール作成
aws iam create-role \
--role-name BoundedRole \
--assume-role-policy-document file://trust-policy.json \
--permissions-boundary arn:aws:iam::aws:policy/PowerUserAccess
5. IAM Identity Centerの活用
AWS IAM Identity Center(旧SSO)は、複数のAWSアカウントやアプリケーションへのアクセスを一元管理できるサービスです。
ステップ1: IAM Identity Centerの設定
# これはAWSマネジメントコンソールで行う必要があります
# 1. AWSマネジメントコンソールから「IAM Identity Center」を選択
# 2. 「有効化」ボタンをクリック
# 3. Identity Sourceを選択(デフォルトは「IAM Identity Center」)
ステップ2: 権限セットの定義
権限セットは、AWS環境で実行できるタスクを定義するIAMポリシーのコレクションです。
# マネジメントコンソールで以下を実行:
# 1. IAM Identity Centerコンソールで「アクセス許可セット」を選択
# 2. 「アクセス許可セットの作成」をクリック
# 3. 事前定義済みまたはカスタム権限を選択
ステップ3: ユーザーとグループの割り当て
# マネジメントコンソールで以下を実行:
# 1. IAM Identity Centerコンソールで「ユーザー」を選択
# 2. 「ユーザーの追加」をクリック
# 3. ユーザー情報を入力して作成
# 4. 「AWS アカウント」セクションでアカウントを選択
# 5. ユーザーに権限セットを割り当て
ステップ4: ワンクリックアクセスの設定
# 1. IAM Identity Centerコンソールで「ダッシュボード」を選択
# 2. AWS Access Portalのサインイン情報を確認
# 3. ユーザーに通知
6. 多要素認証(MFA)の導入
MFAはセキュリティを大幅に強化するため、すべてのIAMユーザーに必須とすべきです。
ステップ1: MFAデバイスの種類
MFAタイプ | メリット | 用途 |
---|---|---|
仮想MFA(認証アプリ) | コスト無料、設定容易 | 一般ユーザー向け |
U2Fセキュリティキー | フィッシング耐性、使いやすさ | 高セキュリティ要件 |
ハードウェアMFAトークン | インターネット不要、堅牢性 | ルートアカウント |
ステップ2: MFAの有効化(CLIの例)
# 仮想MFAデバイスの作成
aws iam create-virtual-mfa-device \
--virtual-mfa-device-name MyUser-MFA \
--outfile /tmp/QRCode.png \
--bootstrap-method QRCodePNG
# MFAデバイスをIAMユーザーに関連付け
aws iam enable-mfa-device \
--user-name MyUser \
--serial-number arn:aws:iam::123456789012:mfa/MyUser-MFA \
--authentication-code-1 123456 \
--authentication-code-2 789012
ステップ3: MFA使用を強制するポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowViewAccountInfo",
"Effect": "Allow",
"Action": [
"iam:GetAccountPasswordPolicy",
"iam:GetAccountSummary",
"iam:ListVirtualMFADevices"
],
"Resource": "*"
},
{
"Sid": "AllowManageOwnVirtualMFADevice",
"Effect": "Allow",
"Action": [
"iam:CreateVirtualMFADevice",
"iam:DeleteVirtualMFADevice"
],
"Resource": "arn:aws:iam::*:mfa/${aws:username}"
},
{
"Sid": "AllowManageOwnUserMFA",
"Effect": "Allow",
"Action": [
"iam:DeactivateMFADevice",
"iam:EnableMFADevice",
"iam:ListMFADevices",
"iam:ResyncMFADevice"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
},
{
"Sid": "DenyAllExceptListedIfNoMFA",
"Effect": "Deny",
"NotAction": [
"iam:CreateVirtualMFADevice",
"iam:EnableMFADevice",
"iam:GetUser",
"iam:ListMFADevices",
"iam:ListVirtualMFADevices",
"iam:ResyncMFADevice",
"sts:GetSessionToken"
],
"Resource": "*",
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "false"
}
}
}
]
}
7. IAMポリシーの管理とベストプラクティス
効果的なIAMポリシー管理は、セキュリティと利便性のバランスを取るために重要です。
ステップ1: ポリシー管理の基本原則
- ポリシーをバージョン管理する
- GitリポジトリでIAMポリシーを管理
- 変更履歴と理由をコメントで記録
- ポリシーをモジュール化する
- 目的別に複数の小さなポリシーを作成
- 再利用可能なコンポーネントとして設計
ステップ2: IAMポリシーシミュレータの活用
IAMポリシーシミュレータを使って、ポリシーの効果を実際のアクセスに影響を与えずにテストします。
# CLI版のポリシーシミュレータ(IAM Policy Simulator APIを使用)
aws iam simulate-principal-policy \
--policy-source-arn arn:aws:iam::123456789012:user/TestUser \
--action-names s3:PutObject s3:GetObject \
--resource-arns arn:aws:s3:::example-bucket/file.txt
ステップ3: ポリシー変数の活用例
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": "arn:aws:s3:::company-data",
"Condition": {
"StringLike": {
"s3:prefix": [
"",
"home/",
"home/${aws:username}/*"
]
}
}
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::company-data/home/${aws:username}/*"
}
]
}
ステップ4: タグベースのアクセス制御
リソースとユーザーにタグを付け、タグに基づいてアクセスを制御します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ec2:*",
"Resource": "*",
"Condition": {
"StringEquals": {
"ec2:ResourceTag/Project": "${aws:PrincipalTag/Project}"
}
}
}
]
}
8. クロスアカウントアクセスの設計
複数のAWSアカウントを運用する場合、クロスアカウントアクセスの適切な設計が重要です。
ステップ1: 信頼関係の確立
# 本番アカウントにロールを作成し、開発アカウントからのアクセスを許可
aws iam create-role \
--role-name CrossAccountRole \
--assume-role-policy-document file://cross-account-trust.json
# cross-account-trust.json
cat > cross-account-trust.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:root"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"aws:PrincipalTag/Department": "Development"
}
}
}
]
}
EOF
# ロールに権限ポリシーをアタッチ
aws iam attach-role-policy \
--role-name CrossAccountRole \
--policy-arn arn:aws:iam::aws:policy/ReadOnlyAccess
ステップ2: クロスアカウントアクセスの使用
# 開発アカウントから本番アカウントのロールを引き受ける
aws sts assume-role \
--role-arn arn:aws:iam::987654321098:role/CrossAccountRole \
--role-session-name DevAccess \
--profile development-profile
ステップ3: スイッチロールの設定(コンソール)
- AWSマネジメントコンソールにログイン
- 右上のアカウント名をクリック
- 「ロールの切り替え」を選択
- アカウントID、ロール名、表示名を入力
- 必要に応じて色を選択して「切り替え」をクリック
9. 監査とセキュリティ強化
定期的な監査と継続的なセキュリティ強化は、IAM管理の重要な側面です。
ステップ1: IAM認証情報レポートの活用
# IAM認証情報レポートの生成
aws iam generate-credential-report
# レポートの取得
aws iam get-credential-report --output text --query 'Content' | base64 -d > credential-report.csv
ステップ2: AWS Config の活用
AWS Configを使用してIAMポリシーのコンプライアンスを監視します。
# AWS Configのセットアップ(マネジメントコンソールで実行)
# 1. AWSマネジメントコンソールでAWS Configを選択
# 2. 「始める」をクリック
# 3. 記録するリソースを選択(IAMリソースを含める)
# 4. S3バケットと通知オプションを設定
# IAM関連のAWS Config Rulesの例
aws configservice put-config-rule \
--config-rule file://iam-user-mfa-enabled.json
# iam-user-mfa-enabled.json
cat > iam-user-mfa-enabled.json << 'EOF'
{
"ConfigRuleName": "iam-user-mfa-enabled",
"Description": "Checks if IAM users have MFA enabled",
"Source": {
"Owner": "AWS",
"SourceIdentifier": "IAM_USER_MFA_ENABLED"
},
"Scope": {
"ComplianceResourceTypes": [
"AWS::IAM::User"
]
}
}
EOF
ステップ3: IAMアクセスアナライザーの設定
# IAMアクセスアナライザーの作成
aws accessanalyzer create-analyzer \
--analyzer-name MyAccountAnalyzer \
--type ACCOUNT
ステップ4: AWS CloudTrailによる監査ログの活用
# CloudTrailでのログ記録の確認
aws cloudtrail describe-trails
# CloudTrailの作成(まだ存在しない場合)
aws cloudtrail create-trail \
--name my-cloudtrail \
--s3-bucket-name my-cloudtrail-logs \
--is-multi-region-trail \
--enable-log-file-validation
# トレイルのロギングを開始
aws cloudtrail start-logging \
--name my-cloudtrail
10. まとめ:IAM設計のチェックリスト
個人プロジェクトにおけるIAM管理のベストプラクティスをチェックリストとしてまとめます:
- [x] ルートアカウントの保護
- [ ] 強力なパスワードの設定
- [ ] MFAの有効化
- [ ] 日常的な使用を避ける
- [x] IAMユーザーとロールの設計
- [ ] 管理者IAMユーザーの作成
- [ ] 目的別IAMロールの設定
- [ ] 適切な権限ポリシーの付与
- [x] 最小権限の原則の実践
- [ ] カスタムIAMポリシーの作成
- [ ] 権限境界の設定
- [ ] 定期的な権限の見直し
- [x] 多要素認証(MFA)の導入
- [ ] すべてのIAMユーザーへのMFA強制
- [ ] MFA条件付きポリシーの設定
- [x] セキュリティ監査と改善
- [ ] IAM認証情報レポートの定期確認
- [ ] AWS Configルールの設定
- [ ] IAMアクセスアナライザーの活用
実装サンプル:個人プロジェクト向けIAM設定テンプレート
個人プロジェクトにおけるIAM設定を自動化するためのCloudFormationテンプレート:
AWSTemplateFormatVersion: '2010-09-09'
Description: '最適化されたIAM設定テンプレート - 個人プロジェクト向け'
Parameters:
ProjectName:
Type: String
Default: personal-project
Description: プロジェクト名(リソース名のプレフィックスとして使用)
Resources:
# 管理者ユーザー
AdminUser:
Type: AWS::IAM::User
Properties:
UserName: !Sub ${ProjectName}-admin
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AdministratorAccess
- !Ref MFAPolicy
Tags:
- Key: Project
Value: !Ref ProjectName
- Key: Role
Value: Administrator
# 管理者のアクセスキー
AdminUserAccessKey:
Type: AWS::IAM::AccessKey
Properties:
UserName: !Ref AdminUser
Status: Active
# 開発者ロール
DeveloperRole:
Type: AWS::IAM::Role
Properties:
RoleName: !Sub ${ProjectName}-developer
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
AWS: !GetAtt AdminUser.Arn
Action: sts:AssumeRole
Condition:
Bool:
aws:MultiFactorAuthPresent: 'true'
ManagedPolicyArns:
- arn:aws:iam::aws:policy/PowerUserAccess
Tags:
- Key: Project
Value: !Ref ProjectName
- Key: Role
Value: Developer
# デプロイロール(最小権限の原則に基づいたカスタムポリシー使用)
DeploymentRole:
Type: AWS::IAM::Role
Properties:
RoleName: !Sub ${ProjectName}-deployer
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
AWS: !GetAtt AdminUser.Arn
Action: sts:AssumeRole
Condition:
Bool:
aws:MultiFactorAuthPresent: 'true'
ManagedPolicyArns:
- !Ref DeploymentPolicy
Tags:
- Key: Project
Value: !Ref ProjectName
- Key: Role
Value: Deployment
# デプロイメント用のカスタムポリシー(最小権限の原則)
DeploymentPolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
ManagedPolicyName: !Sub ${ProjectName}-deployment-policy
PolicyDocument:
Version: '2012-10-17'
Statement:
# S3権限(プロジェクト関連バケットのみ)
- Effect: Allow
Action:
- s3:GetObject
- s3:PutObject
- s3:ListBucket
- s3:DeleteObject
Resource:
- !Sub arn:aws:s3:::${ProjectName}-*
- !Sub arn:aws:s3:::${ProjectName}-*/*
# EC2インスタンス操作
- Effect: Allow
Action:
- ec2:DescribeInstances
- ec2:StartInstances
- ec2:StopInstances
- ec2:CreateTags
Resource: '*'
Condition:
StringEquals:
aws:ResourceTag/Project: !Ref ProjectName
# DynamoDB操作(プロジェクト関連テーブルのみ)
- Effect: Allow
Action:
- dynamodb:GetItem
- dynamodb:PutItem
- dynamodb:UpdateItem
- dynamodb:DeleteItem
- dynamodb:Query
- dynamodb:Scan
Resource: !Sub arn:aws:dynamodb:*:${AWS::AccountId}:table/${ProjectName}-*
# CloudFormationスタック操作
- Effect: Allow
Action:
- cloudformation:CreateStack
- cloudformation:UpdateStack
- cloudformation:DeleteStack
- cloudformation:DescribeStacks
Resource: !Sub arn:aws:cloudformation:*:${AWS::AccountId}:stack/${ProjectName}-*
# 関連サービス操作の許可
- Effect: Allow
Action:
- logs:CreateLogGroup
- logs:CreateLogStream
- logs:PutLogEvents
- lambda:CreateFunction
- lambda:UpdateFunctionCode
- lambda:UpdateFunctionConfiguration
- lambda:InvokeFunction
Resource: '*'
Condition:
StringLike:
aws:ResourceTag/Project: !Ref ProjectName
# 読み取り専用ロール
ReadOnlyRole:
Type: AWS::IAM::Role
Properties:
RoleName: !Sub ${ProjectName}-readonly
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
AWS: !GetAtt AdminUser.Arn
Action: sts:AssumeRole
Condition:
Bool:
aws:MultiFactorAuthPresent: 'true'
ManagedPolicyArns:
- arn:aws:iam::aws:policy/ReadOnlyAccess
Tags:
- Key: Project
Value: !Ref ProjectName
- Key: Role
Value: ReadOnly
# MFA強制ポリシー
MFAPolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
ManagedPolicyName: !Sub ${ProjectName}-enforce-mfa
PolicyDocument:
Version: '2012-10-17'
Statement:
# MFA設定時に必要な権限を許可
- Sid: AllowViewAccountInfo
Effect: Allow
Action:
- iam:GetAccountPasswordPolicy
- iam:GetAccountSummary
- iam:ListVirtualMFADevices
Resource: '*'
- Sid: AllowManageOwnVirtualMFADevice
Effect: Allow
Action:
- iam:CreateVirtualMFADevice
- iam:DeleteVirtualMFADevice
Resource: !Sub arn:aws:iam::${AWS::AccountId}:mfa/${aws:username}
- Sid: AllowManageOwnUserMFA
Effect: Allow
Action:
- iam:DeactivateMFADevice
- iam:EnableMFADevice
- iam:ListMFADevices
- iam:ResyncMFADevice
Resource: !Sub arn:aws:iam::${AWS::AccountId}:user/${aws:username}
# MFAが設定されていない場合は、MFA設定に必要な操作以外を拒否
- Sid: DenyAllExceptListedIfNoMFA
Effect: Deny
NotAction:
- iam:CreateVirtualMFADevice
- iam:EnableMFADevice
- iam:GetUser
- iam:ListMFADevices
- iam:ListVirtualMFADevices
- iam:ResyncMFADevice
- iam:ChangePassword
- sts:GetSessionToken
Resource: '*'
Condition:
BoolIfExists:
aws:MultiFactorAuthPresent: 'false'
# パスワードポリシー設定
PasswordPolicy:
Type: AWS::IAM::AccountPasswordPolicy
Properties:
MinimumPasswordLength: 14
RequireLowercaseCharacters: true
RequireUppercaseCharacters: true
RequireNumbers: true
RequireSymbols: true
MaxPasswordAge: 90
PasswordReusePrevention: 24
AllowUsersToChangePassword: true
# CloudTrailログ用のS3バケット
CloudTrailLogsBucket:
Type: AWS::S3::Bucket
DeletionPolicy: Retain
Properties:
# 生成される一意なバケット名を使用
VersioningConfiguration:
Status: Enabled
BucketEncryption:
ServerSideEncryptionConfiguration:
- ServerSideEncryptionByDefault:
SSEAlgorithm: AES256
PublicAccessBlockConfiguration:
BlockPublicAcls: true
BlockPublicPolicy: true
IgnorePublicAcls: true
RestrictPublicBuckets: true
LoggingConfiguration:
DestinationBucketName: !Ref AccessLogsBucket
LogFilePrefix: cloudtrail-logs/
# S3アクセスログ用のバケット
AccessLogsBucket:
Type: AWS::S3::Bucket
DeletionPolicy: Retain
Properties:
VersioningConfiguration:
Status: Enabled
BucketEncryption:
ServerSideEncryptionConfiguration:
- ServerSideEncryptionByDefault:
SSEAlgorithm: AES256
PublicAccessBlockConfiguration:
BlockPublicAcls: true
BlockPublicPolicy: true
IgnorePublicAcls: true
RestrictPublicBuckets: true
LifecycleConfiguration:
Rules:
- Id: DeleteOldLogs
Status: Enabled
ExpirationInDays: 90
# CloudTrailバケットポリシー
CloudTrailBucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref CloudTrailLogsBucket
PolicyDocument:
Version: '2012-10-17'
Statement:
- Sid: AWSCloudTrailAclCheck
Effect: Allow
Principal:
Service: cloudtrail.amazonaws.com
Action: s3:GetBucketAcl
Resource: !GetAtt CloudTrailLogsBucket.Arn
- Sid: AWSCloudTrailWrite
Effect: Allow
Principal:
Service: cloudtrail.amazonaws.com
Action: s3:PutObject
Resource: !Sub ${CloudTrailLogsBucket.Arn}/AWSLogs/${AWS::AccountId}/*
Condition:
StringEquals:
s3:x-amz-acl: bucket-owner-full-control
- Sid: EnforceSslOnly
Effect: Deny
Principal: '*'
Action: s3:*
Resource:
- !GetAtt CloudTrailLogsBucket.Arn
- !Sub ${CloudTrailLogsBucket.Arn}/*
Condition:
Bool:
aws:SecureTransport: false
# CloudTrail設定
CloudTrail:
Type: AWS::CloudTrail::Trail
DependsOn: CloudTrailBucketPolicy
Properties:
TrailName: !Sub ${ProjectName}-trail
S3BucketName: !Ref CloudTrailLogsBucket
IsLogging: true
EnableLogFileValidation: true
IncludeGlobalServiceEvents: true
IsMultiRegionTrail: true
Tags:
- Key: Project
Value: !Ref ProjectName
Outputs:
AdminUserName:
Description: "管理者ユーザー名"
Value: !Ref AdminUser
AdminUserAccessKeyId:
Description: "管理者アクセスキーID"
Value: !Ref AdminUserAccessKey
# セキュリティ上の理由から、シークレットキーは出力しません
# 必要な場合はコンソールから確認またはアクセスキーを再生成してください
DeveloperRoleArn:
Description: "開発者ロールARN"
Value: !GetAtt DeveloperRole.Arn
DeploymentRoleArn:
Description: "デプロイロールARN"
Value: !GetAtt DeploymentRole.Arn
ReadOnlyRoleArn:
Description: "読取専用ロールARN"
Value: !GetAtt ReadOnlyRole.Arn
CloudTrailLogsBucketName:
Description: "CloudTrailログバケット名"
Value: !Ref CloudTrailLogsBucket
AccessLogsBucketName:
Description: "アクセスログバケット名"
Value: !Ref AccessLogsBucket
コメント