何か作業を行う際に、作業用のIAMロールへ スイッチロール(AssumeRole)するケースは多いと思います。 そのときの権限は基本的には 「そのロールにアタッチされたポリシー」です。
ですが、その権限を AssumeRole 時に狭められることを最近(今更)知りました。 「セッションポリシー」というものを使って スイッチロール先での権限を狭められるとのこと。
今回はこのセッションポリシーを適用して スイッチロール(AssumeRole)を試してみました。
まずは普通にAssumeRole
まずは aws sts assume-role
コマンドを使った いつもどおりのスイッチロールを紹介します。
以下シンプルなコマンドサンプルです。
### スイッチ先のロールARN
role_arn="arn:aws:iam::123456789012:role/example-dev-role"
### AssumeRole
resp=$(aws sts assume-role --output json \
--role-arn "${role_arn}" \
--role-session-name "develop")
### 環境変数に認証情報を登録
export AWS_ACCESS_KEY_ID=$(echo "$resp" | jq -r ".Credentials.AccessKeyId")
export AWS_SECRET_ACCESS_KEY=$(echo "$resp" | jq -r ".Credentials.SecretAccessKey")
export AWS_SESSION_TOKEN=$(echo "$resp" | jq -r ".Credentials.SessionToken")
### 確認
aws sts get-caller-identity --output yaml
# Account: '123456789012'
# Arn: arn:aws:sts::123456789012:assumed-role/example-dev-role/develop
# UserId: AROAEXAMPLE:develop
ちなみにMFAが必要な場合、 aws sts assume-role
部分は 以下のようなコマンドになります。 --token-code
にMFAデバイスに表示されている数字を入れます。
serial_number="arn:aws:iam::111111111111:mfa/example-user"
token_code="123456"
aws sts assume-role --output json \
--role-arn "${role_arn}" \
--role-session-name "develop" \
--serial-number "${serial_number}" \
--token-code "${token_code}"
権限を狭めてAssumeRole
権限を狭めるには セッションポリシー を使います。 これは AssumeRoleの際にパラメータとして設定できます。
セッションポリシーは リソースベースのポリシーと アイデンティティベースのポリシーを制限する役割を持っています。 以下ベン図が分かりやすいです。
管理ポリシーを使って権限を狭める
例として、 ReadOnlyAccess の範囲内に狭めたい場合のコマンドを記載します。 policy-arns
パラメータに管理ポリシーのARNリストを記載してあげます。
### スイッチ先のロールARN
role_arn="arn:aws:iam::123456789012:role/example-dev-role"
### AssumeRole
resp=$(aws sts assume-role --output json \
--role-arn "${role_arn}" \
--role-session-name "readonly" \
--policy-arns arn="arn:aws:iam::aws:policy/ReadOnlyAccess")
### 環境変数に認証情報を登録
export AWS_ACCESS_KEY_ID=$(echo "$resp" | jq -r ".Credentials.AccessKeyId")
export AWS_SECRET_ACCESS_KEY=$(echo "$resp" | jq -r ".Credentials.SecretAccessKey")
export AWS_SESSION_TOKEN=$(echo "$resp" | jq -r ".Credentials.SessionToken")
これにより、仮にIAMロール先が AdministratorAccess 権限を持っていたとしても、 変更アクションは取れなくなります。
aws sns create-topic --name example-topic
# An error occurred (AuthorizationError) when calling the CreateTopic operation:
# User: arn:aws:sts::123456789012:assumed-role/example-dev-role/readonly is not authorized to perform:
# SNS:CreateTopic on resource: arn:aws:sns:ap-northeast-1:123456789012:example-topic
# because no session policy allows the SNS:CreateTopic action
「セッションポリシーで sns:CreateTopic
アクションが許可されていない」と メッセージにも出てきます。
インラインポリシーも使える
policy
パラメータにインラインポリシーを指定できます。 以下コマンド例です。
### スイッチ先のロールARN
role_arn="arn:aws:iam::123456789012:role/example-dev-role"
inline_policy=$(cat <<EOS
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ec2:DescribeRegions",
"Resource": "*"
}
]
}
EOS
)
### AssumeRole
resp=$(aws sts assume-role --output json \
--role-arn "${role_arn}" \
--role-session-name "list-region" \
--policy "${inline_policy}")
### 環境変数に認証情報を登録
export AWS_ACCESS_KEY_ID=$(echo "$resp" | jq -r ".Credentials.AccessKeyId")
export AWS_SECRET_ACCESS_KEY=$(echo "$resp" | jq -r ".Credentials.SecretAccessKey")
export AWS_SESSION_TOKEN=$(echo "$resp" | jq -r ".Credentials.SessionToken")
上記の例は極端ですが、 ec2:DescribeRegions
しかできない AssumeRole となります。
aws ec2 describe-regions
# Regions:
# - Endpoint: ec2.ap-south-1.amazonaws.com
# OptInStatus: opt-in-not-required
# RegionName: ap-south-1
# - Endpoint: ec2.eu-north-1.amazonaws.com
# OptInStatus: opt-in-not-required
# RegionName: eu-north-1
# - Endpoint: ec2.eu-west-3.amazonaws.com
# ...(略)...
aws ec2 describe-vpcs
# An error occurred (UnauthorizedOperation) when calling the DescribeVpcs operation:
# You are not authorized to perform this operation.
# User: arn:aws:sts::123456789012:assumed-role/example-dev-role/list-region is not authorized to perform: ec2:DescribeVpcs
# because no session policy allows the ec2:DescribeVpcs action
おわりに
以上、セッションポリシーを使って スイッチロール先での作業権限を狭めてみました。
基本的には最小権限を意識して 「アイデンティティベースのポリシー」や「リソースベースのポリシー」 を設計するのは変わらないです。 利用者側でよりセキュアにAWS利用する際のTipsとして 抑えておくと良いでしょう。