[アップデート] IAM Identity Center に「特定ユーザー,グループが持っているアクセス」をリストできるAPIが追加されました
以下アップデートを紹介します。
- 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追加の紹介でした。
より素早く・効率的に棚卸しができるようになったのは嬉しいと思いつつ、 できればマネジメントコンソール上でも確認できるようになってほしいですね。
以上、参考になれば幸いです。