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時間 |
ユーザー追加手順
- AWS コンソール → IAM Identity Center → ユーザー → 「ユーザーを追加」
- メールアドレス・名前を入力
- グループに割り当て
- 招待メールが送信される → ユーザーがパスワード設定・MFA登録
グループ
| グループ名 | 許可セット | 用途 |
|---|---|---|
H2tAdmins | AdministratorAccess | インフラ管理・全リソースアクセス |
H2tDevelopers | H2tDeveloperAccess | 開発・デバッグ作業 |
H2tViewers | H2tReadOnlyAccess | 閲覧のみ |
許可セット
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-deployer | GitLab CI/CDデプロイ | 有効 | H2tDeployPolicy |
h2t-app | GMACアプリケーション(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_admin | DB管理(マイグレーション等) | ALL PRIVILEGES | 管理端末 |
h2t_app | GMACアプリケーション(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時間に制限 |