🧻

【AWS】スイッチロールで適切な権限付与を行う

2023/01/31に公開

はじめに

とある案件で IAM の権限設定周りを見直そうという話になり、スイッチロールについて調べたり検証したりしましたのでそのまとめ記事になります。

AWS では基本 IAM ユーザという 1 ユーザに紐づいたアカウントを発行し、その IAM ユーザに対して、アクセスポリシーを付与してなんのリソースに対してアクセス・アクションを起こせるのかを設定します。

ですが、上記のように 1 ユーザ 1 ポリシーという状況だと、例えば A の作業をしてほしい時は X のアクセスポリシーで、B の作業をしてほしい時は Y のアクセスポリシーでと用途に応じて権限をコントロールしたいとなったときに困ってしまいます。

用途ごとに IAM ユーザを用意する、作業に応じて管理者がポリシーの切り替えを行なうなども考えられますが、IAM が増えるとパスワード管理が煩雑になったりしますし、頻繁に IAM をいじるというのはあまり好ましいことではありません。

そんな時に役立つのがスイッチロールです。

スイッチロールは用途に応じたアクセスポリシーを保持する IAM ロールをあらかじめ複数用意しておき、IAM ユーザが AWS 環境にログインした後に有効期限つきの一時的なロールとして取得しアクセスポリシーを変更させるという方法です。

これなら複数の IAM ユーザの用意や IAM の管理画面を頻繁に変更することなく権限がコントロールできますし、時間ベースで権限が剥奪されるのでアクセスポリシー的にもセキュアです。

また、CloudTrail というサービスでスイッチロールした時にログとして記録されるので、不適切な用途、タイミングでスイッチロールしたことを確認できるので監査的な観点からも有効な手段になります。

今回はこのスイッチロールを GUI で行う方法、CLI で行う方法を確認し、スイッチロールしたことを CloudTrail で確認できるかを検証してみようかと思います。

この記事でわかること

この記事を読む上での前提条件

スイッチロール用の IAM ロールを作成する

AWS マネジメントコンソール画面より IAM の管理画面を開き、ロール タブから ロールを作成 ボタンをクリックします。

作成画面で カスタム信頼ポリシー のラジオボタンをクリックします。
するとポリシー定義が json で生成されます。赤枠の Principal の情報を変更していきます。

Principal は平たく言えばこのポリシーをどこの誰が使えるかを定義する項目になります。

ここも定義が広すぎるのは良くないですが、今回はひとまず * で誰でもこのロールを使えるという風に定義しておきます。

次にこのロールに対してなんのアクセスポリシーを与えるかの設定になります。
今回はひとまず S3 を閲覧するだけの権限を付与します。

任意の ロール名 を入力して作成します。

GUI でスイッチロールを行う

ロールの作成が完了したのでスイッチロールを試してみます。(参考)

前提として、スイッチロール前は何も権限を持っていなく S3 にアクセスしても何も見れない状態であることを確認ください。

また、ロール付与前後で S3 表示結果が変わるように何か適当なファイルをアップロードしておいてください。

画面操作ベース

マネジメントコンソールの画面上を操作しながらスイッチロールする方法を確認します。

右上の ログインしているIAMユーザ名@アカウントID の構成で表示されているとこをクリックし、表示されたアコーディオンの中から ロールの切り替え をクリックします。

遷移した画面先で ロールの切り替え ボタンをクリックします。

以下の行い ロールの切り替え ボタンをクリックします。

  • アカウント
    • ログインしている AWS のアカウント ID を入力
    • 元々のマネジメントコンソール画面の右上に表示されていた ログインしているIAMユーザ名@アカウントIDアカウントID にあたる部分です。
  • ロール
    • 「スイッチロール用の IAM ロールを作成する」でロールを作成した際に設定した ロール名 を指定します。
  • 表示名
    • スイッチロールした後に適用されるユーザ名を任意で設定します。
    • 表示名 のラベルの色を指定します。

マネジメントコンソールの画面に戻ります。
右上に先ほど設定した 表示名 に対して、 のラベルがついてることが確認でき、S3 のバケット一覧が確認できます。

URL で直接アクセス

画面フローを介さずにログイン後に直接スイッチロール用の URL にアクセスすることでロールを取得できます。

以下、URL の生成例です。

https://signin.aws.amazon.com/switchrole?account={account_id_number}&roleName={role_name}&displayName={text_to_display}

{} 内の値は適宜以下に修正ください。

  • {account_id_number}
    • 画面操作ベースで行った ロール の設定値と同義です。
  • {role_name}
    • 画面操作ベースで行った アカウント の設定値と同義です。
  • {text_to_display}
    • 画面操作ベースで行った 表示名 の設定値と同義です。

スイッチバック

スイッチロールした後に、有効期限が切れる前にロールの権限を剥奪したい時にスイッチバックをできます。
右上のユーザをクリックし、スイッチバック をクリックします。

有効期限の変更

スイッチロールはデフォルト 1 時間ですが、ロールの管理画面から 編集 ボタンをクリックし、最大セッション時間 を変更することで時間を延長することもできます。

長すぎるのもセキュリティ的に良くないので 1-2 時間の範囲で設定するのがおすすめです。

CLI でスイッチロールを行う

aws cli のインストールがまだの方はこちらの記事を参考にインストールして、GUI で使用した何も権限を持ってない IAM ユーザのアクセスキー情報からコマンドが実行できる状態にしてください。

完了したら以下を実行し、最初は S3 へのアクセスが拒否されることを確認します。

aws s3 ls --profile {profile_name}
An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied

スイッチロールの権限を以下のコマンドで発行します。

aws sts assume-role \
--role-arn "arn:aws:iam::{AWS_AccountId}:role/{roleName}" \
--role-session-name "{switchRoleName}" \
--duration-seconds {3600} \
--profile {profile_name}

# 実行結果
{
    "Credentials": {
        "AccessKeyId": "xxxxxxxxxx",
        "SecretAccessKey": "yyyyyyyyyy",
        "SessionToken": "zzzzzzzzzz",
        "Expiration": "2023-01-26T09:17:38+00:00"
    },
    "AssumedRoleUser": {
        "AssumedRoleId": "**********:{switchRoleName}",
        "Arn": "arn:aws:sts::{AWS_AccountId}:assumed-role/{roleName}/{profile_name}"
    }
}

コマンドの{} で囲まれた値は適宜以下に修正ください。

  • AWS_AccountId

    • ログインしている AWS 環境の ID。マネジメントコンソール画面の右上から確認できます
  • roleName

    • 「スイッチロール用の IAM ロールを作成する」で作成したロールの名前
  • 3600

    • スイッチロールの有効期限を指定します。
    • ※ロールに設定してる最大セッション時間より多い時間を設定するとエラーになる
      エラー内容
  • profile_name

    • 参考記事 から発行した credentials のプロフィール名

実行結果から AccessKeyId / SecretAccessKey / SessionToken が発行されましたことを確認できます。

それぞの値を .aws/credentials 記載の対象プロフィールへ以下のマッピングで反映します。

[profile_name]
aws_access_key_id=AccessKeyId
aws_secret_access_key=SecretAccessKey
aws_session_token=SessionToken

この状態で改めて S3 に aws cli でアクセスするとバケットの一覧が表示されることが確認できます。

aws s3 ls --profile {profile_name}

# 出力結果
2020-03-19 10:56:43 bucketName

cloudTrail でスイッチロール取得ログを確認する。

スイッチロールのログを確認してみます。

マネジメントコンソール画面から CloudTrails を検索し、 イベント履歴 タブを選択します。
リージョンを バージニア北部(us-east-1)に設定し、ルックアップ属性イベント名SwitchRole で検索

ログを確認できますね。スイッチロールのリダイレクト先はデフォルト バージニア北部 になるようなのでリージョン先の変更を忘れないようにしましょう。
検証時に 東京 リージョンで検索しても一向にスイッチロールのログが入ってこなくて頭を悩ませました。

ログの中身も確認してみます。検索結果のログの中から適当に一つ選択すると以下のイベントを確認できます。

何のロール を取得したかが、この中で確認できますので不適切なロール取得を知りたい時はここを参照すればわかります。

さいごに

さいごまで読んでいただきありがとうございます。

以下今回のまとめです。

  • 用途に応じて権限をコントロールしたいときにスイッチロールを使用する
  • スイッチロール用に各ロールを作成する必要がある
  • ユーザはログイン後に発行されたロールを GUI / CLI から取得できる
  • スイッチロールのログは CloudTrails にて確認ができる

間違いの指摘やリクエストなどありましたら加筆していきたので是非、ご意見をいただけたらと思います。

それではまた次の記事でお会いしましょう。

GitHubで編集を提案

Discussion