【AWS CLI】AWS SSOのアクセス権の設定方法

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

こんにちは。AWS CLIが好きな福島です。

今回は、AWS SSOのアクセス権の設定をAWS CLIで行いましたので、
その方法をブログに記載いたします。

AWSSSOのアクセス権の仕組み及びコンソールから設定する方法は、
以下のブログにまとめておりますので、興味がある方はご確認いただければ幸いです。

blog.serverworks.co.jp

f:id:swx-fukushima:20201022005339p:plain

実行環境

今回、コマンドを実行した環境は、以下の通りとなります。
(本記事でご紹介しているコマンドの中には、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で実施してみました。
どなたかのお役に立てれば幸いです。