mcpField
I
iam

iam

github.com/itsmostafaセキュリティ1.2k144 回インストール2 日前に更新
リポジトリ

iam について

AWS Identity and Access Managementを管理するための実用的なリファレンススキルです。開発者や管理者向けに、ポリシー、ロール、アクセス障害の調査、セキュリティ対策を解説します。

主な機能

  1. 01ポリシーとプリンシパルの概念
  2. 02ロールと信頼関係の設定
  3. 03AWS CLIコマンドリファレンス
  4. 04最小権限の指針
  5. 05アクセスエラーの診断

活用シーン

  1. 01Lambdaサービスロールの作成
  2. 02クロスアカウントロールアクセスの設定
  3. 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

デバッグ手順:

  1. アイデンティティを確認します:aws sts get-caller-identity
  2. アタッチされているポリシーを確認します:aws iam list-attached-role-policies --role-name MyRole
  3. 操作をシミュレートします:
    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
    
  4. SCP またはアクセス許可の境界に明示的な拒否がないか確認します
  5. リソースベースのポリシーでプリンシパルが許可されていることを確認します
ロールを引き受けられない

症状: AssumeRole の呼び出し時に AccessDenied

原因:

  • 信頼ポリシーに呼び出し元のプリンシパルが含まれていません
  • 呼び出し元に sts:AssumeRole のアクセス許可がありません
  • ExternalId が一致しません(クロスアカウントロールの場合)
  • セッション期間が最大値を超えています

解決策: ロールの信頼関係を確認して更新します。

ポリシーのサイズ制限
  • 管理ポリシー:6,144 文字
  • インラインポリシー:2,048 文字(ユーザー)、10,240 文字(ロール/グループ)
  • 信頼ポリシー:2,048 文字

解決策: 複数のポリシーを使用する、プレフィックスやワイルドカードでリソースを指定する、またはタグベースのアクセス制御を使用します。

References

コメント