IAM

【グローバルサービス】

IAM(Identity and Access Management)は、IAMユーザIAMグループIAMロールIAMポリシーを用いて、AWSリソースへのアクセス権限を最小限に付与するための基盤となるサービスです。

IAMポリシーはJSON形式で記述されるアクセス制御ルールであり、許可ポリシーは、「どのリソースに対して、どの操作を、どの条件下で許可するか」を定義できます。信頼ポリシーはIAMロールに関連付けられ、「どのエンティティ(ユーザ・サービス・アカウント)がそのロールを引き受けることを許可されているか」を定義します。

また、STS(Security Token Service)を利用することで、一時的な認証情報を発行し、サービス間の委任や外部システムからの安全なアクセスを実現します。これにより、システム内に秘密情報を埋め込む必要がなくなり、セキュリティリスクを大幅に低減できます。

IAMでは、MFA認証(多要素認証)によってアカウント保護を強化し、アクセスキーの管理やSAML/OIDCフェデレーションによる企業のIdP(アイデンティティプロバイダ)との連携にも対応しています。さらに、IAM Identity Centerを利用することで、複数アカウントや外部アプリケーションへのSSO(シングルサインオン)を実現し、ユーザ管理を一元化できます。

組織全体でのアクセス制御には、Organizationsを活用し、複数アカウントを統合的に管理できます。OrganizationsのSCP(サービスコントロールポリシー)とIAMポリシーを組み合わせることで、より強固なセキュリティガバナンスを構築できます。

また、CloudTrailを用いてIAM操作やAPI呼び出しを記録し、Configでリソース構成やポリシーの準拠状況を監査することで、変更履歴とコンプライアンスを継続的に可視化します。

さらに、IAM Access Analyzerを利用することで、過剰な公開設定や外部からアクセス可能なリソースを自動的に検出し、最小権限の原則に基づいたセキュアな運用を支援します。

重要用語

関連サービス
Organizations

ユースケース

ユーザーと権限の管理AWSアカウントの利用者にIAMユーザーやIAMロールを割り当て、最小権限のポリシーで操作可能な範囲を細かく制御する。
アプリケーション用ロールでの一時認証EC2・Lambda・ECSなどにIAMロールを付与し、長期アクセスキーを使わずに一時的な認証情報でAWSリソースへアクセスさせる。
グループ・ポリシーによる組織的権限設計職務(管理者・開発者・閲覧者など)ごとにIAMグループとポリシーを定義し、ユーザーをグループに所属させることで権限を一括管理する。

ベストプラクティス

最小権限の原則必要な操作とリソースだけを許可するポリシーを設計する。
IAMロール優先の設計長期アクセスキーではなくロールベースの一時クレデンシャルを利用する。
アクセスアナライザーとレポート確認不要な権限や外部公開を検出し、定期的に見直す。

高可用性・バックアップ・リトライ

高可用性・バックアップ・リトライ設計のポイント
【デフォルト】AWS内部で冗長化
 ・データプレーンの各リージョン独立配置
 ・データプレーンのマルチAZ配置
 ・AZ損失を許容する容量設計
 ・データプレーンの読み取り専用レプリカ構成

セキュリティ

関連サービス設定内容
Secrets Manager(機密情報の安全管理)-シークレット(秘密情報)の作成が推奨
 アプリ用一時資格情報や外部システムのキー-
SSM Parameter Store(設定情報の一元管理)-
CloudTrail(操作履歴の記録・監査・追跡)【自動記録】
作成・更新・削除・設定変更は自動記録される。(コントロールプレーンAPI)
データ操作は追跡できない(データプレーンAPI)
Config(リソースの構成状態・設定変更を記録)【Configが有効な場合】
「パスワードポリシー/ルートMFA/不要なアクセスキー」等の準拠評価(※グローバル記録有効時)
GuardDuty(脅威を自動検出)【GuardDutyが有効な場合】
ユーザー/ロール/ポリシー改ざんのAPI異常検知

ログ・監視

標準メトリクス
メトリクス名説明

制限値(固定値/ハードリミット/ソフトリミット)

固定値制限値
グループあたりのユーザー数制限なし

ハードリミット制限値
ポリシーのサイズ6,144文字
ユーザーあたりのグループ数10
ロールあたりの管理ポリシー数20
MFAデバイス数/ユーザー8
アクセスキー数/ユーザー2

ソフトリミット制限値
ユーザー数/アカウント5,000
グループ数/アカウント300
ロール数/アカウント1,000
カスタマー管理ポリシー数/アカウント1,500
インスタンスプロファイル数/アカウント1,000
サーバー証明書数/アカウント20

AWS CLIのサンプルコード

ユーザを作成する
aws iam create-user \
  --user-name my-user \
  --tags Key=Name,Value=my-user Key=Department,Value=Engineering
ユーザを表示する
aws iam list-users
ユーザを削除する(ユーザ名 指定)
aws iam delete-user \
  --user-name my-user

グループを作成する
aws iam create-group \
  --group-name developers
グループを表示する
aws iam list-groups
グループを削除する(グループ名 指定)
aws iam delete-group \
  --group-name developers

グループにユーザを追加する(ユーザ名、グループ名 指定)
aws iam add-user-to-group \
  --user-name my-user \
  --group-name developers
グループに所属するユーザを表示する(グループ名 指定)
aws iam get-group \
  --group-name developers
グループからユーザを削除する(ユーザ名、グループ名 指定)
aws iam remove-user-from-group \
  --user-name my-user \
  --group-name developers

権限設定のパターンIAMポリシーのアタッチ方法
ユーザの権限設定(常時必要な権限)ユーザにポリシーをアタッチ
複数ユーザの権限設定グループにIリシーをアタッチ
ユーザのの権限設定( 一時的・条件付き権限)
サービスの権限設定
ロールにポリシーをアタッチ
ロールをユーザ、サービスが引き受ける
※)ユーザ:IAMユーザ  グループ:IAMグループ  ロール:IAMロール

ポリシーの種類作成方法
AWS管理ポリシーユーザーは作成・変更できない
カスタマー管理ポリシーコマンドで作成する
 aws iam create-policy
インラインポリシーコマンドで作成する
 aws iam put-user-policy
 aws iam put-group-policy
 aws iam put-role-policy

カスタマー管理ポリシーを作成する
aws iam create-policy \
  --policy-name MyS3ReadPolicy \
  --policy-document file://policy.json \
  --tags Key=Name,Value=MyS3ReadPolicy
カスタマー管理ポリシーを表示する
aws iam list-policies \
  --scope Local
カスタマー管理ポリシーを削除する(ポリシーのARN 指定)
aws iam delete-policy \
  --policy-arn arn:aws:iam::account-id:policy/MyS3ReadPolicy

ユーザに管理ポリシーをアタッチする(ユーザ名、ポリシーのARN 指定)
aws iam attach-user-policy \
  --user-name my-user \
  --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
ユーザにアタッチされた管理ポリシーを表示する(ユーザ名 指定)
aws iam list-attached-user-policies \
  --user-name my-user
ユーザから管理ポリシーをデタッチする(ユーザ名、ポリシーのARN 指定)
aws iam detach-user-policy \
  --user-name my-user \
  --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess

グループに管理ポリシーをアタッチする(グループ名、ポリシーのARN 指定)
aws iam attach-group-policy \
  --group-name developers \
  --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
グループにアタッチされた管理ポリシーを表示する(グループ名 指定)
aws iam list-attached-group-policies \
  --group-name developers
グループから管理ポリシーをデタッチする(グループ名、ポリシーのARN 指定)
aws iam detach-group-policy \
  --group-name developers \
  --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess

IAMロールを作成する(信頼ポリシーのファイル名 指定)
iam-trust-policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:user/MyUser"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
aws iam create-role \
  --role-name IAMAssumeRole \
  --assume-role-policy-document file://iam-trust-policy.json
IAMロールを表示する
aws iam list-roles
IAMロールを削除する(ロール名 指定)
aws iam delete-role \
  --role-name IAMAssumeRole

IAMロールに管理ポリシーをアタッチする(ロール名、ポリシーのARN 指定)
aws iam attach-role-policy \
  --role-name IAMAssumeRole \
  --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
IAMロールにアタッチされた管理ポリシーを表示する(ロール名 指定)
aws iam list-attached-role-policies \
  --role-name IAMAssumeRole
IAMロールから管理ポリシーをデタッチする(ロール名、ポリシーのARN 指定)
aws iam detach-role-policy \
  --role-name IAMAssumeRole \
  --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess

ユーザーがIAMロールを引き受ける(ロールのARN 指定)
aws sts assume-role \
  --role-arn arn:aws:iam::123456789012:role/IAMAssumeRole \
  --role-session-name MySession


# 応答された一時的な認証情報(AccessKeyId, SecretAccessKey, SessionToken)を環境変数に設定する

export AWS_ACCESS_KEY_ID=<AccessKeyId>
export AWS_SECRET_ACCESS_KEY=<SecretAccessKey>
export AWS_SESSION_TOKEN=<SessionToken>
ユーザーの現在のIAMロール状態を表示する
aws sts get-caller-identity
ユーザーがIAMロールの引き受けを解除する(有効期限切れで自動解除される:1時間)
# 一時的な認証情報(AccessKeyId, SecretAccessKey, SessionToken)を環境変数から削除する

unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset AWS_SESSION_TOKEN

アクセスキーを作成する(ユーザ名 指定)
aws iam create-access-key \
  --user-name my-user
アクセスキーを表示する(ユーザ名 指定)
aws iam list-access-keys \
  --user-name my-user
アクセスキーを削除する(ユーザ名、アクセスキー 指定)
aws iam delete-access-key \
  --user-name my-user \
  --access-key-id AKIAIOSFODNN7EXAMPLE

Instance Profileを作成する(推奨:Instance Profile名をロール名と同じにする)
aws iam create-instance-profile \
  --instance-profile-name SSMInstanceProfile
Instance Profileを表示する
aws iam list-instance-profiles
Instance Profileを削除する(Instance Profile 指定)
aws iam delete-instance-profile \
  --instance-profile-name SSMInstanceProfile

Instance Profileにインスタンスロールを追加する(Instance Profile、ロール名 指定)
aws iam add-role-to-instance-profile \
  --instance-profile-name SSMInstanceProfile \
  --role-name SSMInstanceRole
Instance Profileのインスタンスロールを表示する(Instance Profile 指定)
aws iam get-instance-profile \
  --instance-profile-name SSMInstanceProfile
Instance Profileからインスタンスロールを削除する(Instance Profile、ロール名 指定)
aws iam remove-role-from-instance-profile \
  --instance-profile-name SSMInstanceProfile \
  --role-name SSMInstanceRole

現在の実行ユーザーを確認
aws sts get-caller-identity

ユーザのインラインポリシーの一覧を表示する(ユーザ名 指定)
aws iam list-user-policies \
  --user-name MyUser
グループのインラインポリシーの一覧を表示する(グループ名 指定)
aws iam list-group-policies \
  --group-name MyGroup
ロールのインラインポリシーの一覧を表示する(ロール名 指定)
aws iam list-role-policies \
  --role-name MyRole

ユーザのインラインポリシーの内容を表示する(ユーザ名、ポリシー名 指定)
aws iam get-user-policy \
  --user-name MyUser \
  --policy-name MyInlinePolicy
グループのインラインポリシーの内容を表示する(グループ名、ポリシー名 指定)
aws iam get-group-policy \
  --group-name MyGroup \
  --policy-name MyInlinePolicy
ロールのインラインポリシーの内容を表示する(ロール名、ポリシー名 指定)
aws iam get-role-policy \
  --role-name MyRole \
  --policy-name MyInlinePolicy

CloudFormationのサンプルコード

Terraformのサンプルコード

料金計算

課金項目説明
IAM自体は無料-

公式ページ

AWSドキュメント IAM