【AWS CLI】AWS SSO関連の情報取得編

記事タイトルとURLをコピーする

こんにちは。AWS CLIが好きな福島です。
今回は、AWS SSO関連の情報を取得するコマンドをご紹介いたします。

前回のブログで次回は、IAM権限について、ご紹介すると記載したのですが、 ちょっと寄り道をして、AWS SSO関連の情報取得を先にご紹介いたします。

先に記載しておくと、

  • 全アカウントに紐づくアクセス権限セットの表示
  • 全アクセス権限セットの詳細

が一番使えると思います。

AWS SSOのインスタンスARNの確認

インスタンスのARNは、今後紹介するコマンドで結構使います。

コマンド

aws sso-admin list-instances
  • 実行結果
{
    "Instances": [
        {
            "InstanceArn": "arn:aws:sso:::instance/ssoins-7758faff83b26bbb",
            "IdentityStoreId": "d-9567180725"
        }
    ]
}

アクセス権限セットの確認

インスタンスのARNを利用しますが、コマンドで自動で取得するようにしてますので、コピペでOKです。

コマンド

aws sso-admin list-permission-sets \
--instance-arn $(aws sso-admin list-instances --query "Instances[].InstanceArn" --output text)
  • 実行結果
{
    "PermissionSets": [
        "arn:aws:sso:::permissionSet/ssoins-7758faff83b26bbb/ps-82a2d3c9ca6398a4",
        "arn:aws:sso:::permissionSet/ssoins-7758faff83b26bbb/ps-82c9d5e2c3d089ec"
    ]
}

アクセス権限セットの基本情報

コマンド

PERMISSION="" ★PermissionSetsのArnを入力します。
aws sso-admin describe-permission-set \
--instance-arn $(aws sso-admin list-instances --query "Instances[].InstanceArn" --output text) \
--permission-set-arn ${PERMISSION}
  • 実行結果
{
    "PermissionSet": {
        "Name": "AdministratorAccess",
        "PermissionSetArn": "arn:aws:sso:::permissionSet/ssoins-7758faff83b26bbb/ps-82a2d3c9ca6398a4",
        "CreatedDate": "2020-10-09T09:53:33.521000+09:00",
        "SessionDuration": "PT1H"
    }
}

アクセス権限セットに紐づくマネージドポリシー

コマンド

PERMISSION="" ★PermissionSetsのArnを入力します。
aws sso-admin list-managed-policies-in-permission-set \
--instance-arn $(aws sso-admin list-instances --query "Instances[].InstanceArn" --output text) \
--permission-set-arn ${PERMISSION}
  • 実行結果
{
    "AttachedManagedPolicies": [
        {
            "Name": "AdministratorAccess",
            "Arn": "arn:aws:iam::aws:policy/AdministratorAccess"
        }
    ]
}

アクセス権限セットのインラインポリシー

コマンド

PERMISSION="" ★PermissionSetsのArnを入力します。
aws sso-admin get-inline-policy-for-permission-set \
--instance-arn $(aws sso-admin list-instances --query "Instances[].InstanceArn" --output text) \
--permission-set-arn ${PERMISSION}
  • 実行結果
{
    "InlinePolicy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Action\":\"*\",\"Resource\":\"*\"}]}"
}

インラインポリシーの表示が改行がされていないため、少し分かりづらいですね。 ということで改行いれて、少し分かりやすくしてみました。

コマンド(ちょっと分かりやすく)

PERMISSION="" ★PermissionSetsのArnを入力します。
aws sso-admin get-inline-policy-for-permission-set \
--instance-arn $(aws sso-admin list-instances --query "Instances[].InstanceArn" --output text) \
--permission-set-arn ${PERMISSION} \
--output text | sed -e 's/,/,\n/g' -e 's/{/\n{\n/g' -e 's/\[/\n\[/g' -e 's/\}/\n\}/g' -e 's/\]/\n\]/g' | sed '1d'
  • 実行結果
{
"Version":"2012-10-17",
"Statement":
[
{
"Effect":"Allow",
"Action":"*",
"Resource":"*"
}
]
}

アクセス権限セットが紐づいているアカウント一覧

コマンド

PERMISSION="" ★PermissionSetsのArnを入力します。
aws sso-admin list-accounts-for-provisioned-permission-set \
--instance-arn $(aws sso-admin list-instances --query "Instances[].InstanceArn" --output text) \
--permission-set-arn ${PERMISSION} 
  • 実行結果
{
    "AccountIds": [
        "xxxxxxxxxxxx",
        "xxxxxxxxxxxx",
        "xxxxxxxxxxxx"
    ]
}

アカウントに紐づくアクセス権限セット

コマンド

ACCOUNTID="" ★アカウントIDを入力します。
aws sso-admin list-permission-sets-provisioned-to-account \
--instance-arn $(aws sso-admin list-instances --query "Instances[].InstanceArn" --output text) \
--account-id ${ACCOUNTID}
  • 実行結果
{
    "PermissionSets": [
        "arn:aws:sso:::permissionSet/ssoins-7758faff83b26bbb/ps-82a2d3c9ca6398a4"
    ]
}

全アカウントに紐づくアクセス権限セットの表示1

※アカウント情報は、organizationsコマンドで取得しています。
 アカウント数分、コマンドを実行するため、結構時間がかかります。

コマンド

INSTNACE_ARN=$(aws sso-admin list-instances --query "Instances[].InstanceArn" --output text);\
aws organizations list-accounts --query "Accounts[].Id" --output text | tr "\t" "\n" | sort | while read line
do
   echo ${line} > /tmp/awscli.tmp
   for permission in $(aws sso-admin list-permission-sets-provisioned-to-account --instance-arn ${INSTNACE_ARN} --account-id ${line} --query "PermissionSets" --output text)
   do
     if [[ ${permission} == None ]] ; then
        echo "アクセス権限セットなし"  >> /tmp/awscli.tmp
     else
        aws sso-admin describe-permission-set \
           --instance-arn ${INSTNACE_ARN} \
           --permission-set-arn ${permission} \
           --query "PermissionSet.[Name]" --output text >> /tmp/awscli.tmp
     fi
   done
   (head -n +1 /tmp/awscli.tmp && tail -n +2 /tmp/awscli.tmp | sort) | tr "\n" " "
   echo ""
done;\
rm /tmp/awscli.tmp
  • 実行結果
xxxxxxxxxxxx AdministratorAccess Billing
xxxxxxxxxxxx AdministratorAccess

全アカウントに紐づくアクセス権限セットの表示2

※アカウント情報は、organizationsコマンドで取得しています。
 アカウント数分、コマンドを実行するため、結構時間がかかります。

コマンド

INSTNACE_ARN=$(aws sso-admin list-instances --query "Instances[].InstanceArn" --output text);\
aws organizations list-accounts --query "Accounts[].Id" --output text | tr "\t" "\n" | sort | while read line
do
   for permission in $(aws sso-admin list-permission-sets-provisioned-to-account --instance-arn ${INSTNACE_ARN} --account-id ${line} --query "PermissionSets" --output text)
   do
     
     if [[ ${permission} == None ]] ; then
        echo "${line} : アクセス権限セットなし"  >> /tmp/awscli.tmp
     else
        aws sso-admin list-account-assignments \
           --instance-arn ${INSTNACE_ARN} \
           --permission-set-arn ${permission} \
           --account-id ${line} \
           --query "AccountAssignments[]" --output text >> /tmp/awscli.tmp
     fi
   done
done;\
rm /tmp/awscli.tmp
  • 実行結果
xxxxxxxxxxxxxx    arn:aws:sso:::permissionSet/ssoins-xxxxxxxxxxxxxxxxxxxx/ps-xxxxxxxxxxxxxxxxxx xxxxxxxxxxxx-xxxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxxxxxxx GROUP
xxxxxxxxxxxxxx    arn:aws:sso:::permissionSet/ssoins-xxxxxxxxxxxxxxxxxxxx/ps-xxxxxxxxxxxxxxxxxx xxxxxxxxxxxx-xxxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxxxxxxx GROUP
xxxxxxxxxxxxxx    arn:aws:sso:::permissionSet/ssoins-xxxxxxxxxxxxxxxxxxxx/ps-xxxxxxxxxxxxxxxxxx xxxxxxxxxxxx-xxxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxxxxxxx GROUP
xxxxxxxxxxxxxx    : アクセス権限セットなし
xxxxxxxxxxxxxx    : アクセス権限セットなし

全アクセス権限セットの詳細

コマンド

INSTNACE_ARN=$(aws sso-admin list-instances --query "Instances[].InstanceArn" --output text);\
aws sso-admin list-permission-sets --instance-arn ${INSTNACE_ARN} --query "PermissionSets" --output text | tr "\t" "\n" | while read line
do
  echo "## アクセス権限セット名"
  RESULT=$(aws sso-admin describe-permission-set --instance-arn ${INSTNACE_ARN} --permission-set-arn ${line} --query "PermissionSet.[Name,PermissionSetArn]" --output text)
  echo ${RESULT}
  
  echo "### マネージドポリシー"
  aws sso-admin list-managed-policies-in-permission-set \
     --instance-arn $(aws sso-admin list-instances --query "Instances[].InstanceArn" --output text) \
     --permission-set-arn ${line} \
     --query "AttachedManagedPolicies[].[Name,Arn]" --output text
  
  echo "### インラインポリシー"
  FILE_NAME=$(echo ${RESULT} | awk '{print $1}').policy
  aws sso-admin get-inline-policy-for-permission-set \
    --instance-arn $(aws sso-admin list-instances --query "Instances[].InstanceArn" --output text) \
    --permission-set-arn ${line} --output text > /tmp/awscli.tmp;\
  if [[ 1 -lt $(wc -c /tmp/awscli.tmp | awk '{print $1}') ]] ; then
     cat /tmp/awscli.tmp | sed -e 's/,/,\n/g' -e 's/{/\n{\n/g' -e 's/\[/\n\[/g' -e 's/\}/\n\}/g' -e 's/\]/\n\]/g' | sed '1d' ;\
  else
     echo "インラインポリシーは定義されていません。" ;\
  fi;\
done;\
rm /tmp/awscli.tmp
  • 実行結果
## アクセス権限セット名
AdministratorAccess arn:aws:sso:::permissionSet/ssoins-7758faff83b26bbb/ps-82a2d3c9ca6398a4
### マネージドポリシー
Billing arn:aws:iam::aws:policy/job-function/Billing
### インラインポリシー
{
"Version":"2012-10-17",
"Statement":
[
{
"Effect":"Allow",
"Action":"*",
"Resource":"*"
}
]
}
## アクセス権限セット名
Billing arn:aws:sso:::permissionSet/ssoins-7758faff83b26bbb/ps-82c9d5e2c3d089ec
### マネージドポリシー
Billing arn:aws:iam::aws:policy/job-function/Billing
### インラインポリシー
インラインポリシーは定義されていません。
#

おまけ

アクセス権限セットごとのインラインポリシーをファイルに出力するVersion
※標準出力もします。

INSTNACE_ARN=$(aws sso-admin list-instances --query "Instances[].InstanceArn" --output text);\
aws sso-admin list-permission-sets --instance-arn ${INSTNACE_ARN} --query "PermissionSets" --output text | tr "\t" "\n" | sort | while read line
do
  echo "## アクセス権限セット名"
  RESULT=$(aws sso-admin describe-permission-set --instance-arn ${INSTNACE_ARN} --permission-set-arn ${line} --query "PermissionSet.[Name,PermissionSetArn]" --output text)
  echo "${RESULT}"

  echo "### マネージドポリシー"
  aws sso-admin list-managed-policies-in-permission-set \
     --instance-arn $(aws sso-admin list-instances --query "Instances[].InstanceArn" --output text) \
     --permission-set-arn ${line} \
     --query "AttachedManagedPolicies[].[Name,Arn]" --output text
  
  echo "### インラインポリシー"
  FILE_NAME=$(echo ${RESULT} | awk '{print $1}').policy
  aws sso-admin get-inline-policy-for-permission-set \
    --instance-arn $(aws sso-admin list-instances --query "Instances[].InstanceArn" --output text) \
    --permission-set-arn ${line} --output text > /tmp/awscli.tmp;\
  if [[ 1 -lt $(wc -c /tmp/awscli.tmp | awk '{print $1}') ]] ; then
     cat /tmp/awscli.tmp | sed -e 's/,/,\n/g' -e 's/{/\n{\n/g' -e 's/\[/\n\[/g' -e 's/\}/\n\}/g' -e 's/\]/\n\]/g' | sed '1d' | tee ${FILE_NAME};\
  else
     echo "インラインポリシーは定義されていません。" | tee ${FILE_NAME};\
  fi;\
done;\
rm /tmp/awscli.tmp
  • 実行結果
## アクセス権限セット名
AdministratorAccess     arn:aws:sso:::permissionSet/ssoins-7758faff83b26bbb/ps-82a2d3c9ca6398a4
### マネージドポリシー
AdministratorAccess     arn:aws:iam::aws:policy/AdministratorAccess
### インラインポリシー
{
"Version":"2012-10-17",
"Statement":
[
{
"Effect":"Allow",
"Action":"*",
"Resource":"*"
}
]
}
## アクセス権限セット名
Billing arn:aws:sso:::permissionSet/ssoins-7758faff83b26bbb/ps-82c9d5e2c3d089ec
### マネージドポリシー
Billing arn:aws:iam::aws:policy/job-function/Billing
### インラインポリシー
インラインポリシーは定義されていません。
# ls -lrt 
-rwxrwxrwx 1 kazuya kazuya       96 Oct 27 00:35 AdministratorAccess.policy
-rwxrwxrwx 1 kazuya kazuya       61 Oct 27 00:35 Billing.policy
#
# cat AdministratorAccess.policy
{
"Version":"2012-10-17",
"Statement":
[
{
"Effect":"Allow",
"Action":"*",
"Resource":"*"
}
]
}
# 
# cat Billing.policy
インラインポリシーは定義されていません。
#

おわりに

今回は、AWS SSO関連の情報を取得するコマンドをご紹介いたしました。
次回は、IAMもしくはAWS SSOのアクセス権限セットの作成・削除などをご紹介したいと思います~

福島 和弥 (記事一覧)

2019/10 入社

AWS CLIが好きです。

AWS資格12冠。2023 Japan AWS Partner Ambassador/APN ALL AWS Certifications Engineer。