Identity Center でメンバー追加可能なグループを特定のグループに絞りたい
こんにちは!クラウド事業本部コンサルティング部のたかくに(@takakuni_)です。
1 つの Organizations に複数プロジェクトの AWS アカウントがまたがる構成の場合、Identity Center を利用することで、外部の ID プロバイダー(既存で利用している認証基盤)を利用できたり、一元的なアクセス管理が実装できて非常に便利です。
組織規模、AWS アカウント、プロジェクト数が大きくなった場合を考えてみましょう。
この運用の場合、プロジェクトの入退場ごとに Identity Center 管理者グループへの申請が集中します。Identity Center 管理者グループがボトルネックにならないか、少し心配ですね。
そこで、プロジェクト A 管理グループを設け、プロジェクト A の入退場は、プロジェクト A 管理グループが行うような運用を目指したくなります。
sso-directory から始まる API では Resource 句に ARN を指定できない
上記の運用を実装しよう!とすると、まず思いつくのは、次のような IAM ポリシーをプロジェクト管理グループの許可セットにアタッチすることです。
{
"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": "*"で を指定します。
Resouce 句にワイルドカードを指定した AddMemberToGroup
や RemoveMemberFromGroup
は他のグループへの操作権限も付与されてしまうため、要件に満たしていません。どうすれば良いのでしょうか。
identitystore API を利用する
代替案として identitystore API を利用します。identitystore では Resouce 句に ARN を指定できます。 identitystore の CreateGroupMembership, DeleteGroupMembership API でグループへのユーザー追加を担います。
[アクション] テーブルの [リソースタイプ] 列は、各アクションがリソースレベルの許可をサポートしているかどうかを示します。この列に値がない場合は、ポリシーステートメントの Resource 要素で、ポリシーが適用されるすべてのリソース (「*」) を指定する必要があります。列にリソースタイプが含まれる場合、そのアクションを含むステートメントでそのタイプの ARN を指定できます。
やってみた
今回は ProjectA_Admin と ProjectA_Member のユーザー/グループが存在し、ユーザー ProjectA_Member がグループ ProjectA_Member へ参加するために、 ProjectA_Admin に依頼しているケースを想定します。
ワイルドカードの sso-directory
まずは、ワイルドカードで sso-directory
を許可してみます。
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": [
"*"
]
}
]
}
問題なく追加できましたね。
後続の作業のために削除しておきます。
sso-directory
本当にできないのか試してみましょう。ProjectA のグループ ARN を Resouce 句に指定してみます。
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
で怒られていました。
{
"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"
}
マネジメントコンソールでも、割り当てられていることが確認できました。
まとめ
以上、「Identity Center でユーザー追加可能なグループを特定のグループに絞りたい」でした。
API ベースでの操作に絞られるものの、手順さえ整えられれば運用楽に進められそうです。このブログがどなたかの参考になれば幸いです。
クラウド事業本部コンサルティング部のたかくに(@takakuni_)でした!