iam について
AWS Identity and Access Managementを管理するための実用的なリファレンススキルです。開発者や管理者向けに、ポリシー、ロール、アクセス障害の調査、セキュリティ対策を解説します。
主な機能
- 01ポリシーとプリンシパルの概念
- 02ロールと信頼関係の設定
- 03AWS CLIコマンドリファレンス
- 04最小権限の指針
- 05アクセスエラーの診断
活用シーン
- 01Lambdaサービスロールの作成
- 02クロスアカウントロールアクセスの設定
- 03APIリクエスト拒否の調査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ itsmostafa/ aws-agent-skills --skill iamインストール後、Claude Code で/iamを入力して読み込まれたか確認します。
同梱ファイルbest-practices.mdpolicies.md
詳細
AWS IAM
AWS Identity and Access Management(IAM)は、AWS サービスとリソースへの安全なアクセス制御を実現します。IAM は AWS のセキュリティの基盤であり、すべての AWS API 呼び出しは IAM を通じて認証および認可されます。
目次
主要な概念
プリンシパル
AWS にリクエストを送信できるエンティティです。IAM ユーザー、ロール、フェデレーションユーザー、アプリケーションが含まれます。
ポリシー
権限を定義する JSON ドキュメントです。種類は次のとおりです。
- アイデンティティベース:ユーザー、グループ、またはロールにアタッチされます
- リソースベース:リソース(S3 バケット、SQS キュー)にアタッチされます
- アクセス許可の境界:アイデンティティが持つことのできるアクセス許可の上限です
- サービスコントロールポリシー(SCP):組織全体に適用される制限です
ロール
信頼されたエンティティが引き受けられる、アクセス許可を持つアイデンティティです。永続的な認証情報は使用せず、一時的なセキュリティトークンを使用します。
信頼関係
ロールを引き受けられるプリンシパルを定義します。ロールの信頼ポリシーで設定します。
一般的なパターン
Lambda 用のサービスロールを作成する
AWS CLI:
# Create the trust policy
cat > trust-policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "Service": "lambda.amazonaws.com" },
"Action": "sts:AssumeRole"
}
]
}
EOF
# Create the role
aws iam create-role \
--role-name MyLambdaRole \
--assume-role-policy-document file://trust-policy.json
# Attach a managed policy
aws iam attach-role-policy \
--role-name MyLambdaRole \
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
boto3:
import boto3
import json
iam = boto3.client('iam')
trust_policy = {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {"Service": "lambda.amazonaws.com"},
"Action": "sts:AssumeRole"
}
]
}
# Create role
iam.create_role(
RoleName='MyLambdaRole',
AssumeRolePolicyDocument=json.dumps(trust_policy)
)
# Attach managed policy
iam.attach_role_policy(
RoleName='MyLambdaRole',
PolicyArn='arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'
)
最小権限でカスタムポリシーを作成する
cat > policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:PutItem",
"dynamodb:Query"
],
"Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/MyTable"
}
]
}
EOF
aws iam create-policy \
--policy-name MyDynamoDBPolicy \
--policy-document file://policy.json
クロスアカウントでロールを引き受ける
# In Account B (trusted account), create role with trust for Account A
cat > cross-account-trust.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "AWS": "arn:aws:iam::111111111111:root" },
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": { "sts:ExternalId": "unique-external-id" }
}
}
]
}
EOF
# From Account A, assume the role
aws sts assume-role \
--role-arn arn:aws:iam::222222222222:role/CrossAccountRole \
--role-session-name MySession \
--external-id unique-external-id
CLI リファレンス
基本的なコマンド
| コマンド | 説明 |
|---|---|
aws iam create-role | 新しい IAM ロールを作成します |
aws iam create-policy | カスタマー管理ポリシーを作成します |
aws iam attach-role-policy | 管理ポリシーをロールにアタッチします |
aws iam put-role-policy | インラインポリシーをロールに追加します |
aws iam get-role | ロールの詳細を取得します |
aws iam list-roles | すべてのロールを一覧表示します |
aws iam simulate-principal-policy | ポリシーのアクセス許可をテストします |
aws sts assume-role | ロールを引き受け、一時的な認証情報を取得します |
aws sts get-caller-identity | 現在のアイデンティティを取得します |
便利なフラグ
--query:JMESPath で出力をフィルタリングします--output table:人が読みやすい形式で出力します--no-cli-pager:スクリプト実行時にページャーを無効にします
ベストプラクティス
セキュリティ
- 日常的な作業に ルートアカウントを使用しないでください
- すべての人間のユーザーに対して MFA を有効にしてください
- 長期アクセスキーの代わりに ロールを使用してください
- 最小権限を適用し、必要なアクセス許可のみを付与してください
- IP、時間、または MFA によるアクセス制限に 条件を使用してください
- 認証情報を定期的にローテーションしてください
- 委任された管理には アクセス許可の境界を使用してください
ポリシーの設計
- AWS 管理ポリシーから始め、必要に応じてカスタマイズします
- 動的なポリシーにはポリシー変数(
${aws:username})を使用します - 機密性の高い操作には明示的な拒否を優先します
- 関連するアクセス許可を論理的にグループ化します
モニタリング
- API の監査には CloudTrail を有効にします
- 過度に許可的なポリシーを特定するには IAM Access Analyzer を使用します
- 認証情報レポートを定期的に確認します
- ルートアカウントの使用に関するアラートを設定します
トラブルシューティング
アクセス拒否エラー
症状: AccessDeniedException または UnauthorizedAccess
デバッグ手順:
- アイデンティティを確認します:
aws sts get-caller-identity - アタッチされているポリシーを確認します:
aws iam list-attached-role-policies --role-name MyRole - 操作をシミュレートします:
aws iam simulate-principal-policy \ --policy-source-arn arn:aws:iam::123456789012:role/MyRole \ --action-names dynamodb:GetItem \ --resource-arns arn:aws:dynamodb:us-east-1:123456789012:table/MyTable - SCP またはアクセス許可の境界に明示的な拒否がないか確認します
- リソースベースのポリシーでプリンシパルが許可されていることを確認します
ロールを引き受けられない
症状: AssumeRole の呼び出し時に AccessDenied
原因:
- 信頼ポリシーに呼び出し元のプリンシパルが含まれていません
- 呼び出し元に
sts:AssumeRoleのアクセス許可がありません - ExternalId が一致しません(クロスアカウントロールの場合)
- セッション期間が最大値を超えています
解決策: ロールの信頼関係を確認して更新します。
ポリシーのサイズ制限
- 管理ポリシー:6,144 文字
- インラインポリシー:2,048 文字(ユーザー)、10,240 文字(ロール/グループ)
- 信頼ポリシー:2,048 文字
解決策: 複数のポリシーを使用する、プレフィックスやワイルドカードでリソースを指定する、またはタグベースのアクセス制御を使用します。
References
コメント
Markdown 対応