AWS CLIを使ってAWS SSO アクセス許可セットのインラインポリシーで特定の期間のみ特権を与える

2022.05.17

はじめに

こんにちは。大阪オフィスの林です。

先日下記のエントリを投稿したのですが、全てAWSマネージメントコンソールで操作をしており実際に利用するには少々手間に感じてしまうのが否めません。

ということで、今回は前回のエントリでやっていた内容をAWS CLI + シェルスクリプトに置き換えて少しだけ便利にしてみたいと思います。

やってみた

以下のAWS CLIのリファレンスを参考に検証していきます。

一時的なアクセス許可セットの作成とアタッチ

一時的なアクセス許可セットを作成し、指定したSSOのユーザーとAWSアカウントにアタッチしていきます。

実行するシェルスクリプトの内容

#!/bin/bash

#ユーザー名を入力
echo -n ユーザー名を入力してください: 
read USER
echo -e "\n入力されたユーザー名は" $USER "です。"

#ターゲットのAWSアカウントID(12桁)を入力
echo -e "\n"
echo -n ターゲットのAWSアカウントID(12桁)を入力してください: 
read AWS_ACCOUNT
echo -e "\n入力されたAWSアカウントID(12桁)は" $AWS_ACCOUNT "です。"

#アイデンティティストアIDを変数に格納
IDSTORE_ID=$(aws sso-admin list-instances | jq -r '.Instances[].IdentityStoreId')

#インスタンスARNを変数に格納
INSTANCE_ARN=$(aws sso-admin list-instances | jq -r '.Instances[].InstanceArn')

#対象ユーザーのユーザーIDを変数に格納
USER_ID=$(aws identitystore list-users --identity-store-id $IDSTORE_ID --filters AttributePath=UserName,AttributeValue=$USER | jq -r '.Users[].UserId')

#アクセス許可セットの名称を入力
echo -e "\n"
echo -n 一時的に作成するアクセス許可セットの名称を入力してください: 
read PERMISSION_SETS
echo -e "\n入力されたアクセス許可セットの名称は" $PERMISSION_SETS "です。"

#アクセス許可セットの作成
aws sso-admin create-permission-set --name $PERMISSION_SETS --instance-arn $INSTANCE_ARN

#対象のアクセス許可セットのARNを確認
PERMISSION_SETS_ARN=$(aws sso-admin list-permission-sets --instance-arn $INSTANCE_ARN | jq -r '.PermissionSets[]' | xargs -L 1 aws sso-admin describe-permission-set --instance-arn $INSTANCE_ARN --permission-set-arn | jq -r '[.PermissionSet.Name , .PermissionSet.PermissionSetArn] | @tsv' | grep $PERMISSION_SETS | cut -f2)

#開始日時を入力
echo -e "\n"
echo -n 開始日時を入力してください(例:2022-04-02T00:00:00Z): 
read START_TIME
echo -e "\n入力された開始日時は" $START_TIME "です。"

#終了日時を入力
echo -e "\n"
echo -n 終了日時を入力してください(例:2022-04-22T23:59:59Z): 
read END_TIME
echo -e "\n入力された終了日時は" $END_TIME "です。"

#インラインポリシーを付与
aws sso-admin put-inline-policy-to-permission-set --instance-arn $INSTANCE_ARN --permission-set-arn $PERMISSION_SETS_ARN --inline-policy \
'{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "DateGreaterThan": {
                    "aws:CurrentTime": "'$START_TIME'"
                },
                "DateLessThan": {
                    "aws:CurrentTime": "'$END_TIME'"
                }
            }
        }
    ]
}'

#対象のユーザーに対象のポリシーをアタッチ
aws sso-admin create-account-assignment --instance-arn $INSTANCE_ARN --target-id $AWS_ACCOUNT --target-type AWS_ACCOUNT --permission-set-arn $PERMISSION_SETS_ARN --principal-type USER --principal-id $USER_ID

echo -e "\n\n一時的なアクセス許可セットの作成が完了しました。\n\n"

実行イメージ

一時的なアクセス許可セット作成とアタッチのシェルスクリプトを実行すると下記のように処理が進みます。

[cloudshell-user@ip-10-0-159-229 ~]$ sh create.sh 
ユーザー名を入力してください:test1

入力されたユーザー名は test1 です。


ターゲットのAWSアカウントID(12桁)を入力してください:123456789012

入力されたAWSアカウントID(12桁)は 123456789012 です。


一時的に作成するアクセス許可セットの名称を入力してください:temp-12345

入力されたアクセス許可セットの名称は temp-12345 です。
{
    "PermissionSet": {
        "Name": "temp-12345",
        "PermissionSetArn": "arn:aws:sso:::permissionSet/ssoins-7758c9a78ada8fe0/ps-e25b0b17e64d2809",
        "CreatedDate": "2022-05-17T03:09:41.909000+00:00",
        "SessionDuration": "PT1H"
    }
}


開始日時を入力してください(例:2022-04-02T00:00:00Z):2022-05-17T00:00:00Z

入力された開始日時は 2022-05-17T00:00:00Z です。


終了日時を入力してください(例:2022-04-22T23:59:59Z):2022-05-17T23:59:59Z

入力された終了日時は 2022-05-17T23:59:59Z です。
{
    "AccountAssignmentCreationStatus": {
        "Status": "IN_PROGRESS",
        "RequestId": "bce3930d-a672-4dcd-bb4e-397769446cea",
        "TargetId": "123456789012",
        "TargetType": "AWS_ACCOUNT",
        "PermissionSetArn": "arn:aws:sso:::permissionSet/ssoins-7758c9a78ada8fe0/ps-e25b0b17e64d2809",
        "PrincipalType": "USER",
        "PrincipalId": "9567008a02-3736bd3e-597d-43cd-8302-4f733226a775"
    }
}

一時的なアクセス許可セットの作成が完了しました。

[cloudshell-user@ip-10-0-159-229 ~]$

AWS SSOダッシュボードから設定を確認してみます。
作成したアクセス許可セットが確認出来ます。

指定したAWSアカウントに指定したユーザーと作成したアクセス許可セットがアタッチされています。

アクセス許可セットに指定した期間のインラインポリシーが設定されています。

一時的なアクセス許可セットの更新

一時的なアクセス許可セットの期間を更新してみます。

実行するシェルスクリプトの内容

ポイントとしてはアクセス許可セットの内容を修正後にprovision-permission-setでアクセス許可セットの再プロビジョニングを行っている点です。ポリシーの内容を更新しただけでは設定が反映されないので、provision-permission-setを実行し設定を反映させます。

#!/bin/bash

#ユーザー名を入力
echo -n ユーザー名を入力してください: 
read USER
echo -e "\n入力されたユーザー名は" $USER "です。"

#ターゲットのAWSアカウントID(12桁)を入力
echo -e "\n"
echo -n ターゲットのAWSアカウントID(12桁)を入力してください: 
read AWS_ACCOUNT
echo -e "\n入力されたAWSアカウントID(12桁)は" $AWS_ACCOUNT "です。"

#インスタンスARNを変数に格納
INSTANCE_ARN=$(aws sso-admin list-instances | jq -r '.Instances[].InstanceArn')

#AWSアカウントIDを入力
echo -e "\nアクセス許可セットのARNを出力します。\n対象のアクセス許可セットのARNをコピーします。\n"

#対象のアクセス許可セットのARNを確認
aws sso-admin list-permission-sets --instance-arn $INSTANCE_ARN | jq -r '.PermissionSets[]' | xargs -L 1 aws sso-admin describe-permission-set --instance-arn $INSTANCE_ARN --permission-set-arn | jq -r '[.PermissionSet.Name , .PermissionSet.PermissionSetArn] | @tsv'

#上記コマンドで確認した対象のアクセス許可セットのARNを変数に入力
echo -e "\n"
echo -n 対象のアクセス許可セットのARNを入力してください: 
read PERMISSION_SETS_ARN
echo -e "\n入力された対象のアクセス許可セットのARNは" $PERMISSION_SETS_ARN "です。"

#開始日時を入力
echo -e "\n"
echo -n 開始日時を入力してください(例:2022-04-02T00:00:00Z): 
read START_TIME
echo -e "\n入力された開始日時は" $START_TIME "です。"

#終了日時を入力
echo -e "\n"
echo -n 終了日時を入力してください(例:2022-04-30T23:59:59Z): 
read END_TIME
echo -e "\n入力された終了日時は" $END_TIME "です。"
                
#インラインポリシーをアップデート
aws sso-admin put-inline-policy-to-permission-set --instance-arn $INSTANCE_ARN --permission-set-arn $PERMISSION_SETS_ARN --inline-policy \
'{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "DateGreaterThan": {
                    "aws:CurrentTime": "'$START_TIME'"
                },
                "DateLessThan": {
                    "aws:CurrentTime": "'$END_TIME'"
                }
            }
        }
    ]
}'

#アクセス許可セットを更新
aws sso-admin provision-permission-set --instance-arn $INSTANCE_ARN --permission-set-arn $PERMISSION_SETS_ARN --target-type AWS_ACCOUNT --target-id $AWS_ACCOUNT

echo -e "\n\n一時的なアクセス許可セットの更新が完了しました。\n\n"

実行イメージ

一時的なアクセス許可セット更新のシェルスクリプトを実行すると下記のように処理が進みます。

[cloudshell-user@ip-10-0-159-229 ~]$ sh update.sh 
ユーザー名を入力してください:test1

入力されたユーザー名は test1 です。


ターゲットのAWSアカウントID(12桁)を入力してください:123456789012

入力されたAWSアカウントID(12桁)は 123456789012 です。

アクセス許可セットのARNを出力します。
対象のアクセス許可セットのARNをコピーします。

Temp-Administrator      arn:aws:sso:::permissionSet/ssoins-7758c9a78ada8fe0/ps-91fa1896b362bf1b
ReadOnly        arn:aws:sso:::permissionSet/ssoins-7758c9a78ada8fe0/ps-339864b4c52916b8
temp-12345      arn:aws:sso:::permissionSet/ssoins-7758c9a78ada8fe0/ps-e25b0b17e64d2809


対象のアクセス許可セットのARNを入力してください:arn:aws:sso:::permissionSet/ssoins-7758c9a78ada8fe0/ps-e25b0b17e64d2809

入力された対象のアクセス許可セットのARNは arn:aws:sso:::permissionSet/ssoins-7758c9a78ada8fe0/ps-e25b0b17e64d2809 です。


開始日時を入力してください(例:2022-04-02T00:00:00Z):2022-05-17T00:00:00Z

入力された開始日時は 2022-05-17T00:00:00Z です。


終了日時を入力してください(例:2022-04-30T23:59:59Z):2022-05-31T23:59:59Z

入力された終了日時は 2022-05-31T23:59:59Z です。
{
    "PermissionSetProvisioningStatus": {
        "Status": "IN_PROGRESS",
        "RequestId": "06f0de8e-b08a-475b-9c1b-872b5d4e8627",
        "AccountId": "123456789012",
        "PermissionSetArn": "arn:aws:sso:::permissionSet/ssoins-7758c9a78ada8fe0/ps-e25b0b17e64d2809"
    }
}


一時的なアクセス許可セットの更新が完了しました。


[cloudshell-user@ip-10-0-159-229 ~]$

AWS SSOダッシュボードから設定を確認してみます。
インラインポリシーの内容が変更されています。

一時的なアクセス許可セットのデタッチ

指定したSSOのユーザーとAWSアカウントから一時的なアクセス許可セットをデタッチしていきます。

実行するシェルスクリプトの内容

#!/bin/bash

#ユーザー名を入力
echo -n ユーザー名を入力してください: 
read USER
echo -e "\n入力されたユーザー名は" $USER "です。"

#ターゲットのAWSアカウントID(12桁)を入力
echo -e "\n"
echo -n ターゲットのAWSアカウントID(12桁)を入力してください: 
read AWS_ACCOUNT
echo -e "\n入力されたAWSアカウントID(12桁)は" $AWS_ACCOUNT "です。"

#アイデンティティストアIDを変数に格納
IDSTORE_ID=$(aws sso-admin list-instances | jq -r '.Instances[].IdentityStoreId')

#インスタンスARNを変数に格納
INSTANCE_ARN=$(aws sso-admin list-instances | jq -r '.Instances[].InstanceArn')

#対象ユーザーのユーザーIDを変数に格納
USER_ID=$(aws identitystore list-users --identity-store-id $IDSTORE_ID --filters AttributePath=UserName,AttributeValue=$USER | jq -r '.Users[].UserId')

#アクセス許可セットのARNを出力
echo -e "\nアクセス許可セットのARNを出力します。\nデタッチ対象のアクセス許可セットのARNをコピーします。\n"

#対象のアクセス許可セットのARNを確認
aws sso-admin list-permission-sets --instance-arn $INSTANCE_ARN | jq -r '.PermissionSets[]' | xargs -L 1 aws sso-admin describe-permission-set --instance-arn $INSTANCE_ARN --permission-set-arn | jq -r '[.PermissionSet.Name , .PermissionSet.PermissionSetArn] | @tsv'

#上記コマンドで確認した対象のアクセス許可セットのARNを変数に入力
echo -e "\n"
echo -n デタッチ対象のアクセス許可セットのARNを入力してください: 
read PERMISSION_SETS_ARN
echo -e "\n入力されたデタッチ対象のアクセス許可セットのARNは" $PERMISSION_SETS_ARN "です。"

#対象のユーザーに対象のポリシーをアタッチ
aws sso-admin delete-account-assignment --instance-arn $INSTANCE_ARN --target-id $AWS_ACCOUNT --target-type AWS_ACCOUNT --permission-set-arn $PERMISSION_SETS_ARN --principal-type USER --principal-id $USER_ID

echo -e "\n\n一時的なアクセス許可セットからユーザーとAWSアカウントのデタッチが完了しました。\n\n"

実行イメージ

一時的なアクセス許可セットデタッチのシェルスクリプトを実行すると下記のように処理が進みます。

[cloudshell-user@ip-10-0-159-229 ~]$ sh detach.sh 
ユーザー名を入力してください:test1

入力されたユーザー名は test1 です。


ターゲットのAWSアカウントID(12桁)を入力してください:123456789012

入力されたAWSアカウントID(12桁)は 123456789012 です。

アクセス許可セットのARNを出力します。
デタッチ対象のアクセス許可セットのARNをコピーします。

Temp-Administrator      arn:aws:sso:::permissionSet/ssoins-7758c9a78ada8fe0/ps-91fa1896b362bf1b
ReadOnly        arn:aws:sso:::permissionSet/ssoins-7758c9a78ada8fe0/ps-339864b4c52916b8
temp-12345      arn:aws:sso:::permissionSet/ssoins-7758c9a78ada8fe0/ps-e25b0b17e64d2809


デタッチ対象のアクセス許可セットのARNを入力してください:arn:aws:sso:::permissionSet/ssoins-7758c9a78ada8fe0/ps-e25b0b17e64d2809

入力されたデタッチ対象のアクセス許可セットのARNは arn:aws:sso:::permissionSet/ssoins-7758c9a78ada8fe0/ps-e25b0b17e64d2809 です。
{
    "AccountAssignmentDeletionStatus": {
        "Status": "IN_PROGRESS",
        "RequestId": "559ba06f-27ce-47de-8b65-1540f9f7da5a",
        "TargetId": "123456789012",
        "TargetType": "AWS_ACCOUNT",
        "PermissionSetArn": "arn:aws:sso:::permissionSet/ssoins-7758c9a78ada8fe0/ps-e25b0b17e64d2809",
        "PrincipalType": "USER",
        "PrincipalId": "9567008a02-3736bd3e-597d-43cd-8302-4f733226a775"
    }
}


一時的なアクセス許可セットからユーザーとAWSアカウントのデタッチが完了しました。


[cloudshell-user@ip-10-0-159-229 ~]$

AWS SSOダッシュボードから設定を確認してみます。
アクセス許可セットにアタッチされているAWSアカウントが無くなり、デタッチが完了しています。

一時的なアクセス許可セットの削除

アクセス許可セットを削除していきます。

実行するシェルスクリプトの内容

#!/bin/bash

#アクセス許可セットのARNを出力
echo -e "\nアクセス許可セットのARNを出力します。\n削除対象のアクセス許可セットのARNをコピーします。\n"

#インスタンスARNを変数に格納
INSTANCE_ARN=$(aws sso-admin list-instances | jq -r '.Instances[].InstanceArn')

#対象のアクセス許可セットのARNを確認
aws sso-admin list-permission-sets --instance-arn $INSTANCE_ARN | jq -r '.PermissionSets[]' | xargs -L 1 aws sso-admin describe-permission-set --instance-arn $INSTANCE_ARN --permission-set-arn | jq -r '[.PermissionSet.Name , .PermissionSet.PermissionSetArn] | @tsv'

#アクセス許可セットの名称を入力
echo -e "\n"
echo -n 削除するアクセス許可セットのARNを入力してください: 
read PERMISSION_SETS_ARN
echo -e "\n入力されたアクセス許可セットのARNは" $PERMISSION_SETS_ARN "です。"
  
aws sso-admin delete-permission-set --instance-arn $INSTANCE_ARN --permission-set-arn $PERMISSION_SETS_ARN

echo -e "\n\n一時的なアクセス許可セットの削除が完了しました。\n\n"

実行イメージ

一時的なアクセス許可セット削除のシェルスクリプトを実行すると下記のように処理が進みます。

[cloudshell-user@ip-10-0-159-229 ~]$ sh delete.sh 

アクセス許可セットのARNを出力します。
削除対象のアクセス許可セットのARNをコピーします。

Temp-Administrator      arn:aws:sso:::permissionSet/ssoins-7758c9a78ada8fe0/ps-91fa1896b362bf1b
ReadOnly        arn:aws:sso:::permissionSet/ssoins-7758c9a78ada8fe0/ps-339864b4c52916b8
temp-12345      arn:aws:sso:::permissionSet/ssoins-7758c9a78ada8fe0/ps-e25b0b17e64d2809


削除するアクセス許可セットのARNを入力してください:arn:aws:sso:::permissionSet/ssoins-7758c9a78ada8fe0/ps-e25b0b17e64d2809

入力されたアクセス許可セットのARNは arn:aws:sso:::permissionSet/ssoins-7758c9a78ada8fe0/ps-e25b0b17e64d2809 です。


一時的なアクセス許可セットの削除が完了しました。


[cloudshell-user@ip-10-0-159-229 ~]$

AWS SSOダッシュボードから設定を確認してみます。
作成したアクセス許可セットが削除されていることが確認出来ます。

まとめ

AWS CLIを使うことでAWSマネージメントコンソールでの操作に比べやや便利になったかなという印象です。
この内容がどなたかの参考になりましたら幸いです。

以上、大阪オフィスの林がお送りしました!