目次
- 初心者から実務者向けの包括的解説
- 概要
- 主な特徴
- アーキテクチャ
- IAM の構成要素
- ポリシータイプの完全解説
- ポリシー評価ロジック
- IAM ポリシー JSON 具体例
- 主要ユースケース
- IAM Roles と Trust Policy
- STS と一時認証情報
- IAM Identity Center(旧 SSO)
- IAM Access Analyzer
- サービスコントロールポリシー(SCP)
- Permission Boundary
- IAM Roles Anywhere
- ABAC(Attribute-Based Access Control)
- EKS IRSA / Pod Identity
- EC2 Instance Profile
- Lambda 実行ロール
- クロスアカウントアクセスパターン
- 他の類似ツールとの比較
- クライアントとエコシステム
- ベストプラクティス
- トラブルシューティング
- 2025-2026 最新動向
- 学習リソース
- 実装例・活用シーン
- 導入ロードマップ
- 実装チェックリスト
- まとめ
AWS IAM 完全ガイド 2026
初心者から実務者向けの包括的解説
AWS IAM(Identity and Access Management) は、AWS リソースへのアクセスを ID ベースで精密に制御する AWS の根幹サービスです。認証(Authentication)と認可(Authorization)の基盤として機能し、AWS セキュリティの最重要ピースです。本ドキュメントは、IAM の概念・アーキテクチャ・ポリシー・ベストプラクティス・実装例を体系的に解説する包括的ガイドです。
ドキュメントの目的
本ガイドは以下を対象としています。
- 初心者向け: IAM とは何か、なぜ必要かを学びたい方
- 開発者向け: ロール・ポリシー・クレデンシャルを管理したい方
- SRE / インフラ向け: クロスアカウント・フェデレーション・最小権限を実装したい方
- セキュリティ管理者向け: 組織全体の IAM ガバナンス・監査・コンプライアンスを設計したい方
- 意思決定者向け: IAM と他の認証基盤(Azure AD / GCP IAM / Okta)の比較
2026 年の IAM エコシステム
- IAM Identity Center(旧 AWS SSO):30+ の SaaS アプリケーション統合、SCIM 対応
- IAM Access Analyzer:外部アクセス検出の継続改善、Resource Control Policies 対応
- IAM Roles Anywhere:オンプレ・マルチクラウド環境での IAM ロール利用
- EKS Pod Identity:IRSA(IAM Roles for Service Accounts)の後継、簡素化
- Verified Access:CloudTrail 統合強化、デバイス検証・セッション管理の高度化
- AI ポリシー生成:生成 AI による IAM ポリシー提案・最適化
- CloudTrail Lake:1 年間のログ保持、IAM 監査ログの長期分析
- Resource Control Policies(RCP):SCP の後継、より細粒度な制御
定義
AWS 公式による定義:
“AWS Identity and Access Management (IAM) is a web service that helps you securely control access to AWS resources.”
IAM は アクセス制御そのもの であり、AWS を安全に使用するための前提条件です。IAM 自体の使用は完全無料。
目次
- 概要
- IAM が解決する課題
- 主な特徴
- アーキテクチャ
- IAM の構成要素(プリンシパル、ポリシー、リソース)
- ポリシータイプの完全解説
- ポリシー評価ロジック
- 主要ユースケース(10 パターン以上)
- IAM Roles と Trust Policy
- STS と一時認証情報
- IAM Identity Center(旧 SSO)
- IAM Access Analyzer
- サービスコントロールポリシー(SCP)
- Permission Boundary
- IAM Roles Anywhere
- ABAC(Attribute-Based Access Control)
- EKS IRSA / Pod Identity
- EC2 Instance Profile
- Lambda 実行ロール
- クロスアカウントアクセスパターン
- 他の類似ツールとの比較
- クライアントとエコシステム
- ベストプラクティス
- トラブルシューティング
- 2025-2026 最新動向
- 学習リソース
- 実装例・活用シーン
- 導入ロードマップ
- 実装チェックリスト
- まとめ
- 参考文献
概要
初心者向けメモ: IAM は「AWS リソースへのアクセスを 誰が(プリンシパル)何を(アクション)どのリソースに対して(リソース)できるかを定義する仕組み」です。IAM ポリシーは JSON 形式で書かれ、すべての AWS API 呼び出しはこのポリシー評価を経由します。
IAM(Identity and Access Management)は AWS の アクセス制御基盤 です。以下の機能を提供します:
| 機能 | 説明 |
|---|---|
| 認証(Authentication) | 「あなたは誰か?」を確認。ユーザー、ロール、フェデレーテッドユーザー |
| 認可(Authorization) | 「あなたは何ができるか?」を制御。ポリシーベースのアクセス制御 |
| 最小権限の実装 | 必要最小限の権限のみを付与し、セキュリティを強化 |
| 監査・コンプライアンス | CloudTrail と連携して全 API 呼び出しをログ記録 |
| フェデレーション | 外部 IdP(Azure AD、Google、Okta)と連携して SSO を実現 |
IAM が解決する課題
1. 長期クレデンシャルの管理困難性
課題:アプリケーションにハードコードされたアクセスキーは漏洩リスク・ローテーション管理が複雑
IAM の解決:
- IAM ロール → STS による一時的認証情報(15 分〜12 時間)
- → 期限切れで自動無効化、キー管理不要
2. 多人数アクセス管理
課題:複数の個人が AWS にアクセスする際、同じアカウント・パスワード共有は監査不可・セキュリティリスク
IAM の解決:
- 個人ごとの IAM ユーザー(または IAM Identity Center)
- → CloudTrail で誰が何をしたか追跡可能
- → MFA 強制で認証強度向上
3. マルチアカウント環境での権限管理
課題:複数の AWS アカウント間でアクセスを制御するのが複雑
IAM の解決:
- クロスアカウントロール + Trust Policy
- → アカウント A の IAM ユーザーがアカウント B のロールを引き受け
- → 複数アカウント間での安全なアクセス
4. サービス間認証の安全性
課題:EC2 から S3 へアクセスする際、アクセスキーを埋め込むと漏洩リスク
IAM の解決:
- EC2 インスタンスプロファイル(IAM ロール)
- → STS 自動的に一時的認証情報を提供
- → アプリケーションコードに認証情報をハードコード不要
主な特徴
| 特徴 | 説明 |
|---|---|
| 完全無料 | ユーザー数・ポリシー数・API 呼び出し回数に関係なく無料 |
| AWS のデフォルトセキュリティ | 「Allow を明示しなければ拒否」のセキュアバイデフォルト |
| 最小権限の原則 | 必要な権限のみ付与するための細粒度制御 |
| CloudTrail 統合 | すべての API 呼び出しをログに記録し監査可能 |
| 複数プリンシパルタイプ | ユーザー、グループ、ロール、フェデレーテッドユーザー |
| 複数ポリシータイプ | Identity-based、Resource-based、SCP、Permission Boundary、Session Policy |
| 一時的認証情報(STS) | 期限付きセッショントークンで長期キーの安全性向上 |
| MFA 対応 | 多要素認証で強い認証を実現 |
| クロスアカウント対応 | Trust Policy で複数アカウント間のアクセス制御 |
| 外部 IdP フェデレーション | SAML / OIDC で Google / GitHub / Okta 等と統合 |
アーキテクチャ
初心者向けメモ: IAM は 3 層構造です。プリンシパル層(誰が)→ ポリシー層(何ができるか)→ リソース層(どのリソースか)で成り立ちます。AWS API 呼び出しがあると、このポリシー評価エンジンが「許可」「拒否」を判定します。
【図1】IAM アーキテクチャ:プリンシパル → ポリシー → リソース
graph TD
subgraph Principals["プリンシパル層(Who)"]
User["IAM ユーザー"]
Role["IAM ロール"]
FedUser["フェデレーテッドユーザー"]
end
subgraph Policies["ポリシー層(What)"]
Identity["Identity-based ポリシー"]
Resource["Resource-based ポリシー"]
SCP_pol["SCP(Organization レベル)"]
PB["Permission Boundary"]
end
subgraph Resources["リソース層(Which)"]
S3["S3"]
EC2["EC2"]
RDS["RDS"]
Lambda["Lambda"]
DDB["DynamoDB"]
end
User --> Identity
Role --> Identity
FedUser --> Identity
Identity --> SCP_pol
SCP_pol --> PB
PB --> Resources
Resource --> Resources
IAM の構成要素
1. プリンシパル(Principal):誰が
| プリンシパル | 説明 | 認証情報 | 用途 |
|---|---|---|---|
| IAM ユーザー | AWS アカウント内の個人ユーザー | ユーザー名 + パスワード(コンソール)、アクセスキー(API) | 個人のコンソール・API アクセス(非推奨、Identity Center 推奨) |
| IAM グループ | IAM ユーザーを集約 | なし(ユーザーの権限から継承) | 職種別権限管理の簡素化 |
| IAM ロール | 一時的認証情報を提供 | STS トークン(AccessKeyId / SecretAccessKey / SessionToken) | EC2 / Lambda / ECS、クロスアカウント |
| フェデレーテッドユーザー | 外部 IdP 経由 | SAML / OIDC トークン | SSO、Google / GitHub / Okta 認証 |
2. ポリシー(Policy):何ができるか
3. リソース(Resource):どのリソース
ポリシータイプの完全解説
初心者向けメモ: AWS には複数のポリシータイプが存在し、異なる層で制御が行われます。最初は「Identity-based ポリシー」だけを理解していれば OK です。その後、複数アカウント・クロスアカウント環境が必要になったら「Resource-based ポリシー」を学んでください。
ポリシータイプ比較表
| ポリシータイプ | 適用先 | スコープ | 用途 |
|---|---|---|---|
| Identity-based(管理ポリシー) | ユーザー/グループ/ロール | プリンシパルに紐付け | 「このロールは何ができるか」を定義 |
| Identity-based(インラインポリシー) | ユーザー/グループ/ロール | プリンシパルに紐付け | 単一エンティティのみ、エンティティ削除時に一緒に削除 |
| Resource-based | S3 / KMS / SNS 等のリソース | リソースに紐付け | 「このリソースに誰がアクセスできるか」を定義。クロスアカウント制御に必須 |
| SCP(Service Control Policy) | AWS Organizations の OU | 組織レベル | 「メンバーアカウント全体で禁止する操作」を定義(マスターアカウントには適用不可) |
| Permission Boundary | IAM ユーザー/ロール | プリンシパルに紐付け | 「このロールが付与できる権限の最大範囲」を制限。権限エスカレーション防止 |
| Session Policy | 一時セッション(AssumeRole 時) | STS セッション | AssumeRole 時に追加制限。クロスアカウント時に使用 |
| ACL(Access Control List) | S3 / CloudFront | リソース単位 | オブジェクト単位のアクセス制御(レガシー、ポリシー推奨) |
1. Identity-based ポリシー(最も基本)
管理ポリシー(AWS 管理)
AWS が管理・定期的に更新するポリシー。一般的な用途は大体カバーされています。
例:
ReadOnlyAccess:すべての AWS サービスの読み取り専用PowerUserAccess:IAM 以外のすべてのサービスへのフルアクセスAmazonS3ReadOnlyAccess:S3 の読み取り専用
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": "*"
}
]
}
カスタマー管理ポリシー
自社で定義・管理するポリシー。複数のエンティティに再利用可能。本番環境はこの方式を推奨。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowS3ReadWriteSpecificBucket",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-app-bucket",
"arn:aws:s3:::my-app-bucket/*"
]
}
]
}
インラインポリシー
単一のエンティティにのみ紐付けられるポリシー。エンティティ削除時に一緒に削除。特殊な場合のみ使用。
2. Resource-based ポリシー
リソース側に定義するポリシー。クロスアカウントアクセスに必須。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111111111111:root"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::other-account-bucket/*"
}
]
}
ポイント:Principal フィールドが必須(Identity-based には不要)。
3. SCP(Service Control Policy)
AWS Organizations で OU(Organization Unit)に適用し、その配下のメンバーアカウント全体に対して「禁止」を設定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": [
"cloudtrail:DeleteTrail",
"cloudtrail:StopLogging"
],
"Resource": "*"
}
]
}
重要:
- ✅ 明示的な
Denyで拒否 - ❌ Allow を定義しても「上限」として機能(要注意)
- ❌ マスターアカウントには適用されない
4. Permission Boundary
IAM ユーザー/ロールが付与できる権限の「最大許可範囲」を定義。权限エスカレーション防止。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:*",
"dynamodb:*",
"lambda:*"
],
"Resource": "*"
}
]
}
ユースケース:開発者にセルフサービスでロール作成を許可するが、RDS・KMS へのアクセスロールは作成させない
5. Session Policy
AssumeRole で一時セッションを取得する際に追加制限を与える。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": "s3:DeleteBucket",
"Resource": "*"
}
]
}
ポリシー評価ロジック
初心者向けメモ: IAM のアクセス制御は「デフォルトは拒否」が原則です。Allow が明示されなければ、どんなに高い権限でも拒否されます。これを理解することが IAM 習得の鍵です。
AWS API 呼び出しがあると、以下のフローで「許可」「拒否」が判定されます:
【図2】ポリシー評価ロジック(Decision Tree)
graph TD
A["リクエスト"] --> B{"1. 明示的 Deny\nがあるか?"}
B -->|YES| C["❌ アクセス拒否\n(終了)"]
B -->|NO| D{"2. SCP(組織レベル)\nで Allow か?"}
D -->|NO| C
D -->|YES| E{"3. Resource-based\nポリシーで Allow か?"}
E -->|YES| F["クロスアカウントか?"]
F -->|NO| G["✅ アクセス許可"]
F -->|YES| H{"4. Identity-based\nポリシーで Allow か?"}
E -->|NO| H
H -->|NO| C
H -->|YES| I{"5. Permission Boundary\nで Allow か?"}
I -->|NO| C
I -->|YES| J{"6. Session Policy\nで Allow か?"}
J -->|NO| C
J -->|YES| G
評価ロジック詳細:
1. 明示的 Deny(Explicit Deny)がある?
→ YES:拒否(デフォルト拒否)。Deny は最強
2. SCP(組織レベル)に Allow または Allow がない?
→ NO:拒否
3. Resource-based ポリシーに Allow がある?
→ YES(クロスアカウント以外):許可
→ YES(クロスアカウント):次へ
4. Identity-based ポリシーに Allow がある?
→ NO:暗黙的拒否(Implicit Deny)
5. Permission Boundary(最大範囲)に Allow がある?
→ NO:拒否
6. Session Policy に Allow がある?
→ NO:拒否
→ YES:✅ アクセス許可
実例:
シナリオ:EC2(IAM ロール A)が S3 バケットにアクセス
ロール A のポリシー:
{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*"
}
S3 バケットポリシー:
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*"
}
→ 結果:拒否(Deny が Deny を超える)
IAM ポリシー JSON 具体例
例1:S3 特定バケットの読み取り専用
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "S3ReadOnlySpecificBucket",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:GetObjectVersion",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::app-data",
"arn:aws:s3:::app-data/*"
]
}
]
}
例2:EC2 インスタンスの起動・停止のみ
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "EC2StartStop",
"Effect": "Allow",
"Action": [
"ec2:StartInstances",
"ec2:StopInstances",
"ec2:DescribeInstances"
],
"Resource": "arn:aws:ec2:ap-northeast-1:123456789012:instance/*",
"Condition": {
"StringEquals": {
"ec2:ResourceTag/Environment": "dev"
}
}
}
]
}
例3:Lambda 関数実行ロール(DynamoDB・CloudWatch Logs アクセス)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DynamoDBAccess",
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:Query"
],
"Resource": "arn:aws:dynamodb:ap-northeast-1:123456789012:table/orders"
},
{
"Sid": "CloudWatchLogsAccess",
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:ap-northeast-1:123456789012:log-group:/aws/lambda/*"
}
]
}
例4:MFA 必須でコンソールアクセス制限
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowConsoleWithMFA",
"Effect": "Allow",
"Action": [
"ec2:*",
"s3:*"
],
"Resource": "*",
"Condition": {
"Bool": {
"aws:MultiFactorAuthPresent": "true"
}
}
},
{
"Sid": "DenyWithoutMFA",
"Effect": "Deny",
"Action": [
"ec2:TerminateInstances",
"rds:DeleteDBInstance"
],
"Resource": "*",
"Condition": {
"Bool": {
"aws:MultiFactorAuthPresent": "false"
}
}
}
]
}
例5:特定 IP からのみアクセス(VPN / 企業ネットワーク)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowFromCorporateNetwork",
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"203.0.113.0/24",
"198.51.100.0/24"
]
}
}
},
{
"Sid": "DenyFromPublicInternet",
"Effect": "Deny",
"Action": "s3:*",
"Resource": "*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"203.0.113.0/24",
"198.51.100.0/24"
]
}
}
}
]
}
主要ユースケース
初心者向けメモ: IAM は「セキュリティの基礎」というイメージが強いですが、実は様々なユースケースがあります。自分の業務パターンに合うものから学ぶことをお勧めします。
1. CI/CD パイプラインでの最小権限制御
課題:GitHub Actions / GitLab CI で AWS にデプロイする際、長期アクセスキーの安全管理が困難
IAM の解決:
- GitHub OIDC → IAM ロール(Web Identity Federation)
- → 短期クレデンシャル(1 時間以下)自動取得
- → リポジトリ・ブランチごとに権限を分離
- 例:本番デプロイロールは本番ブランチからのみ引き受け可
具体的なポリシー:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": "arn:aws:s3:::app-dist/*"
},
{
"Effect": "Allow",
"Action": "cloudfront:CreateInvalidation",
"Resource": "arn:aws:cloudfront::123456789012:distribution/ABCDEFG"
}
]
}
2. クロスアカウントアクセス
課題:複数の AWS アカウント間でアクセスを制御(本番・開発・監視アカウント分離)
IAM の解決:
Account A(本番)のロール ← Account B(監視)から AssumeRole
Trust Policy で Account B を信頼
→ 監視アカウントから本番リソースを読み取り
Account A ロールの Trust Policy:
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::222222222222:role/MonitoringRole"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "unique-external-id"
}
}
}
3. 外部 IdP フェデレーション(SSO)
課題:個人の Google / GitHub アカウントで AWS にログインしたい
IAM の解決:
- Google / GitHub OIDC Provider → IAM ロール自動引き受け
- → 長期クレデンシャル不要
- → Google / GitHub で MFA 済みなら AWS でも MFA 扱い
4. マイクロサービスのサービスロール
課題:ECS / Kubernetes で各コンテナに異なる権限を付与したい
IAM の解決:
- Task A(決済処理):RDS・KMS アクセスのみ
- Task B(監視エージェント):CloudWatch Logs・X-Ray アクセスのみ
- → コンテナが機能する最小権限のみ
- → Task A が漏洩しても決済データの外部流出を防止
5. 最小権限の原則(Least Privilege)実装
課題:開発者に「充分な権限」と「セキュリティ」を両立したい
IAM の解決:
1. ユースケースごとのカスタムポリシー定義
- 開発環境:EC2・Lambda・S3・DynamoDB のフルアクセス
- 本番環境:読み取り専用 + 限定的な変更
2. Permission Boundary で上限設定
- これ以上の権限は付与不可
3. CloudTrail で監査
- 誰が何をしたか記録
6. Privileged Access Management(PAM)
課題:root / admin ユーザーのアクセスを厳しく制御したい
IAM の解決:
- 個人が一般ロールで通常業務
- 特権操作が必要 → 一時的に高権限ロールを引き受け
- MFA + IP 制限 + 期限付き(セッション 1 時間等)
- すべての操作を CloudTrail でログ
7. AWS IAM Identity Center(旧 SSO)での統一認証
課題:複数の AWS アカウント・SaaS に個別に ID を管理するのが煩雑
IAM の解決:
- Identity Center で統一認証
- → 社員ディレクトリ(Okta / Azure AD)と同期
- → Slack / Salesforce / GitHub 等 30+ の SaaS に SSO
- → 離職時に Identity Center から削除すると全リソースアクセス失効
8. EKS での Pod Identity(IRSA 進化版)
課題:Kubernetes Pod が AWS リソースにアクセスする際、認証情報管理が複雑
IAM の解決(IRSA):
Pod → OIDC Provider → IAM ロール自動引き受け
→ クレデンシャルファイル配置不要
→ Pod 単位で異なるロール引き受け可
Kubernetes YAML:
apiVersion: v1
kind: ServiceAccount
metadata:
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::ACCOUNT:role/pod-role
9. CodePipeline での本番デプロイ権限制御
課題:自動デプロイは本番環境に影響するため、特定のパイプラインのみ許可
IAM の解決:
CodePipeline 実行ロール → CloudFormation AssumeRole
→ CloudFormation ロールに実際の権限を付与
→ CodePipeline の権限は限定的に
このパターンで:
- CodePipeline が乗っ取られても本番を直接変更できない
- CloudFormation で何ができるか明確に制御
10. Bastion ホストでのセッション管理
課題:Bastion ホストを介してプライベートリソースにアクセスする際、SSH キー管理が複雑
IAM の解決:
- EC2 Instance Connect / Session Manager
- → IAM 権限で制御
- → SSH キー不要
- → CloudTrail で全セッション記録
IAM Roles と Trust Policy
初心者向けメモ: IAM ロールは「一時的なセッションをシェアする仕組み」です。複数のプリンシパルが同じロールを引き受けることで、短期クレデンシャルを取得します。
IAM ロールの構成
IAM ロール = Trust Policy(誰がこのロールを引き受けられるか)+ Attached Policies(引き受けた後に何ができるか)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
Trust Policy の例
EC2 インスタンスが引き受けられるロール
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
クロスアカウントの別ロールが引き受けられるロール
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111111111111:role/SourceRole"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "unique-id-for-security"
}
}
}
]
}
OIDC 経由(GitHub / Google)がロール引き受け
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::123456789012:oidc-provider/token.actions.githubusercontent.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringLike": {
"token.actions.githubusercontent.com:sub": "repo:my-org/my-repo:ref:refs/heads/main"
}
}
}
]
}
STS と一時認証情報
初心者向けメモ: STS(Security Token Service) は「IAM ロールを引き受けて一時的なクレデンシャル(アクセスキー・シークレット・セッショントークン)を発行するサービス」です。
STS が発行する認証情報
- AccessKeyId : ASIABCDEFGHIJKLMNOP(一時キーは AS で始まる)
- SecretAccessKey : xxxxx…
- SessionToken : xxxxx…(一般的な長期キーにはない)
- Expiration : 2026-04-26T10:30:00Z(期限)
AssumeRole API
aws sts assume-role \
--role-arn arn:aws:iam::123456789012:role/MyRole \
--role-session-name my-session \
--duration-seconds 3600
戻り値:
{
"Credentials": {
"AccessKeyId": "ASIABCDEFGHIJKLMNOP",
"SecretAccessKey": "abc123...",
"SessionToken": "FwoGZXIvYXdzEF...",
"Expiration": "2026-04-26T10:30:00Z"
}
}
STS による認証フロー
EC2 インスタンス(IAM インスタンスプロファイル)
↓ STS 自動引き受け(バックグラウンド)
EC2 メタデータサービス(169.254.169.254)に問い合わせ
↓
STS が一時クレデンシャルを発行
↓ SessionToken 付きで返却
アプリケーションコード内から自動的に利用
IAM Identity Center(旧 SSO)
初心者向けメモ: IAM Identity Center は「AWS 独自のユーザー管理」と「外部ディレクトリ連携」の両方をサポートする統一認証基盤です。複数アカウント・複数 SaaS への SSO が可能です。
主な特徴
| 特徴 | 説明 |
|---|---|
| 無料 | 追加料金なし |
| ディレクトリ統合 | Azure AD / Okta / Google Workspace との同期 |
| 複数アカウント対応 | Organizations 配下の全アカウントで利用 |
| SaaS SSO | 30+ のアプリケーション対応 |
| MFA 標準装備 | 多要素認証が基本 |
| 権限セット | 複数アカウント・複数アプリに権限セットを一括適用 |
フロー
社員が Identity Center ポータルにログイン
↓
Azure AD / Okta で認証(または Identity Center ユーザーディレクトリ)
↓ MFA
↓
複数 AWS アカウント・SaaS に自動ログイン
↓ SAML / OIDC
IAM Access Analyzer
初心者向けメモ: IAM Access Analyzer は「あなたのリソースが想定外に公開されていないか」を自動検出するセキュリティツールです。
機能
Access Analyzer スキャン
↓
以下を自動検出:
- S3 バケットパブリックアクセス
- KMS キーを外部アカウントで使用可能
- IAM ロール(クロスアカウント)が外部ユーザーで引き受け可
- Lambda 関数が外部アカウントから呼び出し可
- 他多数のリソースベースポリシー
↓
異常を検出 → アラート生成
ポリシー検証機能
IAM ポリシーを変更 → 構文・ロジックエラーをリアルタイム検出
例:
- 存在しないサービスアクションを指定
- ワイルドカード乱用
- 矛盾した Allow / Deny
サービスコントロールポリシー(SCP)
初心者向けメモ: SCP は「AWS Organizations で全メンバーアカウントに対して『禁止』を適用する仕組み」です。個別ポリシーより強力です。
SCP と Identity-based ポリシーの関係
ユーザーポリシー:
"Effect": "Allow",
"Action": "s3:*"
組織の SCP:
"Effect": "Deny",
"Action": "s3:DeleteBucket"
結果:s3:DeleteBucket は拒否(Deny が勝利)
その他の s3:* は許可
典型的な SCP 設計
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": [
"cloudtrail:DeleteTrail",
"cloudtrail:StopLogging",
"cloudtrail:UpdateTrail"
],
"Resource": "*",
"Condition": {
"StringNotEquals": {
"aws:PrincipalOrgID": "o-xxxxxxxxxx"
}
}
},
{
"Effect": "Deny",
"Action": [
"ec2:TerminateInstances",
"rds:DeleteDBInstance"
],
"Resource": "*",
"Condition": {
"StringNotLike": {
"aws:username": "admin-*"
}
}
}
]
}
Permission Boundary
初心者向けメモ: Permission Boundary は「このロールが作成できる権限の上限」を制限します。権限エスカレーション防止に有効。
使用例
状況:開発者がセルフサービスでロールを作成可能にしたい、ただし RDS・KMS には触らせたくない
バウンダリー定義:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:*",
"dynamodb:*",
"lambda:*",
"apigateway:*"
],
"Resource": "*"
}
]
}
開発者のポリシー:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iam:*",
"Resource": "*"
}
]
}
結果:
- ✅ 開発者は EC2・Lambda・S3 ロールを作成可
- ❌ RDS・KMS ロールは作成不可(バウンダリーで弾かれる)
IAM Roles Anywhere
初心者向けメモ: IAM Roles Anywhere は「オンプレミス・他クラウド(GCP / Azure)で AWS IAM ロールを使用する仕組み」です。
ユースケース
オンプレミスサーバー
↓ X.509 証明書で認証
↓ IAM Roles Anywhere
↓
AWS IAM ロールを引き受け
↓
短期クレデンシャル取得
↓
AWS API を呼び出し
使用方法
# 証明書を使ってロールを引き受け
aws sts assume-role-with-web-identity \
--role-arn arn:aws:iam::123456789012:role/OnPremiseRole \
--role-session-name on-premise-session \
--certificate /path/to/cert.pem
ABAC(Attribute-Based Access Control)
初心者向けメモ: ABAC は「タグベースのアクセス制御」です。特定のタグを持つユーザーのみが、特定のタグを持つリソースにアクセス可能という仕組み。
RBAC vs ABAC
| 方式 | 定義方法 | スケーラビリティ | 例 |
|---|---|---|---|
| RBAC | ロール単位 | 多くのロール必要 | 開発者ロール、管理者ロール |
| ABAC | タグ単位 | 少数のポリシーで管理 | env=dev, team=backend タグ |
ABAC ポリシー例
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ec2:*",
"Resource": "*",
"Condition": {
"StringEquals": {
"ec2:ResourceTag/Environment": "${aws:PrincipalTag/Environment}",
"ec2:ResourceTag/Team": "${aws:PrincipalTag/Team}"
}
}
}
]
}
ポイント:
- ユーザータグ
Environment=dev - リソースタグ
Environment=dev - → マッチする環境のみアクセス可
EKS IRSA / Pod Identity
初心者向けメモ: Kubernetes Pod が AWS リソースにアクセスする際、認証情報を安全に管理する仕組みです。IRSA は旧方式、Pod Identity が最新です。
IRSA(IAM Roles for Service Accounts)
Kubernetes ServiceAccount
↓ OIDC トークン
↓
IAM ロール(Trust Policy で検証)
↓
短期クレデンシャル取得
↓
Pod が AWS API 利用
Trust Policy:
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::123456789012:oidc-provider/oidc.eks.ap-northeast-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"oidc.eks.ap-northeast-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:sub": "system:serviceaccount:default:my-app"
}
}
}
Pod Identity(新方式、AWS EKS ウィジェット 1.24+)
Pod Identity Agent(EKS アドオン)
↓ より簡単な設定
↓
IAM ロール
↓
短期クレデンシャル取得
Kubernetes Annotation:
apiVersion: v1
kind: ServiceAccount
metadata:
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/PodRole
EC2 Instance Profile
初心者向けメモ: EC2 インスタンスプロファイルは「EC2 インスタンスが IAM ロールを自動的に引き受ける仕組み」です。
フロー
EC2 インスタンス起動
↓ インスタンスプロファイル設定
↓
メタデータサービス(169.254.169.254)
↓ 自動的に STS AssumeRole
↓
短期クレデンシャル(AWS_ACCESS_KEY_ID 等)を環境変数で提供
↓
アプリケーションコードが自動的に利用(AWS SDK が自動取得)
設定例(CloudFormation)
Resources:
MyRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: ec2.amazonaws.com
Action: sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
MyInstanceProfile:
Type: AWS::IAM::InstanceProfile
Properties:
Roles:
- !Ref MyRole
MyInstance:
Type: AWS::EC2::Instance
Properties:
IamInstanceProfile: !Ref MyInstanceProfile
ImageId: ami-12345678
Lambda 実行ロール
初心者向けメモ: Lambda 関数を実行する際に、その関数が AWS リソースにアクセスするための権限を持つロールです。
設定例
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "logs:CreateLogGroup",
"Resource": "arn:aws:logs:ap-northeast-1:123456789012:*"
},
{
"Effect": "Allow",
"Action": [
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:ap-northeast-1:123456789012:log-group:/aws/lambda/*"
},
{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}
Trust Policy:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
クロスアカウントアクセスパターン
初心者向けメモ: 複数の AWS アカウント間でアクセスを制御するのが、IAM で最も複雑な部分です。ここは重要なので丁寧に解説します。
パターン1:基本的なクロスアカウントロール
状況:Account A(監視)から Account B(本番)を読み取りたい
Account B 側(リソースオーナー):
ロール B の Trust Policy:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111111111111:role/MonitoringRole"
},
"Action": "sts:AssumeRole"
}
]
}
ロール B のアタッチポリシー:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:Describe*",
"cloudwatch:GetMetricStatistics"
],
"Resource": "*"
}
]
}
Account A 側(リソース利用側):
Monitoring ロールのポリシー:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::222222222222:role/RoleB"
}
]
}
CLI での引き受け:
aws sts assume-role \
--role-arn arn:aws:iam::222222222222:role/RoleB \
--role-session-name monitoring-session
パターン2:ExternalId を使った外部識別
理由:ロール ARN が漏洩しても、ExternalId がないと引き受け不可
Account B の Trust Policy:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111111111111:role/MonitoringRole"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "unique-secret-string-12345"
}
}
}
]
}
CLI での引き受け:
aws sts assume-role \
--role-arn arn:aws:iam::222222222222:role/RoleB \
--role-session-name monitoring-session \
--external-id unique-secret-string-12345
パターン3:S3 バケットポリシー(リソースベースポリシー)
状況:Account A のユーザーが Account B の S3 バケットにアクセス
Account B の S3 バケットポリシー:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111111111111:root"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::shared-bucket/*"
}
]
}
Account A のユーザーポリシー:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::shared-bucket/*"
}
]
}
他の類似ツールとの比較
初心者向けメモ: AWS IAM の役割を理解するために、他の認証・認可プラットフォームと比較します。
AWS IAM vs Azure AD / Entra ID
| 項目 | AWS IAM | Azure AD / Entra ID |
|---|---|---|
| 主な用途 | AWS リソースアクセス制御 | Microsoft 365 / Azure リソース + SaaS SSO |
| ユーザー管理 | IAM User / Identity Center | User / Group |
| 外部 IdP 連携 | SAML / OIDC / SAML Provider | Native |
| 多要素認証 | MFA(TOTP / SMS) | Conditional Access + MFA |
| グラフ API | AWS API | Microsoft Graph |
| 価格 | 無料 | ユーザー単位(1 ユーザー = $2-6/月) |
| SaaS SSO | Identity Center で 30+ | Native で数百のアプリ対応 |
AWS IAM vs GCP IAM
| 項目 | AWS IAM | GCP IAM |
|---|---|---|
| リソース制御 | ポリシーベース | ロールベース |
| 粒度 | 非常に細粒度(アクション単位) | やや粗粒度(ロール単位) |
| 一時認証情報 | STS(15 分〜12 時間) | サービスアカウント |
| 組織管理 | Organizations + SCP | GCP Organization + Custom Roles |
| UI | AWS Management Console | Google Cloud Console |
AWS IAM vs Okta / Auth0
| 項目 | AWS IAM | Okta / Auth0 |
|---|---|---|
| 主な用途 | AWS アクセス制御 | 顧客向けアイデンティティ / SSO |
| 対象ユーザー | 従業員 | 従業員 / 顧客 |
| SaaS SSO | 30+ | 数千 |
| カスタマージャーニー | なし | 認証フロー / MFA / パスワードリセット |
| 価格 | 無料 | ユーザー単位 |
AWS IAM vs HashiCorp Vault
| 項目 | AWS IAM | HashiCorp Vault |
|---|---|---|
| 主な用途 | AWS アクセス制御 | シークレット・認証情報管理 |
| マルチクラウド | AWS のみ | AWS / Azure / GCP / Kubernetes |
| シークレット管理 | AWS Secrets Manager | Native |
| 認証方式 | IAM ユーザー / ロール | 多様(OIDC / JWT / Cloud 認証) |
| 価格 | 無料 | OSS 版は無料、Enterprise は有料 |
| 運用 | AWS マネージド | セルフホスト / HA 構成必要 |
クライアントとエコシステム
公式ツール
AWS CLI
# IAM ユーザー作成
aws iam create-user --user-name john
# ポリシーをアタッチ
aws iam attach-user-policy \
--user-name john \
--policy-arn arn:aws:iam::aws:policy/ReadOnlyAccess
# ロール作成
aws iam create-role \
--role-name MyRole \
--assume-role-policy-document file://trust-policy.json
AWS Management Console
- IAM ダッシュボード
- ユーザー / グループ / ロール管理
- ポリシーエディター
- アクセスレポート
IAM Policy Simulator
- IAM ポリシーが実際に「許可」「拒否」を判定するか事前に検証
Web UI:https://policysim.aws.amazon.com/
# CLI 版
aws iam simulate-principal-policy \
--policy-source-arn arn:aws:iam::123456789012:user/john \
--action-names s3:GetObject \
--resource-arns arn:aws:s3:::my-bucket/*
Access Advisor
- ユーザー/ロール が最後にアクセスした日時を確認
- → 未使用権限を削除してセキュリティ改善
サードパーティツール
Terraform(IAM Module)
module "lambda_role" {
source = "terraform-aws-modules/iam/aws//modules/iam-role-for-service-accounts-eks"
role_name = "my-lambda-role"
attach_s3_policy = true
s3_resources = ["arn:aws:s3:::my-bucket/*"]
attach_dynamodb_policy = true
dynamodb_table_arns = [aws_dynamodb_table.orders.arn]
}
Pulumi
import pulumi
import pulumi_aws as aws
role = aws.iam.Role("my-role",
assume_role_policy={
"Version": "2012-10-17",
"Statement": [{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
}
}]
})
CloudFormation
Resources:
MyRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: ec2.amazonaws.com
Action: sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/ReadOnlyAccess
CDK(TypeScript)
import * as cdk from 'aws-cdk-lib';
import * as iam from 'aws-cdk-lib/aws-iam';
const role = new iam.Role(this, 'MyRole', {
assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'),
managedPolicies: [
iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonS3ReadOnlyAccess')
]
});
ベストプラクティス
1. Root アカウント保護
❌ してはいけない:
- Root アカウントで日常業務
- Root アクセスキー作成・使用
- Root アカウント MFA なし
✅ すべきこと:
- Root アカウント MFA を設定(ハードウェアトークン推奨)
- Root アクセスキーを全て削除
- Root ログイン時は監査用ルール/アラート設定
- CloudTrail で全ログ記録
2. IAM Identity Center を推奨
❌ 非推奨:
- 個人ごとの IAM ユーザー + 長期アクセスキー
- → キー管理が煩雑、漏洩リスク
✅ 推奨:
- IAM Identity Center + 外部ディレクトリ連携
- → SSO、MFA 標準装備、一元管理
3. 最小権限の原則
❌ してはいけない:
{
"Effect": "Allow",
"Action": "*",
"Resource": "*"
}
✅ すべきこと:
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
]
}
4. CloudTrail ログ記録
✅ すべきこと:
- CloudTrail を全リージョン・全アカウントで有効化
- ログを S3 に保存(MFA Delete 有効化)
- CloudTrail Lake で 1 年間保持
- CloudWatch Logs 連携でリアルタイム監視
5. Access Advisor で未使用権限削除
✅ 定期的(月 1 回以上)に実施:
- IAM ユーザー/ロール の Access Advisor を確認
- 「最後にアクセス」が 90 日以上前の権限を削除
- CloudTrail で実際のアクセスパターンを確認
6. Permission Boundary の活用
✅ 開発者セルフサービスの場合:
- Permission Boundary を定義
- 開発者に「ロール作成権限」を付与
- 開発者が作成できるロールの権限は Boundary に制限
- → RDS・KMS 等へのアクセス防止
7. SCP で組織全体を守る
✅ Organizations 環境で必須:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": [
"cloudtrail:DeleteTrail",
"cloudtrail:StopLogging"
],
"Resource": "*"
}
]
}
8. クロスアカウント時は ExternalId
✅ セキュリティ向上:
{
"Condition": {
"StringEquals": {
"sts:ExternalId": "unique-secret-id"
}
}
}
9. MFA を強制
✅ 管理者・本番環境操作:
{
"Condition": {
"Bool": {
"aws:MultiFactorAuthPresent": "true"
}
}
}
10. IAM Access Analyzer で継続監視
✅ 定期的な外部アクセス検証:
- Access Analyzer を有効化
- 意図しない外部アクセス を自動検出
- 定期的(週 1 回)にレポート確認
トラブルシューティング
パターン1:「アクセスが拒否された」エラー
診断方法:
- IAM Policy Simulator で検証:
aws iam simulate-principal-policy \
--policy-source-arn arn:aws:iam::123456789012:user/john \
--action-names s3:GetObject \
--resource-arns arn:aws:s3:::my-bucket/*
- CloudTrail で実際の API 呼び出しを確認:
CloudTrail → イベント検索 → アクション = "GetObject" など
→ errorCode / errorMessage を確認
-
Permission Boundary が制限していないか確認
-
SCP で禁止されていないか確認(Organizations の場合)
パターン2:「AssumeRole に失敗」
チェック項目:
- Trust Policy で
Principalが正しいか - ExternalId が正しいか
- 呼び出し元に
sts:AssumeRole権限があるか - セッションの期限が切れていないか
パターン3:「リソースベースポリシーの競合」
S3 バケットに「アクセス可」のポリシー + 「アクセス不可」の IAM ユーザーポリシー
- 結果:最初の Deny が勝利 → アクセス拒否
解決:
- リソースベースポリシーで Allow
- AND IAM ユーザーポリシーで Allow → 両方必要
2025-2026 最新動向
1. AI ポリシー生成
AWS が生成 AI を使って IAM ポリシーを自動生成
- 「S3 バケット my-bucket に読み書きしたい」
- → AI が自動的に最小権限ポリシーを提案
- → ユーザーが確認・修正
2. Verified Access 統合強化
- CloudTrail との連携拡大
- デバイス検証・セッション管理の高度化
- ゼロトラストセキュリティ実装支援
3. Resource Control Policies(RCP)
SCP の後継、より細粒度な制御
- SCP:アクション単位の制御
- RCP:リソース単位の制御
4. Identity Center 統合強化
- SCIM 2.0 サポート
- SaaS 連携拡大(50+ アプリケーション対応予定)
- オン・プレミス AD との同期改善
5. CloudTrail Lake での IAM 監査ログ保持
- 1 年間の CloudTrail ログを SQL で分析可能
- IAM 変更履歴の長期追跡
学習リソース
公式ドキュメント
オンラインコース
- AWS Skill Builder:IAM Fundamentals
- Pluralsight:AWS IAM Deep Dive
- Linux Academy / A Cloud Guru:IAM for AWS
書籍
- 「AWS セキュリティ徹底解説」(AWS 公式ガイド)
- 「イラストでわかる AWS 根本から理解する」
実装例・活用シーン
シーン1:スタートアップの初期段階
要件:
- 少人数チーム(5 名以下)
- AWS アカウント 1 つ
- セキュリティは基本的に
構成:
- Root アカウント保護(MFA 設定)
- 開発者用 IAM ユーザー作成(PowerUserAccess)
- CloudTrail で監査ログ記録
シーン2:中規模企業・複数アカウント
要件:
- 複数チーム(開発・本番・監視)
- 複数 AWS アカウント
- クロスアカウントアクセス制御
構成:
1. Organizations 構成
- Management Account(監査用)
- Production Account
- Development Account
2. IAM Identity Center を中央で運用
3. クロスアカウント監視ロール
4. SCP で Organizations 全体を保護
5. CloudTrail Lake で長期監査
シーン3:エンタープライズ(コンプライアンス重視)
要件:
- 数十アカウント
- SOX / HIPAA / PCI-DSS コンプライアンス
- 厳格な監査・ログ管理
構成:
1. 監査用アカウント分離
2. Permission Boundary で権限管理
3. SCP で禁止操作を強制
4. CloudTrail Lake での長期保持
5. IAM Access Analyzer で継続監視
6. AWS Config で設定变更追跡
7. 定期的なセキュリティ監査(年 2 回以上)
導入ロードマップ
フェーズ 1:基礎構築(1-2 週間)
- ✅ Root アカウント MFA 設定
- ✅ CloudTrail 有効化
- ✅ 開発者用 IAM ユーザー作成
- ✅ 基本的なポリシー定義
フェーズ 2:セキュリティ強化(1 ヶ月)
- ✅ IAM Identity Center セットアップ
- ✅ 外部ディレクトリ連携(Azure AD 等)
- ✅ MFA 義務化
- ✅ Access Advisor で権限監査
フェーズ 3:ガバナンス確立(2-3 ヶ月)
- ✅ Organizations + SCP 導入
- ✅ クロスアカウント構造整備
- ✅ Permission Boundary 定義
- ✅ CloudTrail Lake 導入
フェーズ 4:継続改善(以降)
- ✅ 月 1 回の権限監査
- ✅ 四半期ごとのセキュリティレビュー
- ✅ ポリシーテンプレート更新
- ✅ 新サービス・新機能の導入評価
実装チェックリスト
セキュリティ
- [ ] Root アカウント MFA 設定済み
- [ ] Root アクセスキー削除済み
- [ ] CloudTrail 全リージョン有効
- [ ] S3 ログ保存バケット MFA Delete 有効
- [ ] アクセスキー自動ローテーション設定
- [ ] 90 日以上使用されていない権限削除
アイデンティティ管理
- [ ] IAM Identity Center 導入済み
- [ ] 外部ディレクトリ連携設定
- [ ] MFA デバイス配布済み
- [ ] 長期 IAM ユーザー排除(Identity Center に移行)
ポリシー管理
- [ ] 最小権限ポリシー定義
- [ ] Permission Boundary 定義
- [ ] SCP で禁止操作を強制
- [ ] ポリシードキュメント化
- [ ] ポリシーレビュー頻度設定(四半期ごと)
モニタリング・監査
- [ ] CloudTrail Lake 導入
- [ ] IAM Access Analyzer 有効
- [ ] 月 1 回の権限監査実施
- [ ] CloudWatch Logs アラート設定
- [ ] セキュリティ監査報告体制構築
まとめ
IAM は AWS セキュリティの根幹 です。以下のポイントを押さえることが重要です:
| ポイント | 説明 |
|---|---|
| Root 保護 | MFA + アクセスキー削除が最初の 1 歩 |
| 最小権限 | 「必要なアクション・リソースのみ」を原則に |
| 一時認証情報 | 長期キーを排除、STS による短期クレデンシャルを活用 |
| 組織管理 | Organizations + SCP で全体を守る |
| 継続監視 | CloudTrail + Access Analyzer で定期監査 |
| フェデレーション | IAM Identity Center + 外部 IdP で SSO 実現 |
| クロスアカウント | Trust Policy + ExternalId で安全に連携 |
IAM を正しく理解・運用することで、AWS 環境全体のセキュリティレベルが大きく向上します。
参考文献
AWS 公式ドキュメント
- AWS IAM User Guide - Introduction
- IAM Best Practices
- IAM JSON Policy Reference
- IAM Policies and Permissions
- AWS IAM Features
- IAM Access Analyzer User Guide
- AWS Organizations Service Control Policies
- AWS IAM Identity Center
- AWS STS Assumed Role User
- EKS IAM Roles for Service Accounts
- AWS Security Best Practices
外部リソース
- Open Policy Agent (OPA) - Decoupled Authorization - IAM ポリシー外部化、プロビジョニング自動化
- HashiCorp Vault - Identity and Access Management - マルチクラウド ID 管理
- NIST Cybersecurity Framework - IAM に関連するセキュリティフレームワーク
- Zero Trust Architecture - Google Cloud Security Whitepaper
- AWS Well-Architected Framework - Security Pillar
- IAM Policy Autopilot - AWS Labs - AI ポリシー生成(2026新機能)
- SPIFFE/SPIRE - Workload Identity at Scale - マイクロサービス ID 管理
- AWS IAM Identity Center MFA Documentation - フェデレーション統合
2025-2026 参考URL
- IAM Access Analyzer Policy Generation
- Resource Control Policies (RCPs) - AWS Organizations
- AWS Security Blog - IAM Updates
最終更新:2026-04-26