こんにちは。AWS CLIが好きな福島です。
今回は、AWS SSOのアクセス権の設定をAWS CLIで行いましたので、
その方法をブログに記載いたします。
AWSSSOのアクセス権の仕組み及びコンソールから設定する方法は、
以下のブログにまとめておりますので、興味がある方はご確認いただければ幸いです。
実行環境
今回、コマンドを実行した環境は、以下の通りとなります。
(本記事でご紹介しているコマンドの中には、Linuxのコマンドを利用している箇所があります。)
# uname -a Linux LAPTOP-CNM26HN6 4.4.0-18362-Microsoft #1049-Microsoft Thu Aug 14 12:01:00 PST 2020 x86_64 x86_64 x86_64 GNU/Linux #
前提
AWS SSOにユーザーもしくはグループが存在していること
やること
①空のアクセス権限セットの作成
②アクセス権限セットにポリシーの割り当て
③以下、3要素の割り当て
- AWSアカウント
- アクセス権限セット
- ユーザーもしくはグループ
ポイント
- AWS CLIではマネコンと違い、アクセス権限セット作成時に合わせてポリシーを指定できません。 そのため、空のアクセス権限セットを作成後、アクセス権限セットにポリシーを割り当てる作業が必要になります。
使用したコマンド
- aws sso-admin
- aws identitystore
手順
空のアクセス権限セットの作成
事前に変数を定義します。
## アクセス権限セット名 PERMISSION_SET_NAME="test-permission-set" ## アクセス権限セットの説明 PERMISSION_SET_DESCRIPTION="test-permission-set_description" ## セッション時間(以下は8時間を意味する) SESSION_DURATION="PT8H" ## キー KEY_NAME="Name" ## バリュー KEY_VALUE="test-permission-set"
aws sso-admin create-permission-set \ --name ${PERMISSION_SET_NAME} \ --description ${PERMISSION_SET_DESCRIPTION} \ --session-duration ${SESSION_DURATION} \ --instance-arn $(aws sso-admin list-instances --query "Instances[].InstanceArn" --output text) \ --tags Key=${KEY_NAME},Value=${KEY_VALUE}
- --name
アクセス権限セット名 - --description
説明 - --session-duration
セッション時間(上記の場合、8時間を意味する) - --instance-arn
AWS SSOのインスタンスID
(上記の場合、list-instancesで値を勝手に取得するため、特に変更する必要はなし。) --tags
タグを設定できます。実行結果
{ "PermissionSet": { "Name": "test-permission-set", "PermissionSetArn": "arn:aws:sso:::permissionSet/ssoins-7758a166bb996853/ps-0c23ac2f9a37e442", "Description": "test-permission-set_description", "CreatedDate": "2021-02-14T18:13:12.223000+09:00", "SessionDuration": "PT8H" } }
アクセス権限セットへマネージドポリシーの割り当て
変数を事前に定義します。
## アクセス権限セット名 PERMISSION_SET_NAME="test-permission-set" ## マネージドポリシーのARN MANAGED_POLICY_ARN="arn:aws:iam::aws:policy/AdministratorAccess"
変数を定義したら、コマンドを実行します。
aws sso-admin attach-managed-policy-to-permission-set \ --instance-arn $(aws sso-admin list-instances --query "Instances[].InstanceArn" --output text) \ --permission-set-arn $(aws sso-admin list-permission-sets --instance-arn ${INSTNACE_ARN} --query "PermissionSets" --output text | tr "\t" "\n" | while read line do aws sso-admin describe-permission-set \ --instance-arn $(aws sso-admin list-instances --query "Instances[].InstanceArn" --output text) \ --permission-set-arn ${line} \ --query "PermissionSet.[Name,PermissionSetArn]" --output text done | grep -w ${PERMISSION_SET_NAME} | awk '{print $2}') \ --managed-policy-arn ${MANAGED_POLICY_ARN}
--instance-arn
AWS SSOのインスタンスID
(上記の場合、list-instancesで値を勝手に取得するため、特に変更する必要なし。)--permission-set-arn
アクセス権限セットのARNを指定します。 アクセス権限セット名からARNをフィルターできないので、 全アクセス権限セットのARNをwhileで1つずつループし、 アクセス権限セットの名前とARNの組み合わせを出力し、grepでフィルターしています。
(事前に変数を定義しているため、特に変更する必要なしですが、似た名前のアクセス権限セットが存在すると失敗する可能性があります。)--managed-policy-arn アタッチするマネージドポリシーのARNを指定します。 (事前に変数を定義しているため、特に変更する必要なし。)
アクセス権限セットへアクセス権限ポリシーの割り当て
変数の事前に定義します。
## アクセス権限セット名 PERMISSION_SET_NAME="test-permission-set"
次に設定するインラインポリシーのinline-policy.json(JSONファイル)を作成します。
今回は、特定のS3バケットへのアクセス権を付与するインラインポリシーとしました。
cat << EOF > inline-policy.json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:*", "Resource": [ "arn:aws:s3:::your-bucket-name", "arn:aws:s3:::your-bucket-name/*" ] }, { "Effect": "Deny", "Action": [ "s3:DeleteBucket", "s3:CreateBucket" ], "Resource": [ "*" ] } ] } EOF
変数の定義およびインラインポリシーのJSONファイルが作成できたら、以下のコマンドを実行します。
aws sso-admin put-inline-policy-to-permission-set \ --instance-arn $(aws sso-admin list-instances --query "Instances[].InstanceArn" --output text) \ --permission-set-arn $(aws sso-admin list-permission-sets --instance-arn ${INSTNACE_ARN} \ --query "PermissionSets" --output text | tr "\t" "\n" | while read line do aws sso-admin describe-permission-set \ --instance-arn $(aws sso-admin list-instances --query "Instances[].InstanceArn" --output text) \ --permission-set-arn ${line} \ --query "PermissionSet.[Name,PermissionSetArn]" --output text done | grep -w ${PERMISSION_SET_NAME} | awk '{print $2}') \ --inline-policy file://inline-policy.json
--instance-arn
AWS SSOのインスタンスID
(上記の場合、list-instancesで値を勝手に取得するため、特に変更する必要なし。)--permission-set-arn
アクセス権限セットのARNを指定します。 アクセス権限セット名からARNをフィルターできないので、 全アクセス権限セットのARNをwhileで1つずつループし、 アクセス権限セットの名前とARNの組み合わせを出力し、grepでフィルターしています。
(事前に変数を定義しているため、特に変更する必要なしですが、似た名前のアクセス権限セットが存在すると失敗する可能性があります。)--inline-policy
インラインポリシーを記述したJSONファイルを指定します。
3要素の割り当て
変数を事前に定義します。
### AWSアカウントID ACCOUNTID="123456789012" ### アクセス権限セット名 PERMISSION_SET_NAME="AdministratorAccess" ### ユーザー名もしくはグループ名を定義 USER_NAME="test-user" GROUP_NAME="test-group"
ユーザー単位で権限を割り当てる場合
変数を定義した上で以下のコマンドを実行します。
aws sso-admin create-account-assignment \ --instance-arn $(aws sso-admin list-instances --query "Instances[].InstanceArn" --output text) \ --target-id ${ACCOUNTID} --target-type AWS_ACCOUNT \ --permission-set-arn $(aws sso-admin list-permission-sets --instance-arn ${INSTNACE_ARN} --query "PermissionSets" --output text | tr "\t" "\n" | while read line do aws sso-admin describe-permission-set \ --instance-arn $(aws sso-admin list-instances --query "Instances[].InstanceArn" --output text) \ --permission-set-arn ${line} \ --query "PermissionSet.[Name,PermissionSetArn]" --output text done | grep -w ${PERMISSION_SET_NAME} | awk '{print $2}') \ --principal-type USER \ --principal-id $(aws identitystore list-users \ --identity-store-id $(aws sso-admin list-instances --query "Instances[].IdentityStoreId" --output text) \ --filter "AttributePath=UserName,AttributeValue=${USER_NAME}" \ --query "Users[].UserId" --output text)
--instance-arn
AWS SSOのインスタンスID
(上記の場合、list-instancesで値を勝手に取得するため、特に変更する必要なし。)--target-id
アクセスしたいAWSアカウントを指定します。 (事前に変数を定義しているため、特に変更する必要なし。)--target-type
基本、AWS_ACCOUNTでOKです。--permission-set-arn
アクセス権限セットのARNを指定します。 アクセス権限セット名からARNをフィルターできないので、 全アクセス権限セットのARNをwhileで1つずつループし、 アクセス権限セットの名前とARNの組み合わせを出力し、grepでフィルターしています。
(事前に変数を定義しているため、特に変更する必要なしですが、似た名前のアクセス権限セットが存在すると失敗する可能性があります。)--principal-type
USERもしくは、GROUPを指定します。--principal-id
USERもしくは、GROUPのIDを指定します。
※このIDを取得するためには、aws identitystoreを使っています。
グループ単位で権限を割り当てる場合
aws sso-admin create-account-assignment \ --instance-arn $(aws sso-admin list-instances --query "Instances[].InstanceArn" --output text) \ --target-id ${ACCOUNTID} --target-type AWS_ACCOUNT \ --permission-set-arn $(aws sso-admin list-permission-sets --instance-arn ${INSTNACE_ARN} --query "PermissionSets" --output text | tr "\t" "\n" | while read line do aws sso-admin describe-permission-set \ --instance-arn $(aws sso-admin list-instances --query "Instances[].InstanceArn" --output text) \ --permission-set-arn ${line} \ --query "PermissionSet.[Name,PermissionSetArn]" --output text done | grep ${PERMISSION_SET_NAME} | awk '{print $2}') \ --principal-type GROUP \ --principal-id $(aws identitystore list-groups \ --identity-store-id $(aws sso-admin list-instances --query "Instances[].IdentityStoreId" --output text) \ --filter "AttributePath=DisplayName,AttributeValue=${GROUP_NAME}" \ --query "Users[].UserId" --output text)
基本、ユーザー単位で割り当てるコマンドと変わりないありません。
違いは、
- --principal-typeにGROUPを指定している点
- --principal-idを取得する時のコマンド(赤字の箇所)
aws identitystore list-groups \
--identity-store-id ${aws sso-admin list-instances --query "Instances.IdentityStoreId" --output text} \
--filter "AttributePath=DisplayName,AttributeValue=${GROUP_NAME}" \
--query "Users.UserId" --output text)
です!
動作確認
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} : アクセス権限セットなし" else aws sso-admin list-account-assignments \ --instance-arn ${INSTNACE_ARN} \ --permission-set-arn ${permission} \ --account-id ${line} \ --query "AccountAssignments[]" --output text fi done done;
- 実行結果
111111111111 : アクセス権限セットなし 222222222222 : アクセス権限セットなし 333333333333 arn:aws:sso:::permissionSet/ssoins-7758a166bb996853/ps-d139fc863a4caab3 95671b5f0c-8db467ec-43ac-4317-9ed6-06083e02b40a USER
アクセス権限が割り当たっている場合、
- 2列目にアクセス権限セットのARN
- 3列目にプリンシパルID
- 4列目にプリンシパルタイプ
が表示されます。
ただ、ARNやIDのため、可読性が悪いですので、 ARNやIDが名前に置換する等を別途、考える必要があります。
終わりに
今回は、AWS SSOのアクセス権の設定をAWS CLIで実施してみました。
どなたかのお役に立てれば幸いです。