Identity Center でメンバー追加可能なグループを特定のグループに絞りたい

Identity Center でメンバー追加可能なグループを特定のグループに絞りたい

Clock Icon2025.02.16

こんにちは!クラウド事業本部コンサルティング部のたかくに(@takakuni_)です。

1 つの Organizations に複数プロジェクトの AWS アカウントがまたがる構成の場合、Identity Center を利用することで、外部の ID プロバイダー(既存で利用している認証基盤)を利用できたり、一元的なアクセス管理が実装できて非常に便利です。

組織規模、AWS アカウント、プロジェクト数が大きくなった場合を考えてみましょう。

この運用の場合、プロジェクトの入退場ごとに Identity Center 管理者グループへの申請が集中します。Identity Center 管理者グループがボトルネックにならないか、少し心配ですね。

そこで、プロジェクト A 管理グループを設け、プロジェクト A の入退場は、プロジェクト A 管理グループが行うような運用を目指したくなります。

Untitled(132) (1).png

sso-directory から始まる API では Resource 句に ARN を指定できない

上記の運用を実装しよう!とすると、まず思いつくのは、次のような IAM ポリシーをプロジェクト管理グループの許可セットにアタッチすることです。

dummy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Action": [
                "sso:Describe*",
                "sso:Get*",
                "sso:List*",
                "sso-directory:Describe*",
                "sso-directory:Get*",
                "sso-directory:List*",
                "sso-directory:SearchGroups",
                "sso-directory:SearchUsers"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Sid": "Statement2",
            "Effect": "Allow",
            "Action": [
                "sso-directory:AddMemberToGroup",
                "sso-directory:RemoveMemberFromGroup"
            ],
            "Resource": [
                "arn:aws:identitystore:::group/プロジェクト管理グループID",
                "arn:aws:identitystore:::group/プロジェクトメンバーグループID"
            ]
        }
    ]
}

ただし、この IAM ポリシーは機能しません。と言うのも sso-directory から始まる API では、Resource 句に ARN を指定できないためです。

英語

AWS IAM Identity Center (successor to AWS Single Sign-On) directory does not support specifying a resource ARN in the Resource element of an IAM policy statement. To allow access to AWS IAM Identity Center (successor to AWS Single Sign-On) directory, specify "Resource": "*" in your policy.

日本語

AWS IAM Identity Center ( AWS Single Sign-On の後継) ディレクトリでは、IAM ポリシーステートメントの Resource要素でのリソース ARN の指定はサポートされていません。 AWS IAM Identity Center ( AWS Single Sign-On の後継) ディレクトリへのアクセスを許可するには、ポリシー"Resource": "*"で を指定します。

https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsiamidentitycentersuccessortoawssinglesign-ondirectory.html#awsiamidentitycentersuccessortoawssinglesign-ondirectory-resources-for-iam-policies

Resouce 句にワイルドカードを指定した AddMemberToGroupRemoveMemberFromGroup は他のグループへの操作権限も付与されてしまうため、要件に満たしていません。どうすれば良いのでしょうか。

identitystore API を利用する

代替案として identitystore API を利用します。identitystore では Resouce 句に ARN を指定できます。 identitystore の CreateGroupMembership, DeleteGroupMembership API でグループへのユーザー追加を担います。

[アクション] テーブルの [リソースタイプ] 列は、各アクションがリソースレベルの許可をサポートしているかどうかを示します。この列に値がない場合は、ポリシーステートメントの Resource 要素で、ポリシーが適用されるすべてのリソース (「*」) を指定する必要があります。列にリソースタイプが含まれる場合、そのアクションを含むステートメントでそのタイプの ARN を指定できます。

https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/list_awsidentitystore.html#awsidentitystore-actions-as-permissions

やってみた

今回は ProjectA_Admin と ProjectA_Member のユーザー/グループが存在し、ユーザー ProjectA_Member がグループ ProjectA_Member へ参加するために、 ProjectA_Admin に依頼しているケースを想定します。

Untitled(134).png

ワイルドカードの sso-directory

まずは、ワイルドカードで sso-directory を許可してみます。

IAM Policy
ProjectA_Admin.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "GetAPIs",
            "Effect": "Allow",
            "Action": [
                "sso:Describe*",
                "sso:Get*",
                "sso:List*",
                "sso-directory:Describe*",
                "sso-directory:Get*",
                "sso-directory:List*",
                "sso-directory:SearchGroups",
                "sso-directory:SearchUsers"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Sid": "ManagementAPIs",
            "Effect": "Allow",
            "Action": [
                "sso-directory:AddMemberToGroup",
                "sso-directory:RemoveMemberFromGroup"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

問題なく追加できましたね。

後続の作業のために削除しておきます。

sso-directory

本当にできないのか試してみましょう。ProjectA のグループ ARN を Resouce 句に指定してみます。

2025-02-16 at 17.19.36-許可セットの詳細  IAM Identity Center (AWS Single Sign-On の後継)  ap-northeast-1.png

IAM Policy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "GetAPIs",
            "Effect": "Allow",
            "Action": [
                "sso:Describe*",
                "sso:Get*",
                "sso:List*",
                "sso-directory:Describe*",
                "sso-directory:Get*",
                "sso-directory:List*",
                "sso-directory:SearchGroups",
                "sso-directory:SearchUsers"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Sid": "ManagementAPIs",
            "Effect": "Allow",
            "Action": [
                "sso-directory:AddMemberToGroup",
                "sso-directory:RemoveMemberFromGroup"
            ],
            "Resource": [
                "arn:aws:identitystore:::group/GroupID"
            ]
        }
    ]
}

ボタンは押せているものの、次に進むことができません。

CloudTrail を確認すると AccessDenied で怒られていました。

AddMemberToGroup.json
{
    "eventVersion": "1.09",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AROA47CRV7MVRG2GRX5WL:ProjectA_Admin",
        "arn": "arn:aws:sts::123456789012:assumed-role/AWSReservedSSO_ProjectA_Admin_hoge/ProjectA_Admin",
        "accountId": "123456789012",
        "accessKeyId": "ASIA47CRV7MV3YBLGYLG",
        "sessionContext": {
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AROA47CRV7MVRG2GRX5WL",
                "arn": "arn:aws:iam::123456789012:role/aws-reserved/sso.amazonaws.com/ap-northeast-1/AWSReservedSSO_ProjectA_Admin_hoge",
                "accountId": "123456789012",
                "userName": "AWSReservedSSO_ProjectA_Admin_hoge"
            },
            "attributes": {
                "creationDate": "2025-02-16T08:23:05Z",
                "mfaAuthenticated": "false"
            }
        }
    },
    "eventTime": "2025-02-16T08:40:12Z",
    "eventSource": "sso-directory.amazonaws.com",
    "eventName": "AddMemberToGroup",
    "awsRegion": "ap-northeast-1",
    "sourceIPAddress": "MASKED_IP",
    "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/MASKED_IP Safari/537.36",
    "errorCode": "AccessDenied",
    "errorMessage": "User: arn:aws:sts::123456789012:assumed-role/AWSReservedSSO_ProjectA_Admin_hoge/ProjectA_Admin is not authorized to perform: sso-directory:AddMemberToGroup because no identity-based policy allows the sso-directory:AddMemberToGroup action",
    "requestParameters": null,
    "responseElements": null,
    "requestID": "65bfdd7a-3857-476b-93d1-41110062e978",
    "eventID": "80607d77-b333-4c34-a176-a159b87158ab",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "123456789012",
    "eventCategory": "Management",
    "tlsDetails": {
        "tlsVersion": "TLSv1.3",
        "cipherSuite": "TLS_AES_128_GCM_SHA256",
        "clientProvidedHostHeader": "up-sso.ap-northeast-1.amazonaws.com"
    },
    "sessionCredentialFromConsole": "true"
}

identitystore

続いて identitystore API の出番です。

マネジメントコンソールからは操作できない

identitystore API は API 経由のみで利用できる API です。

そのため、AWS CLI や SDK からの利用に制限されます。今回は CloudShell での権限付与を想定し、以下の権限としました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "GetAPIs",
            "Effect": "Allow",
            "Action": [
                "sso:Describe*",
                "sso:Get*",
                "sso:List*",
                "sso-directory:Describe*",
                "sso-directory:Get*",
                "sso-directory:List*",
                "sso-directory:SearchGroups",
                "sso-directory:SearchUsers"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Sid": "ManagementAPIs",
            "Effect": "Allow",
            "Action": [
                "identitystore:CreateGroupMembership",
                "identitystore:DeleteGroupMembership"
            ],
            "Resource": [
              "arn:aws:identitystore:::user/*",
              "arn:aws:identitystore::*:identitystore/*",
              "arn:aws:identitystore:::group/c7e48a38-a0b1-708c-4f25-196723932c40",
              "arn:aws:identitystore:::membership/*"
            ]
        },
        {
            "Sid": "CloudShell",
            "Effect": "Allow",
            "Action": [
                "cloudshell:*"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

今回は CloudShell 上で AWS CLI を実行してみます。レスポンスが返ってきていますね。

~ $ aws identitystore create-group-membership \
>   --identity-store-id d-95675a61ac \
>   --group-id c7e48a38-a0b1-708c-4f25-196723932c40 \
>   --member-id '{"UserId":"97c4faa8-7021-70a5-94b7-10d6b465cb83"}'
{
    "MembershipId": "0724ea58-d091-7053-4fa2-5ac99d355899",
    "IdentityStoreId": "d-95675a61ac"
}

マネジメントコンソールでも、割り当てられていることが確認できました。

2025-02-16 at 19.40.59-グループの詳細  IAM Identity Center  ap-northeast-1.png

まとめ

以上、「Identity Center でユーザー追加可能なグループを特定のグループに絞りたい」でした。

API ベースでの操作に絞られるものの、手順さえ整えられれば運用楽に進められそうです。このブログがどなたかの参考になれば幸いです。

クラウド事業本部コンサルティング部のたかくに(@takakuni_)でした!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.