🏢

AWS IAM Identity CenterでAWSアカウントにサインインできるようにしてみた

に公開

AWS IAM Identity Centerの概要

AWS IAM Identity Center(旧・AWS Single Sign-On)とはAWSアカウントやアプリケーションにサインインするための認証・認可基盤です。
AWS IAM Identity Centerを使用すると、AWSマネジメントコンソールやAmazon Q Developer、SlackなどにSSOできるようになります。

AWS IAM Identity CenterでAWSアカウントにサインインできるようにしてみた

AWS IAMセキュリティベストプラクティスによると、ユーザがAWSにアクセスする際は長期的な認証情報を持つAWS IAMユーザではなく、一時的な認証情報を持つフェデレーションユーザの使用が推奨されています。
そこで、今回はAWS IAMユーザでサインインしていた私用AWS環境にAWS IAM Identity Centerを利用してサインインできるようにしていきます。
設定の流れは以下の通りです。

  • Step 1. AWS Organizationsの組織を作成
  • Step 2. AWS IAM Identity Centerを有効化
  • Step 3. ユーザ・グループを作成
  • Step 4. 許可セットを作成
  • Step 5. AWSアカウントにサインイン

Step 1. AWS Organizationsの組織を作成

単一のAWSアカウントでアプリケーションにSSOしたいだけならAWS Organizationsは不要ですが、今後複数のAWSアカウントを作成してSSOする予定があるため、AWS Organizationsの組織を作成します。

aws organizations create-organization --feature-set ALL
実行結果
{
    "Organization": {
        "Id": "<ORGANIZATION_ID>",
        "Arn": "arn:aws:organizations::<AWS_ACCOUNT_ID>:organization/<ORGANIZATION_ID>",
        "FeatureSet": "ALL",
        "MasterAccountArn": "arn:aws:organizations::<AWS_ACCOUNT_ID>:account/<ORGANIZATION_ID>/<AWS_ACCOUNT_ID>",
        "MasterAccountId": "<AWS_ACCOUNT_ID>",
        "MasterAccountEmail": "<EMAIL_ADDRESS>",
        "AvailablePolicyTypes": [
            {
                "Type": "SERVICE_CONTROL_POLICY",
                "Status": "ENABLED"
            }
        ]
    }
}

上記の操作により、このAWSアカウントが組織の管理アカウントとなります。
--feature-setオプション[1]の値はCONSOLIDATED_BILLING一括請求機能のみ有効化)またはALL(全機能を有効化)から選択できますが、今回はAWS IAM Identity Centerを利用するのでALL一択です。
管理アカウントのルートユーザ宛てに以下のようなメールが届いた場合は、指示通りリンクをクリックしてメールアドレスを検証します。

Step 2. AWS IAM Identity Centerを有効化

AWS Organizationsの設定が完了したので、AWS IAM Identity Centerの準備を開始します。
AWS IAM Identity CenterはAWS CLIで有効化できないので、管理アカウントのAWS IAMユーザでAWSマネジメントコンソールにサインインして実行します。
まず、AWS IAM Identity Centerの画面でお好みのリージョン[2]になっていることを確認し、「有効にする」を押下します。

次の画面でも「有効にする」を押下します。

Step 3. ユーザ・グループを作成

今回は外部のIdPとは連携せず、AWS IAM Identity Centerの既定のディレクトリを使用します。
AWS IAM Identity Centerを有効化するとインスタンスが作成されます。
ユーザを作成するためにはインスタンスのアイデンティティストアのIDが必要なので、あらかじめ取得しておきます。

aws sso-admin list-instances
実行結果
{
    "Instances": [
        {
            "InstanceArn": "arn:aws:sso:::instance/<INSTANCE_ID>",
            "IdentityStoreId": "<IDENTITY_STORE_ID>",
            "OwnerAccountId": "<AWS_ACCOUNT_ID>",
            "CreatedDate": "2025-10-27T20:16:52.291000+09:00",
            "Status": "ACTIVE"
        }
    ]
}

IdentityStoreIdフィールドの値を指定してSSOに使用するユーザadminを作成します。

aws identitystore create-user --identity-store-id <IDENTITY_STORE_ID> --user-name admin --name FamilyName=admin,GivenName=admin --display-name admin --emails Value=<EMAIL_ADDRESS>
実行結果
{
    "UserId": "<USER_ID>",
    "IdentityStoreId": "<IDENTITY_STORE_ID>"
}

ユーザを作成する際、--user-nameオプションでAdministratorAWSAdministratorsは指定できないので注意しましょう。
また、AWS CLIのリファレンスでは明示されていませんが、上記で指定した--emails以外のオプションは全て必須です。
--emailsオプションはパスワードリセット時に必要になるので設定しておきます。
次に、グループadminsを作成します。

aws identitystore create-group --identity-store-id <IDENTITY_STORE_ID> --display-name admins
実行結果
{
    "GroupId": "<GROUP_ID>",
    "IdentityStoreId": "<IDENTITY_STORE_ID>"
}

グループを作成する際も、--display-nameオプションでAdministratorAWSAdministratorsは指定できないので注意しましょう。
最後に、ユーザadminをグループadminsに所属させます。
ユーザ作成時の実行結果に含まれるUserIdとグループ作成時の実行結果に含まれるGroupIdを指定します。

aws identitystore create-group-membership --identity-store-id <IDENTITY_STORE_ID> --group-id <GROUP_ID> --member-id UserId=<USER_ID>
実行結果
{
    "MembershipId": "<MEMBERSHIP_ID>",
    "IdentityStoreId": "<IDENTITY_STORE_ID>"
}

Step 4. 許可セットを作成

ユーザ・グループに付与する権限を許可セットとして定義します。
その際に必要なインスタンスのARNはaws sso-admin list-instancesの実行結果にあります。

aws sso-admin create-permission-set --instance-arn arn:aws:sso:::instance/<INSTANCE_ID> --name admin-permission-set --session-duration PT12H
実行結果
{
    "PermissionSet": {
        "Name": "admin-permission-set",
        "PermissionSetArn": "arn:aws:sso:::permissionSet/<INSTANCE_ID>/<PERMISSION_SET_ID>",
        "CreatedDate": "2025-10-27T20:30:51.811000+09:00",
        "SessionDuration": "PT12H"
    }
}

許可セットを作成する際、--session-durationオプションでAWSアカウントへのサインインセッションの保持期間を1時間〜12時間の間で指定できます。
既定の1時間では短過ぎるので、今回は最長の12時間を指定しました。
次に、実行結果から許可セットのARNをコピーした上で、許可セットにAdministratorAccessポリシーをアタッチします。

aws sso-admin attach-managed-policy-to-permission-set --instance-arn arn:aws:sso:::instance/<INSTANCE_ID> --permission-set-arn arn:aws:sso:::permissionSet/<INSTANCE_ID>/<PERMISSION_SET_ID> --managed-policy-arn arn:aws:iam::aws:policy/AdministratorAccess
実行結果

何も表示されなければ成功です。
最後に、adminsグループに所属するユーザが管理アカウントを上記の許可セットの権限で操作できるよう設定します。

aws sso-admin create-account-assignment --instance-arn arn:aws:sso:::instance/<INSTANCE_ID> --target-id <AWS_ACCOUNT_ID> --target-type AWS_ACCOUNT --permission-set-arn arn:aws:sso:::permissionSet/<INSTANCE_ID>/<PERMISSION_SET_ID> --principal-type GROUP --principal-id <GROUP_ID>
実行結果
{
    "AccountAssignmentCreationStatus": {
        "Status": "IN_PROGRESS",
        "RequestId": "<REQUEST_ID>",
        "TargetId": "<AWS_ACCOUNT_ID>",
        "TargetType": "AWS_ACCOUNT",
        "PermissionSetArn": "arn:aws:sso:::permissionSet/<INSTANCE_ID>/<PERMISSION_SET_ID>",
        "PrincipalType": "GROUP",
        "PrincipalId": "<GROUP_ID>"
    }
}

設定が成功したかどうかは上記のRequestIdフィールドの値を指定してaws sso-admin describe-account-assignment-creation-statusコマンドを実行することで分かります。

aws sso-admin describe-account-assignment-creation-status --instance-arn arn:aws:sso:::instance/<INSTANCE_ID> --account-assignment-creation-request-id <REQUEST_ID>
実行結果
{
    "AccountAssignmentCreationStatus": {
        "Status": "SUCCEEDED",
        "RequestId": "<REQUEST_ID>",
        "TargetId": "<AWS_ACCOUNT_ID>",
        "TargetType": "AWS_ACCOUNT",
        "PermissionSetArn": "arn:aws:sso:::permissionSet/<INSTANCE_ID>/<PERMISSION_SET_ID>",
        "PrincipalType": "GROUP",
        "PrincipalId": "<GROUP_ID>",
        "CreatedDate": "2025-10-27T20:36:40.065000+09:00"
    }
}

StatusフィールドがSUCCEEDEDになっているので、設定は成功です。

Step 5. AWSアカウントにサインイン

AWS IAM Identity Centerを使用してAWSアカウントにサインインする場合、AWSアクセスポータル(URL:https://<IDENTITY_STORE_ID>.awsapps.com/start)にアクセスします。

ユーザ名adminを入力して「次へ」を押下すると、パスワードの入力画面に遷移します。
今回はAWS CLIでユーザを作成しており、初期パスワードを設定していないため、「パスワードを忘れた場合」を押下して指示に従います。

パスワードとMFAを設定したら以下の画面に遷移します。

許可セット名を押下すると、AWSマネジメントコンソールに遷移します。
ちなみに、AWSアクセスポータルへのサインインセッション(ユーザーインタラクティブセッション)の保持期間はAWSマネジメントコンソール上で変更できます。[3]
既定は8時間で、15分から90日の間で設定可能です。

次に、AWS CLIもAWS IAM Identity Center経由で認証できるように設定していきます。
aws configure ssoコマンドを実行し、任意のセッション名・AWSアクセスポータルのURL・AWS IAM Identity Centerのリージョン・アクセススコープ[4]を入力します。
今回はAWS IAM Identity Center経由でAWSマネージドアプリケーションを使用する予定はないので、最低限必要sso:account:accessというスコープのみ指定します。

aws configure sso
実行結果
SSO session name (Recommended): test
SSO start URL [None]: https://<IDENTITY_STORE_ID>.awsapps.com/start/
SSO region [None]: ap-northeast-1
SSO registration scopes [sso:account:access]: sso:account:access
Attempting to automatically open the SSO authorization page in your default browser.
If the browser does not open or you wish to use a different device to authorize this request, open the following URL:

https://oidc.ap-northeast-1.amazonaws.com/authorize?response_type=code&client_id=<CLIENT_ID>&redirect_uri=http%3A%2F%2F127.0.0.1%3A54325%2Foauth%2Fcallback&state=<STATE>&code_challenge_method=S256&scopes=sso%3Aaccount%3Aaccess&code_challenge=<CODE_CHALLENGE>
The only AWS account available to you is: <AWS_ACCOUNT_ID>
Using the account ID <AWS_ACCOUNT_ID>
The only role available to you is: admin-permission-set
Using the role name "admin-permission-set"

ブラウザが開くので画面に従って操作します。

「アクセスを許可」を押下すると、AWS CLIでクライアントのリージョン・AWS CLIの実行結果の出力形式・プロファイル名を尋ねられるので入力します。

実行結果
Default client Region [None]: ap-northeast-1
CLI default output format (json if not specified) [None]: json
Profile name [admin-permission-set-test]:
To use this profile, specify the profile name using --profile, as shown:

aws sts get-caller-identity --profile admin-permission-set-test

これでAWS CLIの設定は完了したので、aws sso loginコマンドでサインインしてみましょう。

aws sso login  --profile admin-permission-set-test
実行結果
Attempting to automatically open the SSO authorization page in your default browser.
If the browser does not open or you wish to use a different device to authorize this request, open the following URL:

https://oidc.ap-northeast-1.amazonaws.com/authorize?response_type=code&client_id=<CLIENT_ID>&redirect_uri=http%3A%2F%2F127.0.0.1%3A54761%2Foauth%2Fcallback&state=<STATE>&code_challenge_method=S256&scopes=sso%3Aaccount%3Aaccess&code_challenge=<CODE_CHALLENGE>
Successfully logged into Start URL: https://<IDENTITY_STORE_ID>.awsapps.com/start/

AWSアカウントを操作できるか確認するために、AWS IAM Identity Centerのインスタンス一覧を取得してみましょう。

aws sso-admin list-instances --profile admin-permission-set-test
実行結果
{
    "Instances": [
        {
            "InstanceArn": "arn:aws:sso:::instance/<INSTANCE_ID>",
            "IdentityStoreId": "<IDENTITY_STORE_ID>",
            "OwnerAccountId": "<AWS_ACCOUNT_ID>",
            "CreatedDate": "2025-10-27T20:16:52.291000+09:00",
            "Status": "ACTIVE"
        }
    ]
}

AWS CLIからAWS IAM Identity Center経由で操作できています。

脚注
  1. --feature-setオプションを使用しない場合はALL扱いとなり、AWS Organizationsの全機能が有効化されます。 ↩︎

  2. AWS IAM Identity Centerはリージョンサービスです。AWSアカウントだけでなくAWSマネージドアプリケーションにもSSOする場合、アプリケーションの稼働リージョンでAWS IAM Identity Centerを有効化します。 ↩︎

  3. 「Step 4. 許可セットを作成」にてAWS CLIで設定したサインインセッションの対象はAWSアカウント、ここで設定したサインインセッションの対象はAWSアクセスポータルです。 ↩︎

  4. アクセススコープとして指定可能な値の一覧はこちらをご参照ください:https://docs.aws.amazon.com/singlesignon/latest/userguide/customermanagedapps-saml2-oauth2.html ↩︎

Discussion