[アップデート] IAM Identity Center に「特定ユーザー,グループが持っているアクセス」をリストできるAPIが追加されました

2023.11.21

以下アップデートを紹介します。

IAM Identity Center (以降 SSO)に アクセス割当状況の把握を楽にする 新しいAPIが追加されました。 以下2つです。

何が嬉しいか

「このユーザー/グループ、どのアカウント(アプリケーション)にどの権限で入れたっけ…?」 を調べるのが めっちゃ楽になります。

これまで

背景を簡単に説明します。

まず、SSOマネジメントコンソール上で調べるのはかなり大変です。 ユーザー/グループ単位ではもちろん見れません。 AWSアカウント単位でのみ確認できます。 各AWSアカウントのこのページを巡って、棚卸しを行う必要があります。

img

では、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追加の紹介でした。

より素早く・効率的に棚卸しができるようになったのは嬉しいと思いつつ、 できればマネジメントコンソール上でも確認できるようになってほしいですね。

以上、参考になれば幸いです。

参考