【AWSサービス 基礎編】AWS IAM でユーザー・ロール・ポリシーを作成しアクセス制御する

目次

概要

AWS アカウントを作成すると、すべての AWS サービスにフルアクセスできるルートユーザーが作成されます。しかし、日常的な運用でルートユーザーを使い続けることはセキュリティ上のリスクが高く、誰がどの操作を行ったかの追跡も困難になります。

AWS Identity and Access Management(IAM)は、AWS リソースへのアクセスを安全に管理するためのサービスです。ユーザー、グループ、ロール、ポリシーを使って「誰が」「どのリソースに対して」「どのような操作を」許可・拒否するかを細かく制御できます。

本記事では、IAM の基本概念を理解し、ユーザー・グループ・ロール・ポリシーの作成を通じてアクセス制御の仕組みを体験します。

IAM の全体像(ユーザー / グループ / ロール → ポリシー → AWS リソースへのアクセス制御)を示す図解を挿入
IAM の全体像(ユーザー / グループ / ロール → ポリシー → AWS リソースへのアクセス制御)を示す図解を挿入

この記事のメリット

  • IAM ユーザーとグループを作成し、権限をグループ単位で管理する方法を習得できる
  • IAM ポリシーの構造(Effect、Action、Resource)を理解し、カスタムポリシーを作成できる
  • IAM ロールを作成して EC2 インスタンスなどの AWS サービスに権限を付与する方法を体験できる
  • 最小権限の原則に基づいたアクセス制御の考え方を理解できる
  • マネージドポリシーとインラインポリシーの違いを把握できる

執筆者とキャラクター紹介

執筆者:土肥(とひ)

株式会社ジェニュインの代表であり元エンジニア。これまでオンプレミスと AWS 環境のインフラ業務を担当。AWS 認定資格の学習で得た知識を、ハンズオンとともに解説するのが得意。直近では新人の教育も行っており、これから技術を学ぶ方が納得できる解説を心がけています。基礎編・Cloud Practitioner の記事では、解説役としても登場します。

土肥

クラウドおさる

クラウドおさる

はじめましてでござる。弊猿はクラウドおさる。IT インフラが異常に発達した猿山から、雲に乗って地上の AWS を学びに降りてきたのでござる。

クラウドおさる

基礎編や Cloud Practitioner の記事では、とひさんに素朴な疑問をぶつける役でござるな。Security - Specialty などの記事では、要所でワンポイントや注意点をひとこと添えるでござる。

クラウドおさる

猿山にもデータセンターや監視当番があって、地上で起きることはだいたい猿山にも同じ仕組みがあるのでござる。例え話がつい猿山に寄るのは、弊猿の癖でござる。

技術解説

クラウドおさる

とひさん、IAM ってよく聞くんですけど、どんなサービスなんですか?

土肥

IAM は、AWS リソースへのアクセスを認証(Authentication)と認可(Authorization)で制御するサービスだよ。追加料金なしで使えて、AWS アカウントのセキュリティの基盤になるんだ。

クラウドおさる

認証と認可って、別のものなんですか?

土肥

そうだね。認証は「あなたは誰?」を確認すること、認可は「あなたは何をしていい?」を決めることだよ。IAM はこの両方を担っているんだ。主なユースケースとしてはこんな感じだね。

  • 開発者や運用担当者ごとに適切な権限を持つユーザーを作成する
  • チームごとにグループを作成し、権限を一括管理する
  • EC2 インスタンスやLambda 関数に IAM ロールを割り当て、安全に他の AWS サービスにアクセスさせる
  • 外部システムやサードパーティアプリケーションに一時的なアクセス権を付与する
クラウドおさる

けっこういろいろできるんですね!IAM の中にはどんな要素があるんですか?

土肥

IAM には 4 つの主要コンポーネントがあるよ。

コンポーネント説明
ユーザーAWS にアクセスする個人やアプリケーションを表すエンティティ
グループユーザーの集合。グループにポリシーをアタッチすると所属する全ユーザーに権限が適用される
ロールAWS サービスや外部エンティティが一時的に引き受ける権限のセット
ポリシーアクセス許可を定義する JSON ドキュメント
IAM コンポーネントの関係図(ユーザー → グループ → ポリシー、ロール → ポリシー、ユーザー → ポリシー)
IAM コンポーネントの関係図(ユーザー → グループ → ポリシー、ロール → ポリシー、ユーザー → ポリシー)
クラウドおさる

ポリシーが権限を定義するものなんですね。ポリシーってどういう構造になっているんですか?

土肥

ポリシーは JSON 形式で書くんだけど、主に以下の要素で構成されるよ。

要素説明例
Effect許可(Allow)または拒否(Deny)"Effect": "Allow"
Action許可・拒否する API アクション"Action": "s3:GetObject"
Resource対象の AWS リソース(ARN)"Resource": "arn:aws:s3:::my-bucket/*"
Conditionポリシーが適用される条件(オプション)IP アドレス制限、MFA 要求など
クラウドおさる

なるほど…。具体的にはどんな感じで書くんですか?

土肥

例えば、S3 バケットの読み取り専用アクセスを許可するポリシーはこんな感じだよ。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::example-bucket",
        "arn:aws:s3:::example-bucket/*"
      ]
    }
  ]
}
クラウドおさる

Effect で許可して、Action で操作を指定して、Resource で対象を決めるんですね。わかりやすいです。

土肥

そうそう。それから、ポリシーには 3 つの種類があるんだ。

ポリシー種類説明用途
AWS マネージドポリシーAWS が作成・管理する汎用ポリシーAmazonS3ReadOnlyAccess など標準的な権限の付与
カスタマーマネージドポリシーユーザーが作成・管理するポリシー組織固有の要件に合わせた権限定義
インラインポリシー特定のユーザー・グループ・ロールに直接埋め込むポリシー1 対 1 の関係で権限を定義する場合
クラウドおさる

どの種類を使うのがいいんですか?

土肥

再利用性の観点から、マネージドポリシー(AWS マネージドまたはカスタマーマネージド)の使用が推奨されているよ。インラインポリシーは特定のエンティティに直接埋め込むから、使い回しがしにくいんだ。

クラウドおさる

さっきコンポーネントの表に「ロール」がありましたけど、ユーザーとは何が違うんですか?

土肥

IAM ロールは、ユーザーとは違って特定の個人に紐づかない権限のセットなんだ。ロールには 2 つのポリシーが関連するよ。

ポリシー説明
信頼ポリシー(Trust Policy)誰がそのロールを引き受けられるかを定義する
許可ポリシー(Permissions Policy)ロールに付与する権限を定義する
クラウドおさる

信頼ポリシーと許可ポリシー…2 つもあるんですね。どういうときにロールを使うんですか?

土肥

代表的なユースケースを挙げるとこんな感じだね。

  • EC2 インスタンスプロファイル: EC2 インスタンスに権限を付与し、インスタンス上のアプリケーションが S3 や DynamoDB にアクセスできるようにする
  • クロスアカウントアクセス: 別の AWS アカウントのユーザーやサービスにアクセスを許可する
  • フェデレーションアクセス: 外部 IdP のユーザーに一時的な AWS アクセスを許可する
クラウドおさる

EC2 に権限を持たせたいときはロールを使うんですね!

土肥

そのとおり。最後に、IAM を使う上で一番大事な考え方を紹介するよ。「最小権限の原則」だね。ユーザーやロールに対して、業務に必要な最小限の権限のみを付与するという考え方なんだ。

クラウドおさる

必要以上に権限を与えちゃうと危ないってことですよね…。具体的にはどう気をつければいいんですか?

土肥

こういったポイントを意識するといいよ。

  • まず必要な権限を特定し、それだけを許可する
  • *(ワイルドカード)の使用は避ける
  • 定期的にアクセスアドバイザーで未使用の権限を確認し、不要な権限を削除する
クラウドおさる

なるほど、こまめに見直すのも大事なんですね。

新卒・未経験の方へ
クラウドおさる

AWS を仕事にしたい方へ ── 新卒・未経験から

この記事を書いているのは、AWS の設計・構築を仕事にしている現役エンジニアです。運営元の株式会社ジェニュインでは、新卒・未経験の方を募集しています。プログラミング未経験から入社して活躍しているメンバーもいます。

  • ✓システム開発・WEB エンジニア / インフラ構築などの職種で、未経験から応募できます
  • ✓未経験から入社した社員の声を含む社員アンケートを掲載
  • ✓応募フォームから 1 分で応募できます

実践

前提条件

  • リージョン: ap-northeast-1(東京)(IAM はグローバルサービスですが、リソース作成時のリージョンとして使用)
  • 管理者権限を持つ IAM ユーザーまたはロールでログインしていること

作成するリソース一覧

リソース種別リソース名用途
IAM グループbasic-developers開発者グループ
IAM ユーザーbasic-dev-userハンズオン用の開発者ユーザー
IAM ポリシーBasicS3ReadPolicyS3 読み取り専用カスタムポリシー
IAM ロールBasicEC2S3AccessRoleEC2 インスタンス用の S3 アクセスロール

ステップ1: IAM グループの作成

AWS マネジメントコンソールにログインし、上部の検索バーに IAM と入力し、表示された「IAM」を選択します。

左側ナビゲーションの「アクセス管理」→「IAM ユーザーグループ」を選択し、「グループを作成」をクリックします。

「グループに名前を付ける」セクションで以下を入力します。

  • ユーザーグループ名: basic-developers

「ユーザーをグループに追加 – オプション」は空のままにします(ユーザーは次のステップで作成します)。

「許可ポリシーを添付 – オプション」セクションで、検索ボックスに AmazonEC2ReadOnlyAccess と入力して Enter キーを押し、表示されたポリシーのチェックボックスを選択します。

ページ下部の「ユーザーグループを作成」をクリックします。

グループ作成画面(グループ名と AmazonEC2ReadOnlyAccess ポリシーが選択されている状態)
グループ作成画面(グループ名と AmazonEC2ReadOnlyAccess ポリシーが選択されている状態)

ステップ2: IAM ユーザーの作成

左側ナビゲーションの「アクセス管理」→「IAM ユーザー」を選択し、「ユーザーを作成」をクリックします。

「ユーザーの詳細を指定」画面で以下を入力します。

  • ユーザー名: basic-dev-user
  • 「AWS マネジメントコンソールへのユーザーアクセスを提供する – オプション」にチェック
  • ユーザータイプ: 「IAM ユーザーを作成します」を選択(「Identity Center でユーザーを指定する」が推奨と表示されますが、今回は IAM ユーザーを使います)
  • コンソールパスワード: 「自動生成されたパスワード」を選択(デフォルト)
  • 「ユーザーは次回のサインイン時に新しいパスワードを作成する必要があります – 推奨」にチェック(デフォルトでチェック済み)

「次へ」をクリックします。

ユーザー作成画面(ユーザー名とコンソールアクセスの設定が入力されている状態)
ユーザー作成画面(ユーザー名とコンソールアクセスの設定が入力されている状態)

「許可を設定」画面で以下を設定します。

  • 許可のオプション: 「ユーザーをグループに追加」を選択(デフォルト)
  • 「ユーザーグループ」の検索ボックスに basic と入力して絞り込み、basic-developers のチェックボックスを選択

「次へ」をクリックします。

許可設定画面(basic-developers グループが選択されている状態)
許可設定画面(basic-developers グループが選択されている状態)

「確認して作成」画面で内容を確認します。「許可の概要」にはグループ basic-developers のほか、パスワード変更を許可する IAMUserChangePassword ポリシーが自動で追加されています。「ユーザーの作成」をクリックします。

「パスワードを取得」画面が表示されます。「コンソールサインイン URL」と、「表示」をクリックして表示したコンソールパスワードを控えておきます。この画面を離れるとパスワードは二度と表示できないため、必要なら「.csv ファイルをダウンロード」で保存します。

ユーザー作成完了画面(サインイン URL とパスワードが表示されている状態)
ユーザー作成完了画面(サインイン URL とパスワードが表示されている状態)

ステップ3: カスタムポリシーの作成

左側ナビゲーションの「アクセス管理」→「ポリシー」を選択し、「ポリシーを作成」をクリックします。

「アクセス許可を指定」画面の「ポリシーエディタ」で「JSON」を選択し、エディタの内容を以下の JSON に置き換えます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket",
        "s3:ListAllMyBuckets"
      ],
      "Resource": "*"
    }
  ]
}

「次へ」をクリックします。

ポリシーの JSON エディタ画面(上記の JSON が入力されている状態)
ポリシーの JSON エディタ画面(上記の JSON が入力されている状態)

「確認して作成」画面で以下を入力します。説明には日本語が使えない(英数字と一部の記号のみ)ため、英語で入力します。

  • ポリシー名: BasicS3ReadPolicy
  • 説明 – オプション: S3 bucket and object read-only access for hands-on

「このポリシーで定義されている許可」に S3 のアクセスレベルが 制限あり: リスト, 読み取り と表示されていることを確認し、「ポリシーの作成」をクリックします。

ポリシー一覧に戻り、上部に「ポリシー BasicS3ReadPolicy が作成されました。」と表示されます。検索ボックスに BasicS3ReadPolicy と入力すると、タイプが カスタマーマネージド で作成されたことが確認できます。

ポリシー作成完了画面
ポリシー作成完了画面

ステップ4: カスタムポリシーをユーザーにアタッチ

左側ナビゲーションの「アクセス管理」→「IAM ユーザー」を選択し、basic-dev-user をクリックします。

「許可」タブの「許可ポリシー」セクションで、「許可を追加」→「許可を追加」を選択します。

「許可を追加」画面の「許可のオプション」で「ポリシーを直接アタッチする」を選択します。

「許可ポリシー」の検索ボックスに BasicS3ReadPolicy と入力して Enter キーを押し、表示されたポリシーのチェックボックスを選択します。

「次へ」をクリックし、「確認」画面で「許可を追加」をクリックします。

ユーザーの「許可」タブに戻り、「次を経由してアタッチ」列で AmazonEC2ReadOnlyAccess が グループ basic-developers 経由、BasicS3ReadPolicy が 直接 アタッチされていることを確認します。

ユーザーの許可タブ(AmazonEC2ReadOnlyAccess と BasicS3ReadPolicy がアタッチされている状態)
ユーザーの許可タブ(AmazonEC2ReadOnlyAccess と BasicS3ReadPolicy がアタッチされている状態)

ステップ5: IAM ロールの作成

左側ナビゲーションの「アクセス管理」→「ロール」を選択し、「ロールを作成」をクリックします。

「信頼されたエンティティを選択」画面で以下を設定します。

  • 信頼されたエンティティタイプ: AWS のサービス を選択(デフォルト)
  • ユースケースの「サービスまたはユースケース」: ドロップダウンから EC2 を選択
  • ユースケース: EC2(Allows EC2 instances to call AWS services on your behalf.)を選択

「次へ」をクリックします。

ロール作成画面(AWS のサービス・EC2 が選択されている状態)
ロール作成画面(AWS のサービス・EC2 が選択されている状態)

「許可を追加」画面で、「許可ポリシー」の検索ボックスに AmazonS3ReadOnlyAccess と入力して Enter キーを押し、表示されたポリシーのチェックボックスを選択します。

「次へ」をクリックします。

「名前、確認、および作成」画面で以下を入力します。説明は英数字のみ使えるため英語で入力します。

  • ロール名: BasicEC2S3AccessRole
  • 説明: Read-only access to S3 from EC2 instances (hands-on)

同じ画面の「ステップ 1: 信頼されたエンティティを選択する」に、EC2 を信頼する信頼ポリシーが自動で生成されていることも確認できます。

ロール作成画面(ロール名と説明が入力されている状態)
ロール作成画面(ロール名と説明が入力されている状態)

「ロールを作成」をクリックします。

ステップ6: ロールの信頼ポリシーの確認

ロール作成後、上部に「ロール BasicEC2S3AccessRole が作成されました。」と表示されるので「ロールを表示」をクリックします(左側ナビゲーションの「ロール」から検索して開くこともできます)。

「信頼関係」タブを選択します。

信頼ポリシーに以下の内容が自動的に設定されていることを確認します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

この信頼ポリシーにより、EC2 サービスがこのロールを引き受けることが許可されています。

ロールの信頼関係タブ(信頼ポリシーの JSON が表示されている状態)
ロールの信頼関係タブ(信頼ポリシーの JSON が表示されている状態)

ステップ7: ユーザーの権限テスト

ステップ2 で控えたコンソールサインイン URL にブラウザのシークレットウィンドウでアクセスします。

「IAM user sign in」画面で basic-dev-user のユーザー名と控えたパスワードを入力し、「Sign in」をクリックします。初回は「Password reset」画面が表示されるので、古いパスワードと新しいパスワードを入力して「Confirm Password Change」をクリックします。

ログイン後、上部の検索バーに S3 と入力し、S3 コンソールを開きます。バケットの一覧が表示されることを確認します(BasicS3ReadPolicy の s3:ListAllMyBuckets による読み取り権限)。

試しに「バケットを作成」をクリックし、任意のバケット名を入力してページ下部の「バケットを作成」をクリックします。権限がないため「バケットを作成できませんでした」「バケットを作成するには、s3:CreateBucket アクセス許可が必要です。」というエラーが表示されます。

S3 バケット作成時のアクセス拒否エラー画面
S3 バケット作成時のアクセス拒否エラー画面

これにより、BasicS3ReadPolicy が読み取り専用であることが確認できます。

まとめ

  • AWS IAM は、AWS リソースへのアクセスを認証と認可で制御するサービスであり、追加料金なしで利用できる
  • IAM の主要コンポーネントはユーザー、グループ、ロール、ポリシーの 4 つである
  • ポリシーは JSON 形式で記述し、Effect(許可/拒否)、Action(操作)、Resource(対象リソース)で構成される
  • AWS マネージドポリシー、カスタマーマネージドポリシー、インラインポリシーの 3 種類があり、マネージドポリシーの使用が推奨される
  • IAM ロールは EC2 インスタンスなどの AWS サービスに権限を付与する際に使用し、一時的な認証情報で安全にアクセスを提供する
  • 最小権限の原則に基づき、業務に必要な最小限の権限のみを付与することがベストプラクティスである

参照先

キャリア相談
クラウドおさる

独学の先に、AWS の仕事がある ── ジュニアおさるのキャリア相談

CLF には受かったけれど、次に何をすればいいのか分からない。独学で AWS を学ぶジュニアおさるの相談に、株式会社ジェニュイン代表の土肥が答えています。

  • ✓資格はゴールか、CLF の次に何から手を付けるか
  • ✓EC2 の次に作ってみる構成と、IaC・コスト管理
  • ✓実務経験ゼロでも、面接で話せる「これまで」の作り方
新卒・未経験の方へ
クラウドおさる

AWS を仕事にしたい方へ ── 新卒・未経験から

この記事を書いているのは、AWS の設計・構築を仕事にしている現役エンジニアです。運営元の株式会社ジェニュインでは、新卒・未経験の方を募集しています。プログラミング未経験から入社して活躍しているメンバーもいます。

  • ✓システム開発・WEB エンジニア / インフラ構築などの職種で、未経験から応募できます
  • ✓未経験から入社した社員の声を含む社員アンケートを掲載
  • ✓応募フォームから 1 分で応募できます

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

株式会社ジェニュイン(https://genuine-pt.jp)の代表取締役.

2018年〜インフラエンジニアとしてキャリアをスタートし、オンプレミスのネットワーク・サーバ環境で3年半、クラウド環境で4年半の8年間エンジニアとして従事。
2021年に佐藤氏の創業した株式会社Luxyを引き継ぎ、代表に就任。
その後アガルートグループ内の株式会社ジェニュインと合併。
合併後同社代表に就任。

目次