PR

【完全ガイド】個人AWSプロジェクトにおけるIAM管理の徹底解説

はじめに

Amazon Web Services (AWS) は強力なクラウドプラットフォームですが、その利点を安全に活用するには適切なアクセス管理が不可欠です。特に個人開発者やスモールチームにとって、IAM(Identity and Access Management)の適切な設計は、セキュリティリスクの低減と運用効率の向上に直結します。

本記事では、個人開発者がAWSアカウントで実践すべきIAM管理のベストプラクティスを、具体的な手順とコード例を交えて解説します。このガイドに沿って設定することで、安全かつ効率的なAWS環境を構築しましょう。

1. IAMの基本概念と重要性

IAMはAWSリソースへのアクセスを安全に制御するためのサービスです。個人開発者であっても、適切なIAM設計は以下のメリットをもたらします:

  • セキュリティリスクの低減: 不要な権限を持つアカウントが侵害された場合の影響を最小化
  • 操作ミスの防止: 必要な権限のみを付与することで、誤ったリソース削除などを防止
  • コスト管理: 権限制限によって意図しないリソース作成を防止
  • 運用効率の向上: 適切な権限分離による管理負担の軽減

IAMの主要コンポーネント

コンポーネント説明
ユーザー個々の人やアプリケーションを表す認証エンティティ
グループ複数のIAMユーザーをまとめて管理する手段
ロール一時的に権限を付与するためのメカニズム
ポリシーアクセス権限を定義するJSONドキュメント

2. ルートアカウントの保護

ルートアカウントは無制限の権限を持ち、最も重要な保護対象です。以下の手順で厳重に保護しましょう。

ステップ1: ルートアカウントのセキュリティ強化

  1. 強力なパスワードの設定
    • 最低20文字以上の複雑なパスワードを使用
    • パスワードマネージャーで安全に保管
  2. MFA(多要素認証)の有効化
# これはAWSマネジメントコンソールでの操作が必要です
# 1. AWSマネジメントコンソールにログイン
# 2. 右上のアカウント名 → 「セキュリティ認証情報」を選択
# 3. 「多要素認証(MFA)」セクションで「MFAの有効化」をクリック
# 4. MFAデバイスを設定(物理デバイスまたは仮想MFAアプリ)
  1. アカウント連絡先情報の更新
    • 最新の連絡先メールとバックアップメールを設定
    • 電話番号を更新し、アカウント復旧用に確認

ステップ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ユーザー設計の基本方針

個人プロジェクトにおける推奨アプローチ:

  1. 管理者IAMユーザーの作成
    • コンソールとAPI両方のアクセス権限を付与
    • MFAを必須に設定
  2. 用途別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 など
DatabaseAccessRoleDB操作RDS, DynamoDB の特定アクション
ReadOnlyRole監視・分析各種サービスの読み取り専用権限
LambdaExecutionRoleLambda関数実行CloudWatch Logs, S3, DynamoDB など

4. 最小権限の原則の実践

最小権限の原則(Principle of Least Privilege)は、必要最小限の権限のみを付与する考え方で、セキュリティ上極めて重要です。

ステップ1: 適切な権限スコープの決定

以下のフローで必要な権限を特定します:

  1. 使用するAWSサービスの特定
  2. 各サービスで必要なアクション(API)の特定
  3. アクセスが必要なリソースの特定(ARN)
  4. 条件(リクエスト条件、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: ポリシー管理の基本原則

  1. ポリシーをバージョン管理する
    • GitリポジトリでIAMポリシーを管理
    • 変更履歴と理由をコメントで記録
  2. ポリシーをモジュール化する
    • 目的別に複数の小さなポリシーを作成
    • 再利用可能なコンポーネントとして設計

ステップ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: スイッチロールの設定(コンソール)

  1. AWSマネジメントコンソールにログイン
  2. 右上のアカウント名をクリック
  3. 「ロールの切り替え」を選択
  4. アカウントID、ロール名、表示名を入力
  5. 必要に応じて色を選択して「切り替え」をクリック

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

コメント

タイトルとURLをコピーしました