💭

[AWS][IAM]あやふやだった請求情報へのアクセス権とスイッチロールの設定をまとめた

2022/09/18に公開

うろ覚えで気になってたIAMまわりのことを整理したメモです

IAMに関する適当に理解してた以下2つを整理して理解を深めるためのメモです。

  • IAMユーザーでAWS利用料を確認
  • スイッチロール

IAMまだまだ理解がたりないのでここに書いてることは鵜呑みにしないでください。

やること(機能要件的なこと)

  • 一部のIAMユーザーがAWS利用料を確認できるようにする
    • そのユーザーはAWS利用料の確認以外は何もできない
  • 一部のIAMユーザーが権限をスイッチロールで切替えできるようにする
    • そのユーザーはAWS利用料が確認できない
  • 権限はIAMグループ単位で付与する
    • IAMユーザーに直接権限を付与しない
    • ※IAMユーザーにIAMポリシーを付与しない
  • AWS CLI でも権限をスイッチさせる
  • 認証情報の有効期限を2時間にする(デフォルト1時間)
    • ※スイッチロールのセッションが2時間で切れる

環境

AWSアカウントは1つだけ。2つ用意できなかったのでクロスアカウントのスイッチロールはできませんでした。

作成/設定したもの

作った/設定したAWSリソースまとめ

IAMグループ

グループ名 許可ポリシー 機能要件
grpA AWSBillingReadOnlyAccess 請求情報に対してのみ閲覧できる
grpB grpB-policy 請求情報に対しアクセス権なし。スイッチロール可

IAMユーザー

IAMユーザー (所属)グループ
iamA001 grpA
iamB001 grpB

IAMロール

IAMロール 許可ポリシー
op-01-swrole AmazonEC2ReadOnlyAccess
op-02-swrole AmazonS3ReadOnlyAccess

※スイッチしたときにアカウントに付与される権限です。

IAMポリシー

IAMポリシーgrpB-policy

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": [
                "arn:aws:iam::{{AWSアカウントID}}:role/op-01-swrole",
                "arn:aws:iam::{{AWSアカウントID}}:role/op-02-swrole"
            ]
        }
    ]
}

~/.aws/credentialsファイル

AWS CLIでスイッチロールが使用できるよう設定。この設定をするには事前にIAMユーザーiamB001のAWS CLI実行環境が必要です。

credentials
[profile default]
region = ap-northeast-1
output = json

[profile op01]
role_arn = arn:aws:iam::{{AWSアカウントID}}:role/op-01-swrole
source_profile = default
region = ap-northeast-1

[profile op02]
role_arn = arn:aws:iam::{{AWSアカウントID}}:role/op-02-swrole
source_profile = default
region = ap-northeast-1

手順概要

詳細な手順は世の中に数多あるブログや公開情報にお任せ。ここでは概要のみ記載します。

<構築手順>

  • rootユーザーでサインインする
    • IAMユーザーがAWS請求情報とコスト管理へアクセスできるようにする(*1)
  • IAMグループgrpA,grpBを作る(権限/ポリシー未設定)
  • IAMユーザーiamA001を作成し、IAMグループgrpAに所属させる(権限/ポリシー未設定)
  • IAMユーザーiamB001を作成し、IAMグループgrpBに所属させる(権限/ポリシー未設定)
  • AWS請求情報の閲覧許可の設定
    • IAMグループgrpAの許可ポリシーにAWSBillingReadOnlyAccessを設定する
    • ※この時点でAWS利用料に関する設定完了
  • スイッチロール(GUI/CLI)の作成
    • スイッチロールop-01-swrole,op-02-swroleを作る
    • IAMグループgrpBがスイッチロールop-01-swrole,op-02-swroleにスイッチできるようになるIAMポリシーgrpB-policyを作る
    • IAMポリシーgrpB-policyをIAMグループgrpBの許可ポリシーに設定する
    • 認証情報の有効期限を1→2時間に変更する(*2)
  • IAMユーザーiamB001によるスイッチロールの設定
    • IAMユーザーiamB001でサインインする
    • AWSコンソール右上からロールの切り替えをクリック
    • 以下を入力しロールの切り替えをクリック
      • アカウント {{AWSアカウントID}}
      • ロール op-01-swrole
      • 表示名 op01
    • スイッチロールが登録できれば成功
    • 同様にop-02-swroleもスイッチロール登録する
    • ※この時点でスイッチロール(GUI)に関する設定完了
  • AWS CLIでスイッチロールがつかえるように設定
    • aws cli実行環境のプロファイルを編集(*3)
    • ※この時点でスイッチロール(CLI)に関する設定完了

<動作確認>

  • 動作確認:AWS請求情報の閲覧許可の確認
    • IAMユーザーiamA001でサインインする
      • AWS利用料を閲覧できる
    • IAMユーザーiamB001でサインインする
      • AWS利用料が閲覧できない
  • 動作確認:スイッチロール(GUI)の確認
    • IAMユーザーiamA001でサインインする
      • スイッチロール設定できない
    • IAMユーザーiamB001でサインインする
      • スイッチロールできる
      • スイッチした権限の範囲でAWSコンソールを操作できる
  • 動作確認:スイッチロール(CLI)の確認
    • IAMユーザーiamB001でAWS CLIが実行できる環境で確認
      • aws cliコマンドに--profileオプションを指定できる
      • --profileオプションに対応した権限で情報が表示/非表示される

※ (*X) は参考情報とのリンク
※ スイッチロールはGUI,CLIと文字列を付与し以下の区別をしました。

  • スイッチロール(GUI) : AWSコンソールのスイッチロール
  • スイッチロール(CLI) : AWS CLIのスイッチロール

手順の参考情報

手順概要で記載した手順で参考になる情報のリンクです。

(*1) IAMユーザーがAWS請求情報とコスト管理へアクセス

https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/control-access-billing.html#grantaccess

(*2) 認証情報の有効期限を1→2時間に変更する

https://dev.classmethod.jp/articles/extending-the-expiration-of-the-temporary-credential-acquired-by-assumerole/

CloudShellで有効時間を確認してみると以下の通り1時間(3600秒)でした。

$ role_name="op-01-swrole"
$ aws iam get-role \
>   --role-name ${role_name} \
>   --query Role.MaxSessionDuration
3600

有効期限を2時間(7200秒)に変更しました。

$ aws iam update-role \
>   --role-name ${role_name} \
>   --max-session-duration $((60*60*2))
$ aws iam get-role \
>   --role-name ${role_name} \
>   --query Role.MaxSessionDuration
7200
$ role_name="op-02-swrole"
$ aws iam get-role \
>   --role-name ${role_name} \
>   --query Role.MaxSessionDuration
3600

上記の時点ではそれぞれの有効期限はこうなっています。

スイッチロール 有効期限
op-01-swrole 2時間(7200秒)
op-02-swrole 1時間(3600秒)

(*3) aws cli実行環境のプロファイルを編集

IAMユーザーiamB001のAWS CLI実行環境を用意し~/.aws/credentialsを以下のように修正しスイッチロールできるようにします。

編集前の~/.aws/credentialsファイル

編集前
[profile default]
region = ap-northeast-1
output = json

編集後の~/.aws/credentialsファイル

編集後
[profile default]
region = ap-northeast-1
output = json

[profile op01]
role_arn = arn:aws:iam::{{AWSアカウントID}}:role/op-01-swrole
source_profile = default
region = ap-northeast-1

[profile op02]
role_arn = arn:aws:iam::{{AWSアカウントID}}:role/op-02-swrole
source_profile = default
region = ap-northeast-1

AWS CLIを実行し挙動を確認してみる。

スイッチロールせずにコマンド実行
 → 結果:権限がなく Access Denied となった(期待通りの挙動)

スイッチロールせずにコマンド実行
PS C:\> aws s3 ls

An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied

スイッチロールop-01-swroleでコマンド実行
 → 結果:権限がなく Access Denied となった(期待通りの挙動)

スイッチロールせずにコマンド実行
PS C:\> aws s3 ls --profile op01

An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied

スイッチロールop-02-swroleでコマンド実行
 → 結果:s3バケットの一覧が表示された(期待通りの挙動)

スイッチロールせずにコマンド実行
PS C:\> aws s3 ls --profile op02
2022-08-12 02:59:25 hogehoge-s3
2022-08-13 02:59:25 fugafuga-s3
  • aws ec2 describe-instances の実行結果
    • aws ec2 describe-instances
      • 権限がなくEC2情報みれない(期待通りの挙動)
    • aws ec2 describe-instances --profile op01
      • EC2情報が表示された(期待通りの挙動)
    • aws ec2 describe-instances --profile op02
      • 権限がなくEC2情報みれない(期待通りの挙動)

とりあえず気になってるところは頭の整理ができた気がする。クロスアカウントのスイッチロールもやってみたいなぁ。

Discussion