本文へスキップ
BecomeCoder

AWS SAA(ソリューションアーキテクト)コース · 第2章 IAMと認証・認可の設計 · レッスン8

IAMロールとAssumeRole・STS

導入

「EC2インスタンスにアクセスキーを設定してS3にアクセスする」——これはよくある初心者の実装ですが、SAAでは不正解です。正解は「ロールを付与する」ことです。なぜロールが安全なのかを理解しましょう。

説明

IAMロール は、ユーザーではなく「誰か・何かが一時的に引き受ける権限のセット」です。ロール自体はパスワードやアクセスキーを持たず、STS(Security Token Service) が発行する 一時的な認証情報(有効期限付きのアクセスキー・シークレットキー・セッショントークン)を使って権限を行使します。

ロールを引き受ける操作を AssumeRole と呼びます。

sequenceDiagram
    participant E as "EC2インスタンス"
    participant S as "STS"
    participant B as "S3バケット"
    E->>S: "AssumeRole(ロールを引き受ける)"
    S-->>E: "一時的な認証情報(有効期限あり)"
    E->>B: "一時的な認証情報でアクセス"

代表的な使い方が インスタンスプロファイル です。EC2インスタンスにIAMロールを直接アタッチすると、インスタンス内のアプリはアクセスキーを一切持たずに、自動的に一時認証情報を取得してAWSサービスを呼び出せます。

方式アクセスキーの管理有効期限SAAでの評価
アクセスキーを埋め込む手動(漏洩リスク・ローテーション必要)恒久(自分で失効させない限り有効)原則不正解
ロール(インスタンスプロファイル)不要(AWSが自動管理)一時的(自動更新)推奨される正解パターン

同じ理由で、Lambda関数には 実行ロール、ECSタスクには タスクロール を付与し、いずれもアクセスキーを持たせません。

具体例

なぜロールが安全なのかを、実際に起きうる事故で考えます。

ある会社が、EC2上のアプリからS3へアクセスするために、アクセスキーをアプリの設定ファイルに書き込んでいました。ある日、その設定ファイルが誤って公開GitHubにコミットされ、キーが外部に流出。攻撃者はその恒久的な鍵で、深夜に大量のリソースを不正起動しました。鍵は自分で失効させない限りずっと有効だったため、被害が広がりました。

ロール(インスタンスプロファイル)に置き換えると、この事故は起きません。

  • EC2にロールを付けると、アプリはアクセスキーを一切持たず、必要な時にSTSから有効期限つきの一時認証情報を自動取得してS3を呼ぶ
  • 一時認証情報は自動で更新・失効するので、GitHubに漏らす“恒久的な鍵”がそもそも存在しない
  • 権限を変えたいときも、コードを触らずロールのポリシーを直すだけ

だからSAAでは「EC2/Lambda/ECSがAWSサービスにアクセスする」と来たら、反射的にロールを付与。選択肢にある「アクセスキーを埋め込む」は引っ掛けだと考えて構いません。

読んでみよう

「EC2/Lambda/ECSがAWSサービスにアクセスする必要がある」という問題文が出たら、反射的に「ロールを付与する」を選んでください。アクセスキーの直接管理が選択肢にあっても、それは不正解を誘う”引っ掛け”だと考えて構いません。

次のレッスンへ →