以下アップデートを紹介します。
- Announcing AWS IAM Identity Center APIs for visibility into workforce access to AWS | AWS What's New
IAM Identity Center (以降 SSO)に アクセス割当状況の把握を楽にする 新しいAPIが追加されました。 以下2つです。
- ListAccountAssignmentsForPrincipal ( AWS CLI Command Reference )
- ListApplicationAssignmentsForPrincipal ( AWS CLI Command Reference )
何が嬉しいか
「このユーザー/グループ、どのアカウント(アプリケーション)にどの権限で入れたっけ…?」 を調べるのが めっちゃ楽になります。
これまで
背景を簡単に説明します。
まず、SSOマネジメントコンソール上で調べるのはかなり大変です。 ユーザー/グループ単位ではもちろん見れません。 AWSアカウント単位でのみ確認できます。 各AWSアカウントのこのページを巡って、棚卸しを行う必要があります。
では、AWS CLIやSDKを活用する手段はどうだったのかというと、 これも大変でした。
具体的には list-account-assignments を使います。 これで調べられるのですが、 パラメータに「AWSアカウントID」と「許可セットARN」が必須です。
つまり、「特定ユーザー/グループの持っているアクセス」を "網羅的に" 調べるには、 全アカウント ✕ 全許可セット
の組み合わせで list-account-assignments を(わざわざ)叩く必要がありました。 ある程度の規模だと、これだけで かなり時間がかかります。
これから
ListAccountAssignmentsForPrincipal および ListApplicationAssignmentsForPrincipal が追加されたことで、 これまでの大変な作業が不要になります。
特定ユーザー/グループ単位で割当一覧を出力できるので、 素早く・効率的に棚卸しができるようになりました。
試してみる
AWS CLIを使って、今回のAPIを体験します。
[事前準備] AWS CLIのアップデート
AWS CLIのバージョン2.13.37 から本アップデートのAPIを利用できます。 ローカルのAWS CLIを以下のとおりアップデートしました。
aws --version
# aws-cli/2.13.37 Python/3.11.6 Darwin/22.6.0 source/arm64 prompt/off
ListAccountAssignmentsForPrincipal を試す
sso-admin list-account-assignments-for-principal
を使います。
aws sso-admin list-account-assignments-for-principal help | head
# LIST-ACCOUNT-ASS...TS-FOR-PRINCIPAL() LIST-ACCOUNT-ASS...TS-FOR-PRINCIPAL()
#
# NAME
# list-account-assignments-for-principal -
#
# DESCRIPTION
# Retrieves a list of the IAM Identity Center associated Amazon Web Ser-
# vices accounts that the principal has access to.
#
# See also: AWS API Documentation
まず、特定ユーザーの割当一覧を取得してみます。
principal_id="97743a68-1111-2222-3333-example"
instance_arn=$(aws sso-admin list-instances --query "Instances[0].InstanceArn" --output text --no-paginate)
aws sso-admin list-account-assignments-for-principal \
--instance-arn "$instance_arn" \
--principal-id "$principal_id" \
--principal-type USER \
--output yaml
# AccountAssignments:
# - AccountId: '111111111111'
# PermissionSetArn: arn:aws:sso:::permissionSet/ssoins-7758example/ps-5f4example
# PrincipalId: 57543a58-7777-7777-bbbb-example
# PrincipalType: GROUP
# - AccountId: '222222222222'
# PermissionSetArn: arn:aws:sso:::permissionSet/ssoins-7758example/ps-af2example
# PrincipalId: 97743a68-1111-2222-3333-example
# PrincipalType: USER
# - AccountId: '222222222222'
# PermissionSetArn: arn:aws:sso:::permissionSet/ssoins-7758example/ps-2a6example
# PrincipalId: e794fa28-2222-7777-eeee-example
# PrincipalType: GROUP
※プリンシパルIDはSSOユーザーの画面もしくは get-user-idコマンドから取得できます。
アカウントID, 許可セットARN, プリンシパルID, プリンシパルタイプ(USERもしくは GROUP )のリストを取得できます。 「ユーザーが所属しているグループ」へ割り当てられているアクセスも取得できる、ということですね。
また、 --filter
オプションがあります。これを使って探したい割当の "AWSアカウント" を絞れます。
principal_id="97743a68-1111-2222-3333-example"
instance_arn=$(aws sso-admin list-instances --query "Instances[0].InstanceArn" --output text --no-paginate)
aws sso-admin list-account-assignments-for-principal \
--filter AccountId=222222222222 \
--instance-arn "$instance_arn" \
--principal-id "$principal_id" \
--principal-type USER \
--output yaml
# AccountAssignments:
# - AccountId: '222222222222'
# PermissionSetArn: arn:aws:sso:::permissionSet/ssoins-7758example/ps-af2example
# PrincipalId: 97743a68-1111-2222-3333-example
# PrincipalType: USER
# - AccountId: '222222222222'
# PermissionSetArn: arn:aws:sso:::permissionSet/ssoins-7758example/ps-2a6example
# PrincipalId: e794fa28-2222-7777-eeee-example
# PrincipalType: GROUP
グループへの割当を探したい場合は、プリンシパルタイプを GROUP にします。
principal_id="e794fa28-2222-7777-eeee-example"
instance_arn=$(aws sso-admin list-instances --query "Instances[0].InstanceArn" --output text --no-paginate)
aws sso-admin list-account-assignments-for-principal \
--instance-arn "$instance_arn" \
--principal-id "$principal_id" \
--principal-type GROUP \
--output yaml
# AccountAssignments:
# - AccountId: '111111111111'
# PermissionSetArn: arn:aws:sso:::permissionSet/ssoins-7758example/ps-5f4example
# PrincipalId: 57543a58-7777-7777-bbbb-example
# PrincipalType: GROUP
# - AccountId: '222222222222'
# PermissionSetArn: arn:aws:sso:::permissionSet/ssoins-7758example/ps-2a6example
# PrincipalId: e794fa28-2222-7777-eeee-example
# PrincipalType: GROUP
ListApplicationAssignmentsForPrincipal を試す
次はアプリケーションへの割当一覧を取得してみます。 sso-admin list-application-assignments-for-principal
を使います。 こちらにもフィルター( --filter
)オプションがあり、 "アプリケーションARN" で絞れます。
特定グループに割り当てられているアプリケーションを取得してみました。
principal_id="0b72ae0n-6666-7777-1111-example"
instance_arn=$(aws sso-admin list-instances --query "Instances[0].InstanceArn" --output text --no-paginate)
aws sso-admin list-application-assignments-for-principal \
--instance-arn "$instance_arn" \
--principal-id "$principal_id" \
--principal-type GROUP
# ApplicationAssignments:
# - ApplicationArn: arn:aws:sso::111111111111:application/ssoins-9a3jexample/apl-0000000000000000000
# PrincipalId: 0b72ae0n-6666-7777-1111-example
# PrincipalType: GROUP
アプリケーションの情報は sso-admin describe-application
から取得できます。
aws sso-admin describe-application \
--application-arn arn:aws:sso::111111111111:application/ssoins-9a3jexample/apl-0000000000000000000 \
--output yaml
# ApplicationArn: arn:aws:sso::111111111111:application/ssoins-9a3jexample/apl-0000000000000000000
# ApplicationProviderArn: arn:aws:sso::aws:applicationProvider/catalog/ExampleApp
# CreatedDate: '2022-06-22T11:00:25.315000+09:00'
# Description: Amazon Connect Application
# InstanceArn: arn:aws:sso:::instance/ssoins-9a3jexample
# Name: ExampleApp
# PortalOptions:
# SignInOptions:
# Origin: IDENTITY_CENTER
# Visibility: ENABLED
# Status: ENABLED
グループ名からAWSアカウント割当をCSV出力するスクリプト
グループ名をインプットに、 割当(AWSアカウント名, 許可セット名)一覧をCSV出力するスクリプトを書いてみました。
group_name="AWSControlTowerAdmins"
# グループIDの取得
store_id=$(aws sso-admin list-instances --query "Instances[0].IdentityStoreId" --output text --no-paginate)
group_id=$(aws identitystore get-group-id \
--identity-store-id "$store_id" \
--alternate-identifier "{\"UniqueAttribute\":{\"AttributePath\":\"displayName\",\"AttributeValue\":\"${group_name}\"}}" \
--query "GroupId" \
--output text --no-paginate)
# グループへの割当一覧の取得〜CSV出力
instance_arn=$(aws sso-admin list-instances --query "Instances[0].InstanceArn" --output text --no-paginate)
aws sso-admin list-account-assignments-for-principal \
--instance-arn "$instance_arn" \
--principal-id "$group_id" \
--principal-type GROUP \
--query "AccountAssignments[].[AccountId,PermissionSetArn]" \
--output text \
| while read account_id ps_arn; do
# AWSアカウント名の取得
account_name=$(aws organizations describe-account \
--account-id "$account_id" \
--query "Account.Name" --output text)
# 許可セット名の取得
ps_name=$(aws sso-admin describe-permission-set \
--instance-arn "$instance_arn" \
--permission-set-arn "$ps_arn" \
--query "PermissionSet.Name" --output text)
# CSV出力
echo "${group_name},${account_name},${ps_name}"
done
以下出力サンプルです。
AWSControlTowerAdmins,Audit,AWSAdministratorAccess
AWSControlTowerAdmins,Log-Archive,AWSAdministratorAccess
AWSControlTowerAdmins,Payer-XXX,AWSAdministratorAccess
おわりに
IAM Identity Center API追加の紹介でした。
より素早く・効率的に棚卸しができるようになったのは嬉しいと思いつつ、 できればマネジメントコンソール上でも確認できるようになってほしいですね。
以上、参考になれば幸いです。