Skip to content

IAM 設計

概要

GMAC MEOサービスのAWS IAM設計。IAM Identity Center(旧AWS SSO)を採用し、メール招待ベースでの開発ユーザー管理を行う。

方針

  • IAM Identity Center でユーザー管理を一元化
  • メール招待で開発者を追加(Identity Center ディレクトリ使用)
  • 許可セットでアクセス権限を制御
  • CI/CD用のプログラムアクセスは従来のIAMユーザーを使用

IAM構成図

IAM Identity Center

設定

項目
IDソースIdentity Center ディレクトリ
認証方式メール招待
MFA必須(認証アプリ)
セッション時間8時間

ユーザー追加手順

  1. AWS コンソール → IAM Identity Center → ユーザー → 「ユーザーを追加」
  2. メールアドレス・名前を入力
  3. グループに割り当て
  4. 招待メールが送信される → ユーザーがパスワード設定・MFA登録

グループ

グループ名許可セット用途
H2tAdminsAdministratorAccessインフラ管理・全リソースアクセス
H2tDevelopersH2tDeveloperAccess開発・デバッグ作業
H2tViewersH2tReadOnlyAccess閲覧のみ

許可セット

AdministratorAccess

AWS管理ポリシー AdministratorAccess を使用。インフラ管理者向け。

H2tDeveloperAccess(カスタム)

開発者向け。ECS・RDS・S3・CloudWatch等の開発に必要なサービスへのアクセスを許可。

json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ECSReadDeploy",
      "Effect": "Allow",
      "Action": [
        "ecs:Describe*",
        "ecs:List*",
        "ecs:ExecuteCommand"
      ],
      "Resource": "*"
    },
    {
      "Sid": "S3Access",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:DeleteObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::h2t-*",
        "arn:aws:s3:::h2t-*/*"
      ]
    },
    {
      "Sid": "CloudWatchLogs",
      "Effect": "Allow",
      "Action": [
        "logs:GetLogEvents",
        "logs:FilterLogEvents",
        "logs:DescribeLogGroups",
        "logs:DescribeLogStreams"
      ],
      "Resource": "*"
    },
    {
      "Sid": "RDSRead",
      "Effect": "Allow",
      "Action": [
        "rds:Describe*",
        "rds:List*"
      ],
      "Resource": "*"
    },
    {
      "Sid": "ECRRead",
      "Effect": "Allow",
      "Action": [
        "ecr:GetAuthorizationToken",
        "ecr:BatchGetImage",
        "ecr:GetDownloadUrlForLayer",
        "ecr:DescribeRepositories",
        "ecr:ListImages"
      ],
      "Resource": "*"
    }
  ]
}

H2tReadOnlyAccess

AWS管理ポリシー ReadOnlyAccess を使用。閲覧専用。

IAMユーザー(サービス用)

IAM Identity Centerではなく従来のIAMユーザーで管理するサービスアカウント。いずれもプログラムアクセス専用でコンソールアクセスは無効。

ユーザー一覧

ユーザー名用途アクセスキーポリシー
gitlab-deployerGitLab CI/CDデプロイ有効H2tDeployPolicy
h2t-appGMACアプリケーション(Laravel)からのAWSアクセス有効H2tAppPolicy
h2t-scraperスクレイピングプログラム(Python/Django)からのAWSアクセス有効H2tScraperPolicy

gitlab-deployer

GitLab CI/CDからのデプロイ専用ユーザー。

項目
ユーザー名gitlab-deployer
コンソールアクセス無効
アクセスキー有効(GitLab CI/CD変数に設定)
MFA不要(プログラムアクセスのみ)

H2tDeployPolicy

json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ECRAuth",
      "Effect": "Allow",
      "Action": "ecr:GetAuthorizationToken",
      "Resource": "*"
    },
    {
      "Sid": "ECRPush",
      "Effect": "Allow",
      "Action": [
        "ecr:BatchCheckLayerAvailability",
        "ecr:GetDownloadUrlForLayer",
        "ecr:BatchGetImage",
        "ecr:PutImage",
        "ecr:InitiateLayerUpload",
        "ecr:UploadLayerPart",
        "ecr:CompleteLayerUpload"
      ],
      "Resource": "arn:aws:ecr:ap-northeast-1:*:repository/h2t-*"
    },
    {
      "Sid": "ECSUpdateService",
      "Effect": "Allow",
      "Action": [
        "ecs:UpdateService",
        "ecs:DescribeServices",
        "ecs:DescribeTaskDefinition",
        "ecs:RegisterTaskDefinition"
      ],
      "Resource": "*"
    },
    {
      "Sid": "PassRole",
      "Effect": "Allow",
      "Action": "iam:PassRole",
      "Resource": [
        "arn:aws:iam::*:role/ecsTaskExecutionRole",
        "arn:aws:iam::*:role/ecsTaskRole"
      ]
    }
  ]
}

h2t-app

GMACアプリケーション(Laravel)がS3・SESなどのAWSサービスにアクセスするためのユーザー。.env にアクセスキーを設定。

項目
ユーザー名h2t-app
コンソールアクセス無効
アクセスキー有効(Laravel .env に設定)
MFA不要(プログラムアクセスのみ)

H2tAppPolicy

json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "S3Access",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:DeleteObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::h2t-*",
        "arn:aws:s3:::h2t-*/*"
      ]
    },
    {
      "Sid": "SESSendEmail",
      "Effect": "Allow",
      "Action": [
        "ses:SendEmail",
        "ses:SendRawEmail"
      ],
      "Resource": "arn:aws:ses:ap-northeast-1:*:identity/*"
    }
  ]
}

h2t-scraper

スクレイピングプログラム(Python/Django)がS3・Batchなどにアクセスするためのユーザー。

項目
ユーザー名h2t-scraper
コンソールアクセス無効
アクセスキー有効(スクレイピングサーバーの環境変数に設定)
MFA不要(プログラムアクセスのみ)

H2tScraperPolicy

json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "S3Access",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:DeleteObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::h2t-*",
        "arn:aws:s3:::h2t-*/*"
      ]
    },
    {
      "Sid": "BatchSubmitJob",
      "Effect": "Allow",
      "Action": [
        "batch:SubmitJob",
        "batch:DescribeJobs",
        "batch:ListJobs",
        "batch:TerminateJob"
      ],
      "Resource": "*"
    },
    {
      "Sid": "LambdaInvoke",
      "Effect": "Allow",
      "Action": [
        "lambda:InvokeFunction"
      ],
      "Resource": "arn:aws:lambda:ap-northeast-1:*:function:h2t-*"
    },
    {
      "Sid": "CloudWatchLogs",
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "*"
    }
  ]
}

RDSデータベースユーザー

MySQLの接続ユーザー。RDS上で作成・管理する。

ユーザー名用途権限接続元
h2t_adminDB管理(マイグレーション等)ALL PRIVILEGES管理端末
h2t_appGMACアプリケーション(Laravel)SELECT, INSERT, UPDATE, DELETEアプリサーバー
h2t_readonly参照専用(レポート・調査)SELECT管理端末
h2t_scraperスクレイピングプログラムSELECT, INSERT, UPDATEスクレイピングサーバー

ユーザー作成SQL

sql
-- 管理ユーザー
CREATE USER 'h2t_admin'@'%' IDENTIFIED BY '<password>';
GRANT ALL PRIVILEGES ON h2t.* TO 'h2t_admin'@'%';

-- アプリケーションユーザー
CREATE USER 'h2t_app'@'%' IDENTIFIED BY '<password>';
GRANT SELECT, INSERT, UPDATE, DELETE ON h2t.* TO 'h2t_app'@'%';

-- 参照専用ユーザー
CREATE USER 'h2t_readonly'@'%' IDENTIFIED BY '<password>';
GRANT SELECT ON h2t.* TO 'h2t_readonly'@'%';

-- スクレイピングユーザー
CREATE USER 'h2t_scraper'@'%' IDENTIFIED BY '<password>';
GRANT SELECT, INSERT, UPDATE ON h2t.* TO 'h2t_scraper'@'%';

FLUSH PRIVILEGES;

IAMロール

ecsTaskExecutionRole

ECSがタスクを起動する際に使用するロール。

項目
ロール名ecsTaskExecutionRole
信頼ポリシーecs-tasks.amazonaws.com
管理ポリシーAmazonECSTaskExecutionRolePolicy(AWS管理)

ecsTaskRole

アプリケーションコンテナがAWSサービスにアクセスするためのロール。

項目
ロール名ecsTaskRole
信頼ポリシーecs-tasks.amazonaws.com
カスタムポリシーH2tTaskPolicy

H2tTaskPolicy

json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "S3Access",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:DeleteObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::h2t-*",
        "arn:aws:s3:::h2t-*/*"
      ]
    },
    {
      "Sid": "SESSendEmail",
      "Effect": "Allow",
      "Action": [
        "ses:SendEmail",
        "ses:SendRawEmail"
      ],
      "Resource": "arn:aws:ses:ap-northeast-1:*:identity/*"
    }
  ]
}

ルートアカウント運用ルール

ルール内容
日常使用禁止ルートアカウントは初期設定・緊急時のみ使用
MFA必須ルートアカウントにMFAを設定
アクセスキー無効化ルートのアクセスキーは作成しない

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

項目対応
最小権限許可セット・ポリシーで必要最小限の権限のみ付与
MFA必須Identity Center ユーザーはMFA登録必須
アクセスキーローテーションgitlab-deployer のキーを90日ごとにローテーション
CloudTrail有効化してAPI呼び出しを記録
セッション管理Identity Center のセッション時間を8時間に制限