【AWS】 IAMユーザーにインラインポリシーを追加する:権限管理の実践手法

AWS

今回は、AWS IAMユーザーに個別にポリシーを追加する方法について、特にインラインポリシーの実装手順を中心に詳しく解説します。AWSの運用において、適切な権限管理は非常に重要です。必要最小限の権限のみを付与する「最小権限の原則」に基づいた設定を行うことで、セキュリティリスクを最小化できます。

本記事では、マネジメントコンソールとAWS CLIの両方での操作方法、インラインポリシーと管理ポリシーの使い分け、実践的なポリシー例、そしてトラブルシューティングまで包括的にカバーします。

  1. インラインポリシーとは
    1. インラインポリシーの特徴
  2. マネジメントコンソールでの操作手順
    1. 手順1:IAMコンソールへのアクセス
    2. 手順2:対象ユーザーの選択
    3. 手順3:インラインポリシーの追加
    4. 手順4:ポリシーの作成方法を選択
    5. 手順5:ポリシーの確認と保存
  3. AWS CLIでの操作方法
    1. 基本コマンド構文
    2. 実行例
    3. インラインポリシーの確認
    4. インラインポリシーの削除
  4. インラインポリシーと管理ポリシーの違い
    1. 管理ポリシーとは
    2. 比較表
    3. 使い分けの指針
  5. 実践的なポリシーJSON例
    1. 例1:特定のS3バケットへの読み取り専用アクセス
    2. 例2:特定のEC2インスタンスの起動・停止権限
    3. 例3:CloudWatchログの読み取りとメトリクスの参照
  6. よくあるトラブルシューティング
    1. トラブル1:ポリシーのJSON構文エラー
    2. トラブル2:ポリシーを追加しても権限が反映されない
    3. トラブル3:インラインポリシーのサイズ制限エラー
    4. トラブル4:ポリシーの優先順位が不明確
    5. トラブル5:権限の変更が反映されるまでに時間がかかる
  7. セキュリティのベストプラクティス
    1. 1. 最小権限の原則
    2. 2. ワイルドカード(*)の慎重な使用
    3. 3. 条件の活用
    4. 4. 定期的なアクセス権限のレビュー
    5. 5. CloudTrailでのログ監視
  8. その他のポリシー追加方法(簡易説明)
    1. 管理ポリシーのアタッチ
    2. IAMグループ経由での権限付与
    3. IAMロールの引き受け
  9. まとめ

インラインポリシーとは

インラインポリシー(Inline Policy)は、特定のIAMユーザー、グループ、またはロールに直接埋め込まれるポリシーです。そのIAMエンティティに対してのみ有効で、他のユーザーやロールと共有することはできません。

インラインポリシーの特徴

メリット:

  • 特定のユーザーに固有の権限を付与できる
  • ポリシーとユーザーが1対1で紐づくため、権限の所在が明確
  • そのユーザー専用のカスタマイズされた権限設定が可能

デメリット:

  • 複数のユーザーに同じ権限を付与する場合、管理が煩雑になる
  • ポリシーの再利用ができない
  • ユーザーを削除するとポリシーも一緒に削除される

マネジメントコンソールでの操作手順

それでは、AWSマネジメントコンソールを使用してIAMユーザーにインラインポリシーを追加する手順を説明します。

注意: AWSマネジメントコンソールのUIは定期的に更新されるため、以下の手順は将来的に変更される可能性があります。基本的な流れは同じですが、画面の配置やメニュー名が異なる場合があることをご了承ください。

手順1:IAMコンソールへのアクセス

  1. AWSマネジメントコンソールにログインします
  2. 検索バーに「IAM」と入力し、「IAM」サービスを選択します
  3. 左側のナビゲーションペインから「ユーザー」を選択します

手順2:対象ユーザーの選択

  1. ポリシーを追加したいIAMユーザー名をクリックします
  2. ユーザーの詳細画面が表示されます
  3. 「アクセス許可」タブを選択します

手順3:インラインポリシーの追加

  1. 「アクセス許可」タブ内の「インラインポリシー」セクションを探します
  2. 「インラインポリシーの作成」または「ポリシーの追加」ボタンをクリックします
  3. ポリシーエディタが表示されます

手順4:ポリシーの作成方法を選択

ここで2つの選択肢があります:

ビジュアルエディタを使用する場合:

  1. サービスを選択(例:S3、EC2など)
  2. 許可するアクションを選択
  3. リソースを指定(特定のリソースまたはすべて)
  4. 条件を追加(必要に応じて)

JSONエディタを使用する場合:

  1. 「JSON」タブを選択
  2. ポリシードキュメントをJSON形式で記述
  3. 構文エラーがないか確認

手順5:ポリシーの確認と保存

  1. ポリシー名を入力します(わかりやすい名前を推奨)
  2. 説明を追加します(任意ですが推奨)
  3. 「ポリシーの作成」ボタンをクリックします
  4. インラインポリシーがユーザーに追加されたことを確認します

AWS CLIでの操作方法

コマンドラインから操作する場合は、AWS CLIを使用してインラインポリシーを追加できます。自動化やスクリプト化に適しています。

基本コマンド構文

aws iam put-user-policy \
  --user-name ユーザー名 \
  --policy-name ポリシー名 \
  --policy-document file://policy.json

実行例

まず、ポリシードキュメントをJSONファイルとして作成します:

# policy.jsonファイルを作成
cat > policy.json << 'EOF'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::my-bucket/*"
    }
  ]
}
EOF

次に、インラインポリシーを追加します:

aws iam put-user-policy \
  --user-name test-user \
  --policy-name S3ReadOnlyPolicy \
  --policy-document file://policy.json

インラインポリシーの確認

追加されたインラインポリシーを確認するには:

# ユーザーに紐づくインラインポリシーの一覧を表示
aws iam list-user-policies --user-name test-user

# 特定のインラインポリシーの内容を表示
aws iam get-user-policy \
  --user-name test-user \
  --policy-name S3ReadOnlyPolicy

インラインポリシーの削除

不要になったインラインポリシーを削除する場合:

aws iam delete-user-policy \
  --user-name test-user \
  --policy-name S3ReadOnlyPolicy

インラインポリシーと管理ポリシーの違い

IAMには、インラインポリシーの他に「管理ポリシー」という仕組みがあります。それぞれの特徴を理解し、適切に使い分けることが重要です。

管理ポリシーとは

管理ポリシーは、独立したIAMリソースとして存在するポリシーで、複数のユーザー、グループ、ロールにアタッチできます。AWS管理ポリシー(AWSが提供)とカスタマー管理ポリシー(ユーザーが作成)の2種類があります。

比較表

項目 インラインポリシー 管理ポリシー
再利用性 不可(1対1の関係) 可能(複数のエンティティで共有)
管理の容易さ 個別管理が必要 一元管理が可能
バージョン管理 なし あり(最大5バージョン)
削除時の挙動 エンティティと一緒に削除 独立して存在
適用対象数の制限 1つのエンティティのみ 制限なし
サイズ制限 ユーザー単位で2KB、ロール単位で10KB 6KB

使い分けの指針

インラインポリシーを使用すべき場合:

  • 特定のユーザーにのみ必要な固有の権限
  • テスト環境での一時的な権限付与
  • ポリシーとユーザーの関係を厳格に1対1で管理したい場合
  • ユーザー削除時にポリシーも確実に削除したい場合

管理ポリシーを使用すべき場合:

  • 複数のユーザーに同じ権限を付与する場合
  • チーム単位での権限管理
  • 本番環境での標準的な権限セット
  • ポリシーのバージョン管理が必要な場合

一般的には、管理ポリシーを基本とし、例外的なケースでのみインラインポリシーを使用することが推奨されます。

実践的なポリシーJSON例

ここでは、実務でよく使用される3つのサービス(S3、EC2、CloudWatch)のインラインポリシー例を紹介します。

例1:特定のS3バケットへの読み取り専用アクセス

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ListBucket",
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:GetBucketLocation"
      ],
      "Resource": "arn:aws:s3:::my-project-bucket"
    },
    {
      "Sid": "GetObjects",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:GetObjectVersion"
      ],
      "Resource": "arn:aws:s3:::my-project-bucket/*"
    }
  ]
}

ポイント:

  • バケット自体の操作とオブジェクトの操作で権限を分けている
  • バケット名を特定することで、他のバケットへのアクセスは拒否される
  • 読み取りのみで書き込み権限は付与していない

例2:特定のEC2インスタンスの起動・停止権限

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DescribeInstances",
      "Effect": "Allow",
      "Action": [
        "ec2:DescribeInstances",
        "ec2:DescribeInstanceStatus"
      ],
      "Resource": "*"
    },
    {
      "Sid": "StartStopSpecificInstances",
      "Effect": "Allow",
      "Action": [
        "ec2:StartInstances",
        "ec2:StopInstances",
        "ec2:RebootInstances"
      ],
      "Resource": "arn:aws:ec2:ap-northeast-1:123456789012:instance/i-1234567890abcdef0",
      "Condition": {
        "StringEquals": {
          "ec2:ResourceTag/Environment": "Development"
        }
      }
    }
  ]
}

ポイント:

  • DescribeアクションはすべてのリソースでResourceを”*”にする必要がある
  • 特定のインスタンスIDを指定して操作を制限
  • タグベースの条件を追加してさらに制限を強化

例3:CloudWatchログの読み取りとメトリクスの参照

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ViewLogs",
      "Effect": "Allow",
      "Action": [
        "logs:DescribeLogGroups",
        "logs:DescribeLogStreams",
        "logs:GetLogEvents",
        "logs:FilterLogEvents"
      ],
      "Resource": [
        "arn:aws:logs:ap-northeast-1:123456789012:log-group:/aws/lambda/my-function:*",
        "arn:aws:logs:ap-northeast-1:123456789012:log-group:/aws/ec2/my-app:*"
      ]
    },
    {
      "Sid": "ViewMetrics",
      "Effect": "Allow",
      "Action": [
        "cloudwatch:GetMetricData",
        "cloudwatch:GetMetricStatistics",
        "cloudwatch:ListMetrics"
      ],
      "Resource": "*"
    }
  ]
}

ポイント:

  • ログへのアクセスは特定のロググループに限定
  • メトリクスの参照はすべてのリソースで許可(通常の運用監視に必要)
  • ログの書き込み権限は含まれていない

よくあるトラブルシューティング

インラインポリシーを使用する際によく遭遇する問題とその解決方法を紹介します。

トラブル1:ポリシーのJSON構文エラー

症状: ポリシーを保存しようとすると「Invalid policy document」などのエラーが表示される

原因:

  • JSONの構文ミス(カンマの位置、括弧の不一致など)
  • 必須フィールドの欠落(VersionやStatementなど)
  • 不正なARN形式

解決方法:

# AWS CLIでポリシーの構文検証
aws iam simulate-custom-policy \
  --policy-input-list file://policy.json \
  --action-names s3:GetObject \
  --resource-arns arn:aws:s3:::my-bucket/test.txt

または、オンラインのJSONバリデーターを使用して構文をチェックします。

トラブル2:ポリシーを追加しても権限が反映されない

症状: インラインポリシーを追加したのに、該当の操作が「Access Denied」エラーになる

原因:

  • 明示的な拒否(Deny)ポリシーが優先されている
  • リソースARNの指定ミス
  • 必要なアクションが不足している

解決方法:

  1. IAMポリシーシミュレーターを使用して権限を検証
  2. マネジメントコンソールの「アクセスアドバイザー」で実際のアクセス履歴を確認
  3. CloudTrailログで拒否された理由を確認
# AWS CLIでポリシーの評価をシミュレート
aws iam simulate-principal-policy \
  --policy-source-arn arn:aws:iam::123456789012:user/test-user \
  --action-names s3:GetObject \
  --resource-arns arn:aws:s3:::my-bucket/file.txt

トラブル3:インラインポリシーのサイズ制限エラー

症状: 「Policy document exceeds the maximum size」エラーが表示される

原因:

  • ユーザーに付与できるインラインポリシーの合計サイズは2KBまで
  • 複雑なポリシーや多数のリソースARNを含むと制限に達する

解決方法:

  • 管理ポリシーに移行する(管理ポリシーは6KBまで)
  • ポリシーを簡略化(ワイルドカードを活用)
  • 複数の管理ポリシーに分割して運用

トラブル4:ポリシーの優先順位が不明確

症状: 複数のポリシーが適用されている場合、どれが優先されるか分からない

IAMの評価ロジック:

  1. デフォルトですべてのリクエストは暗黙的に拒否
  2. 明示的な許可(Allow)があれば許可される
  3. 明示的な拒否(Deny)があれば、他のすべての許可より優先される
  4. 組織のSCP、アクセス許可の境界なども評価される

解決方法:

  • ポリシーシミュレーターで評価の詳細を確認
  • 不要なポリシーを削除してシンプルに保つ
  • Denyステートメントは慎重に使用する

トラブル5:権限の変更が反映されるまでに時間がかかる

症状: ポリシーを変更したが、すぐに反映されない

原因: IAMの変更は「結果整合性」モデルで、完全に反映されるまで数秒から数分かかる場合がある

解決方法:

  • 通常は数秒で反映されるため、少し待ってから再試行
  • 緊急の場合は、ユーザーに一度ログアウト・ログインしてもらう
  • AWS STSで新しい一時的な認証情報を取得

セキュリティのベストプラクティス

インラインポリシーを使用する際は、以下のセキュリティプラクティスを遵守しましょう。

1. 最小権限の原則

必要最小限の権限のみを付与します。「まず広い権限を与えて後で制限する」のではなく、「必要な権限から始めて必要に応じて追加する」アプローチを取りましょう。

2. ワイルドカード(*)の慎重な使用

// 悪い例
{
  "Effect": "Allow",
  "Action": "*",
  "Resource": "*"
}

// 良い例
{
  "Effect": "Allow",
  "Action": "s3:GetObject",
  "Resource": "arn:aws:s3:::specific-bucket/*"
}

3. 条件の活用

時間帯、IPアドレス、MFAの有無などの条件を追加して、さらにセキュリティを強化できます。

{
  "Effect": "Allow",
  "Action": "ec2:TerminateInstances",
  "Resource": "*",
  "Condition": {
    "Bool": {
      "aws:MultiFactorAuthPresent": "true"
    },
    "IpAddress": {
      "aws:SourceIp": "203.0.113.0/24"
    }
  }
}

4. 定期的なアクセス権限のレビュー

  • IAMアクセスアドバイザーを使用して、実際に使用されている権限を確認
  • 90日以上使用されていない権限は削除を検討
  • AWS Configを使用して、ポリシーの変更を追跡

5. CloudTrailでのログ監視

すべてのIAM操作はCloudTrailに記録されます。不審なアクティビティがないか定期的に確認しましょう。

その他のポリシー追加方法(簡易説明)

インラインポリシー以外にも、IAMユーザーに権限を付与する方法があります。

管理ポリシーのアタッチ

マネジメントコンソール:

  1. IAMユーザーの「アクセス許可」タブを開く
  2. 「許可を追加」→「ポリシーを直接アタッチ」を選択
  3. AWSが提供する管理ポリシーまたはカスタマー管理ポリシーを選択

AWS CLI:

aws iam attach-user-policy \
  --user-name test-user \
  --policy-arn arn:aws:iam::aws:policy/ReadOnlyAccess

IAMグループ経由での権限付与

ユーザーをIAMグループに追加し、グループにポリシーをアタッチする方法です。複数のユーザーに同じ権限を付与する場合に効率的です。

AWS CLI:

# グループにユーザーを追加
aws iam add-user-to-group \
  --group-name Developers \
  --user-name test-user

IAMロールの引き受け

ユーザーが一時的に別の権限セットを引き受ける方法です。特権操作を行う場合などに使用します。

まとめ

今回は、AWS IAMユーザーにインラインポリシーを追加する方法を中心に、権限管理の実践的な手法を解説しました。

重要なポイント:

  • インラインポリシーは特定のユーザーに固有の権限を付与する際に使用
  • 基本的には管理ポリシーを使用し、例外的なケースでインラインポリシーを選択
  • マネジメントコンソールとAWS CLIの両方で操作可能
  • JSONポリシーは慎重に作成し、必ず最小権限の原則に従う
  • トラブルシューティングにはIAMポリシーシミュレーターが有効

AWSの権限管理は、セキュリティの根幹を成す重要な要素です。本記事で紹介した手法を参考に、適切な権限設定を行い、安全なAWS環境を構築してください。実際の運用では、定期的な権限のレビューと監査を行うことで、セキュリティリスクを継続的に低減できます。

権限管理は一度設定したら終わりではなく、継続的な改善が必要なプロセスです。ビジネス要件の変化に応じて柔軟に対応しながら、セキュリティを維持していきましょう。

【注意】

このブログは技術に関する知識や経験を共有することを目的としており、情報の正確性に努めていますが、その内容の正確性や完全性を保証するものではありません。ブログの情報を利用する場合は、自己の責任において行動してください。ブログの内容に基づいて行った行動や決定によって生じた損害や被害について、筆者は一切の責任を負いません。

 

記事の内容の一部は、生成AIで作成しています。

AWSITナレッジ
この記事の作者
StarTeller

30歳で異業種からITエンジニアへ転身し、10年以上にわたりインフラエンジニアとして様々な現場でシステム構築・運用に携わってきました。
得意分野はLinux/Windowsのサーバー構築・運用で、ネットワークやAWSなども実務で活用しています。このブログでは、これまでの業務で培った経験を基に、日々の業務で遭遇した問題の解決方法や、システム構築の具体的な手順を解説。現場のエンジニアが実際に「困ったとき」に参照できる情報を意識して投稿していこうと思っています。
※サーバ運用費がかかっているので、広告を掲載させて頂いてます。

StarTellerをフォローする
シェアする
StarTellerをフォローする

コメント

タイトルとURLをコピーしました