[AWS][IAM]あやふやだった請求情報へのアクセス権とスイッチロールの設定をまとめた
うろ覚えで気になってた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実行環境が必要です。
[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利用料に関する設定完了
- IAMグループ
- スイッチロール(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)に関する設定完了
- IAMユーザー
- AWS CLIでスイッチロールがつかえるように設定
- aws cli実行環境のプロファイルを編集(*3)
- ※この時点でスイッチロール(CLI)に関する設定完了
<動作確認>
- 動作確認:AWS請求情報の閲覧許可の確認
- IAMユーザー
iamA001
でサインインする- AWS利用料を閲覧できる
- IAMユーザー
iamB001
でサインインする- AWS利用料が閲覧できない
- IAMユーザー
- 動作確認:スイッチロール(GUI)の確認
- IAMユーザー
iamA001
でサインインする- スイッチロール設定できない
- IAMユーザー
iamB001
でサインインする- スイッチロールできる
- スイッチした権限の範囲でAWSコンソールを操作できる
- IAMユーザー
- 動作確認:スイッチロール(CLI)の確認
- IAMユーザー
iamB001
でAWS CLIが実行できる環境で確認- aws cliコマンドに
--profile
オプションを指定できる -
--profile
オプションに対応した権限で情報が表示/非表示される
- aws cliコマンドに
- IAMユーザー
※ (*X) は参考情報とのリンク
※ スイッチロールはGUI,CLIと文字列を付与し以下の区別をしました。
-
スイッチロール(GUI)
: AWSコンソールのスイッチロール -
スイッチロール(CLI)
: AWS CLIのスイッチロール
手順の参考情報
手順概要で記載した手順で参考になる情報のリンクです。
(*1) IAMユーザーがAWS請求情報とコスト管理へアクセス
(*2) 認証情報の有効期限を1→2時間に変更する
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情報みれない(期待通りの挙動)
- aws ec2 describe-instances
とりあえず気になってるところは頭の整理ができた気がする。クロスアカウントのスイッチロールもやってみたいなぁ。
Discussion