AWS IAM とは?基本的な使い方やポリシーを学ぼう
AWS を安全に運用するためには、アクセス権限の管理が欠かせません。AWS IAM(Identity and Access Management)は、誰が何にアクセスできるかを細かく制御できるサービスです。本記事では IAM の基本概念から実際の使い方まで説明します。
AWS IAM とは
IAM は AWS リソースへのアクセスを安全に管理するためのサービスです。IAM を使うことで、AWS アカウント内のユーザーやサービスに対して「何ができるか」を細かく設定できます。
たとえば「このユーザーは S3 の読み取りだけ許可する」「この EC2 インスタンスは特定の S3 バケットにのみ書き込める」といった制御が可能です。IAM は AWS セキュリティの根幹をなすサービスであり、適切に設定することで意図しないアクセスや情報漏洩のリスクを大幅に減らすことができます。
IAM とは - AWS Identity and Access Management
AWS Identity and Access Management (IAM) およびその機能と基本概念について説明します。
IAM の主要コンポーネント
IAM には 4 つの主要なコンポーネントがあります。それぞれが「誰が」「何を」「どのように」アクセスできるかを決める役割を担っています。
| コンポーネント | 説明 | 主な用途 |
|---|---|---|
| ユーザー (User) | AWS にサインインするための個人向けのアイデンティティ。パスワードやアクセスキーで認証する | マネジメントコンソールへのログイン、CLI からのアクセス |
| グループ (Group) | 複数の IAM ユーザーをまとめたコレクション。グループへのポリシー付与でメンバー全員の権限を一括管理できる | 「開発者」「運用チーム」など役割単位での権限管理 |
| ロール (Role) | パスワードやアクセスキーを持たず、一時的な認証情報を発行するアイデンティティ。AWS サービスや外部 ID が引き受ける | EC2・Lambda などの AWS サービスへの権限付与 |
| ポリシー (Policy) | 権限を定義した JSON ドキュメント。ユーザー・グループ・ロールにアタッチして使用する | 特定サービスへの読み取り専用アクセス、全サービスの管理者権限など |
人間が操作する場合は IAM ユーザーを作成し、アプリケーションや AWS サービスには IAM ロールを使用することが推奨されています。ロールはアクセスキーを持たないため、キーの漏洩リスクがなく、より安全です。
セキュリティのベストプラクティス
IAM を安全に運用するために押さえておくべきポイントをまとめます。権限の設計ミスは情報漏洩や意図しないリソース操作につながるため、最初から正しい方針で設定することが重要です。
IAM でのセキュリティのベストプラクティス - AWS Identity and Access Management
AWS Identity and Access Management (IAM) を使用する際のベストプラクティスに従って、AWS アカウントとリソース保護します。
| プラクティス | 内容 | 理由 |
|---|---|---|
| ルートユーザーを使わない | 日常作業には IAM ユーザーを使用し、ルートユーザーはアカウント設定など特別な操作のみに限定する | ルートユーザーはすべての権限を持つため、漏洩時の影響が最大になる |
| 最小権限の原則 | "Action": "*" のような広すぎる権限を避け、実際に必要なアクションのみを付与する | 不要な権限は誤操作や攻撃の攻撃面を広げる |
| MFA を有効化する | マネジメントコンソールへのログインに多要素認証を設定する。管理者権限を持つユーザーには必須 | パスワードが漏洩しても不正ログインを防げる |
AWS CLI で IAM を使ってみる
IAM ロールを作成し、IAM ユーザーが sts assume-role でそのロールを引き受けることで「許可された操作」と「拒否される操作」の違いを確認します。なお、sts assume-role の呼び出し自体は IAM ユーザーのアクセスキーによる認証が前提となります。
IAM ロールの作成とポリシーのアタッチ
IAM ロールには「誰がこのロールを使えるか」を定義するファイルが必要です。Principal の AWS にはご自身の AWS アカウント ID を指定します。今回は同じ AWS アカウント内のユーザーであれば誰でもこのロールを引き受けられるように設定します。
❯ cat > trust-policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:root"
},
"Action": "sts:AssumeRole"
}
]
}
EOF
この設定ファイルを指定してロールを作成します。
❯ aws iam create-role \
--role-name exrecord-s3-readonly-role \
--assume-role-policy-document file://trust-policy.json
{
"Role": {
"Path": "/",
"RoleName": "exrecord-s3-readonly-role",
"RoleId": "AROA0a1b2c3d4e5f67890",
"Arn": "arn:aws:iam::123456789012:role/exrecord-s3-readonly-role",
"CreateDate": "2026-04-15T09:47:12+00:00",
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:root"
},
"Action": "sts:AssumeRole"
}
]
}
}
}
作成したロールに、S3 の読み取りのみ許可する AWS 管理ポリシー AmazonS3ReadOnlyAccess をアタッチします。
❯ aws iam attach-role-policy \
--role-name exrecord-s3-readonly-role \
--policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
ロールの引き受けと一時認証情報の取得
sts assume-role でロールを引き受け、発行された一時認証情報を環境変数に設定します。この一時認証情報はデフォルトで 1 時間で失効します。
❯ aws sts assume-role \
--role-arn arn:aws:iam::123456789012:role/exrecord-s3-readonly-role \
--role-session-name test-session
{
"Credentials": {
"AccessKeyId": "ASIA0a1b2c3d4e5f67890",
"SecretAccessKey": "0a1b2c3d4e5f67890",
"SessionToken": "AQoDYXdzEJr...",
"Expiration": "2026-04-15T10:48:56+00:00"
},
"AssumedRoleUser": {
"AssumedRoleId": "AROA0a1b2c3d4e5f67890:test-session",
"Arn": "arn:aws:sts::123456789012:assumed-role/exrecord-s3-readonly-role/test-session"
}
}
レスポンスの Credentials に含まれる値を環境変数に設定します。これ以降の CLI 操作はこの一時認証情報、つまりロールの権限で実行されます。
❯ export AWS_ACCESS_KEY_ID=ASIA0a1b2c3d4e5f67890
❯ export AWS_SECRET_ACCESS_KEY=0a1b2c3d4e5f67890
❯ export AWS_SESSION_TOKEN=AQoDYXdzEJr...
許可された操作(S3 の読み取り)
AmazonS3ReadOnlyAccess が付与されているため、バケット一覧の取得は正常に完了します。
❯ aws s3 ls
2026-04-15 18:57:05 exrecord-test-bucket
拒否される操作(S3 への書き込み)
読み取りのみ許可されているため、ファイルのアップロードは AccessDenied エラーになります。
❯ aws s3 cp test.txt s3://exrecord-test-bucket
upload failed: ./test.txt to s3://exrecord-test-bucket/test.txt An error occurred (AccessDenied) when calling the PutObject operation: User: arn:aws:sts::123456789012:assumed-role/exrecord-s3-readonly-role/test-session is not authorized to perform: s3:PutObject on resource: "arn:aws:s3:::exrecord-test-bucket/test.txt" because no identity-based policy allows the s3:PutObject action
拒否される操作(EC2 へのアクセス)
EC2 に関する権限は一切付与していないため、インスタンス一覧の取得もエラーになります。
❯ aws ec2 describe-instances
aws: [ERROR]: An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation. User: arn:aws:sts::123456789012:assumed-role/exrecord-s3-readonly-role/test-session is not authorized to perform: ec2:DescribeInstances because no identity-based policy allows the ec2:DescribeInstances action
このように、IAM ロールで付与したポリシーによって「できること」と「できないこと」が明確に分離されていることが確認できます。最小権限の原則に従った設定が、想定外の操作を防ぐ有効な手段になります。
運用での利用について
今回の方法は sts assume-role の実行と環境変数の設定を毎回手動で行う必要があり、実際の運用では手間がかかります。実運用では AWS IAM Identity Center(旧 AWS SSO)の使用が推奨されています。
IAM Identity Center を使うと、以下のコマンドでブラウザ経由のログインが完了し、ロールの一時認証情報が自動的に発行・更新されます。
❯ aws sso login --profile my-profile
以降は --profile my-profile を指定するだけで、手動での assume-role や環境変数の設定が不要になります。
IAM Identity Center とは何ですか? - AWS IAM アイデンティティセンター
AWS IAM アイデンティティセンター は、ワークフォースユーザーを Kiro や Amazon Quick などの AWS マネージドアプリケーションやその他の AWS リソースに接続するための ...
まとめ
AWS IAM の基本概念と使い方について説明しました。IAM は AWS セキュリティの根幹をなすサービスです。以下のポイントを押さえて安全な AWS 環境を構築しましょう。
- ユーザー・グループ・ロール・ポリシーの役割を理解し、人間には IAM ユーザー、AWS サービスには IAM ロールと用途に応じて使い分ける
- 最小権限の原則に従い、必要な権限のみを付与する
- ルートユーザーは日常的な作業に使わず、MFA を有効化する
- 実運用では IAM Identity Center を使い、認証情報の管理を自動化する