ルートアクセス管理機能を AWS CLI から使ってメンバーアカウントのルートユーザー認証情報を確認してみた

ルートアクセス管理機能を AWS CLI から使ってメンバーアカウントのルートユーザー認証情報を確認してみた

2025.12.14

いわさです。

先日、AWS Organizations でメンバーアカウントのルートユーザー認証情報を管理できる「ルートアクセス管理機能」を AWS CLI から有効化・無効化をしました。

https://dev.classmethod.jp/articles/aws-cli-root-access/

前回は AWS CLI を使って、管理アカウント上でルートアクセス管理機能が有効かどうか、無効の場合に有効化する方法などを確認しました。
ルートアクセス管理が有効な場合、マネジメントコンソール上から各メンバーアカウントに対して管理アカウントから特権アクションを実行することが出来ます。
この各メンバーアカウントに対するルートユーザー認証情報や特権タスクを実行したいとき、AWS CLI などの API 経由ではどのように実行するのでしょうか。

本日は AWS CLI で各メンバーアカウントのルートユーザー認証情報の取得をまず確認してみましたので、その様子を紹介します。

ルートアクセスが有効化されているとメンバーアカウントのセッションを取得できる

前回の記事の最後のほうで紹介しましたが、特権タスクを実行するためにはルートアクセス管理機能を有効化した上で、管理アカウント上でメンバーアカウントを指定してassume-rootコマンドを実行することで、対象アカウントのルートユーザーの一時認証情報を権限スコープを絞った状態で取得が出来ます。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_root-user-privileged-task.html

まずは、次のようにルートアクセス管理が有効化されている時にセッションを取得してみます。

D9C526C5-41CA-438E-88F2-1D7ACCA84EB7.png

assume-rootコマンドで対象アカウントを指定しつつ、task-policy-arnパラメータで特権タスクのポリシーを指定します。
ポリシーでは以下のいずれかを指定することが出来ます。

  • IAMAuditRootUserCredentials
  • IAMCreateRootUserPassword
  • IAMDeleteRootUserCredentials
  • S3UnlockBucketPolicy
  • SQSUnlockQueuePolicy
% aws sts assume-root --target-principal xxxxxxxxxxx1 --duration-seconds 900 --task-policy-arn arn=arn:aws:iam::aws:policy/root-task/IAMAuditRootUserCredentials
{
    "Credentials": {
        "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "SessionToken": "IQoJb3JpZ2luX2VjEF4aDmFwLW5vcnRoZWFzdC0xIkgwRgIhAPHj/KRjoLqTF9v4WiJYqFyBkBfnCmjBO7yVxnJHCneJAiEA5cg2U4rBXCReP86iO4rz3Ph4xeBKSL7vmbRD264FiSMq8gIIJxAAGgw5NzQyMTc4MDIwOTMiDGCgPYr9eIBGcSi5tirPArDUbuJRwONTtJNnMJg7OlsDRvbwQPA8RswCgFLKYGcbqKcZCNBCtxBSMtE+myvrEvwYpQpfOSlGJB+3UyITgjZsRckLEgai/TLOqoaPkRWsDzOAV7pURSf0fketocirwjnU/rCZaesH2Rs1YR5s5NfsPfcIurcb+iam2Yl+wgciidCx1Naxt6AejPrf02xaTARibGDzcPqiK24bTfXhlnNLy9JVmPXUqIGVS/KiX1xljORZKb38no8N2cMlLVBJuH8DPU2D9qcUQ6V2FF6C9e/JGqX/d3Ychk6UbacO+Bnv4fzSOn6woDlWNVY7+apoJ/+AFNh33eJoaMKfkFAy/gOOppNj6uojaJE1lPWHEIYmdphgjrr6pK6Fr+Ry6fKkzv5f2qE2k9IpPh7iAzUKZi9OX0sox/qRLPNBmkU2c0Ex7ps4oaq/B7p8W9F4pM19MNzL98kGOsMBUepzFaHFGO7w1DvSqT4KuqsaoT3yWiopEGewstRNxKM2LMkZsvulgFor8+aScgvACKcws/nYJ7DWDrugDIOpUwKNuwp5Utqrvar8+lqi64yDPHOww5M82opjCcxLrGgsSlWcpACaxBCkO28wYDb7ZuLvo9ia0FLuobB5l7t72GAd2vzxufU1NGcxMNOqAyM+O7h7U0j50QF2u5YawjzgPPcc42+n7ADkc245OSm4nn0AQxZpZln6/m5fPiBAzNi6ENSl",
        "Expiration": "2025-12-13T22:32:00+00:00"
    }
}

取得出来ましたね。これを使って特権タスクを対象アカウントで実行することが出来ます。
ちなみに、ルートユーザーのセッションではあるのですが、スコープが絞られているのでスコープ外のアクションは実行出来ません。

% aws ec2 describe-instances --region us-west-1

An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation. User: arn:aws:iam::xxxxxxxxxxx1:root is not authorized to perform: ec2:DescribeInstances with an explicit deny in an identity-based policy

そして、そもそも組織でのルートアクセス管理が無効化されている場合はassume-rootの実行に失敗します。

7E6D6149-3B29-4D80-BB75-2DFCE3B75155.png

% aws sts assume-root --target-principal xxxxxxxxxxx6 --duration-seconds 900 --task-policy-arn arn=arn:aws:iam::aws:policy/root-task/IAMAuditRootUserCredentials

An error occurred (AccessDenied) when calling the AssumeRoot operation: Service not enabled for AWS Organizations.

そしてこの操作はメンバーアカウントごとに行う必要があるので、組織のメンバーアカウント全体に対して認証情報を確認したい場合などは、以下などで事前に組織のアカウント一覧を取得し繰り返し処理する必要があります。

% aws organizations list-accounts
{
    "Accounts": [
        {
            "Id": "xxxxxxxxxxx1",
            "Arn": "arn:aws:organizations::123456789012:account/o-8j81brsjuj/xxxxxxxxxxx1",
            "Email": "hoge@example.com",
            "Name": "Account1",
            "Status": "ACTIVE",
            "State": "ACTIVE",
            "JoinedMethod": "CREATED",
            "JoinedTimestamp": "2023-03-28T08:19:58.333000+09:00"
        },

:

        {
            "Id": "xxxxxxxxxxx6",
            "Arn": "arn:aws:organizations::123456789012:account/o-8j81brsjuj/xxxxxxxxxxx6",
            "Email": "hoge@example.com",
            "Name": "Account6",
            "Status": "ACTIVE",
            "State": "ACTIVE",
            "JoinedMethod": "CREATED",
            "JoinedTimestamp": "2025-06-18T08:06:07.495000+09:00"
        },
    ]
}

一括でステータスや情報の取得は出来ないので注意しましょう。

セッションは許可されたスコープでのみ可能

また、ルートアクセス管理は、有効化に加えてサブ機能ごとに有効・無効の概念があります。
具体的にはルート認証情報の管理を行えるようにするのに加えて、特権ルートアクションの実行も許可するかどうかです。

例えば以下の場合であれば、ルート認証情報の管理は行うことは出来るのですが、メンバーアカウントでの特権ルートアクションの実行までは行うことは出来ません。

315CB8E4-1F29-47D5-8126-BB76BF56ECD5.png

先程assume-rootでセッションを取得する際にマネージドポリシーを指定することでスコープを制限していたと思いますが、その指定スコープが許可されていないポリシーだった場合は次のようなエラーメッセージが表示されます。

% aws sts assume-root --target-principal xxxxxxxxxxx6 --duration-seconds 900 --task-policy-arn arn=arn:aws:iam::aws:policy/root-task/S3UnlockBucketPolicy

An error occurred (AccessDenied) when calling the AssumeRoot operation: Root sessions feature is not enabled for your AWS Organization.

S3UnlockBucketPolicyは許可されていないのでエラーになりましたね。一方でIAMAuditRootUserCredentialsについては許可されているので取得できます。

% aws sts assume-root --target-principal xxxxxxxxxxx6 --duration-seconds 900 --task-policy-arn arn=arn:aws:iam::aws:policy/root-task/IAMAuditRootUserCredentials
{
    "Credentials": {
        "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "SessionToken": "IQoJb3JpZ2luX2VjEF8aDmFwLW5vcnRoZWFzdC0xIkcwRQIhAMnXGRMcfTc2QEJPcTVpexkbByltW5cCOGboMZ/GKWsZAiAYgQ5sqnnd6VrFCl3MFT2KCtNLzupC9TIl2riFjxj7oyryAggoEAAaDDkyMDIzMzc3MzkzNiIM7fNtj1E99F09RU5nKs8CpMS6bPpPnQI2Dg3ezzMpwG2BEvCI9lQmiA43P4UtDHu8i0wGd32/DwHIcneoBog4qDDSuRuKgFEzRWIylbsf/CTSJJSVs/Mujds5JWp1j8w882Zigoi+M/BvMXvfk9NtpsU0HmRs2PkamINnnG8b1JZtBvgdbGba6EDR1Uqd74HgP23Xq8aPk12wyWWxADtGbiZbN5NfVt1oWcZyFNPmXBtMPJYdZ4a51+TTjeUcD3bCba9X6BUllBT1Gj+biw2DgGmgm6dSxMaBuZyG8mnl0/M/jrfAgfybX14qUykuFDCoHFEk0RdSLe/VN9UJx1hSwQqGAoCClwJh9Ie5BNPbxpJYWCSJNmKu5pJgWMlGnUbpBGJKrClJyw87VjmC3WnHAU0dkJKU9VAOnJuQRfjZli/XxGYQKDN+pocnN14D/aT9voXM2Mq66J/Isoi8FPIwttf3yQY6xAGwKfkoE3xoSoIlavkwWHzRqAH4v5zPFVFKTYXqJc8z1yyV42LvwQ/HOZ8/HpJ35gSbHQOVnELGvs7ISoZ0hXHyuQ2rOvDkM19cW56f32eukNJpjaO6vwIVJOym20PbhXrOvzTOZcGrmhZg31lQXsfNwUUMD1fFEq0p4zZfUzXwQvssncAnHwJxAETlX7zNBNG1+EKJHhiYrB5CYKJNbMdHkE3gD0swHbOc0v41vbZctlTliLK3dCFFj5/K18JvPXwmAK6T",
        "Expiration": "2025-12-13T22:56:58+00:00"
    }
}

セッションを使う

ということで一時セッションを取得する方法がわかったので、それを使って今回はメンバーアカウントのルートユーザー認証情報の状態を確認してみましょう。
取得したセッション情報は今回は環境変数に設定して使います。

export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
export AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEF4aDmFwLW5vcnRoZWFzdC0xIkgwRgIhAPHj/KRjoLqTF9v4WiJYqFyBkBfnCmjBO7yVxnJHCneJAiEA5cg2U4rBXCReP86iO4rz3Ph4xeBKSL7vmbRD264FiSMq8gIIJxAAGgw5NzQyMTc4MDIwOTMiDGCgPYr9eIBGcSi5tirPArDUbuJRwONTtJNnMJg7OlsDRvbwQPA8RswCgFLKYGcbqKcZCNBCtxBSMtE+myvrEvwYpQpfOSlGJB+3UyITgjZsRckLEgai/TLOqoaPkRWsDzOAV7pURSf0fketocirwjnU/rCZaesH2Rs1YR5s5NfsPfcIurcb+iam2Yl+wgciidCx1Naxt6AejPrf02xaTARibGDzcPqiK24bTfXhlnNLy9JVmPXUqIGVS/KiX1xljORZKb38no8N2cMlLVBJuH8DPU2D9qcUQ6V2FF6C9e/JGqX/d3Ychk6UbacO+Bnv4fzSOn6woDlWNVY7+apoJ/+AFNh33eJoaMKfkFAy/gOOppNj6uojaJE1lPWHEIYmdphgjrr6pK6Fr+Ry6fKkzv5f2qE2k9IpPh7iAzUKZi9OX0sox/qRLPNBmkU2c0Ex7ps4oaq/B7p8W9F4pM19MNzL98kGOsMBUepzFaHFGO7w1DvSqT4KuqsaoT3yWiopEGewstRNxKM2LMkZsvulgFor8+aScgvACKcws/nYJ7DWDrugDIOpUwKNuwp5Utqrvar8+lqi64yDPHOww5M82opjCcxLrGgsSlWcpACaxBCkO28wYDb7ZuLvo9ia0FLuobB5l7t72GAd2vzxufU1NGcxMNOqAyM+O7h7U0j50QF2u5YawjzgPPcc42+n7ADkc245OSm4nn0AQxZpZln6/m5fPiBAzNi6ENSl

最近 1Password CLI をシェル統合した関係で上記の環境変数が効かなくなったのですが、のんピ先生が紹介する無効化コマンド(alias aws=aws)でなんとかなりました。ありがとうございます。

https://dev.classmethod.jp/articles/1password-shell-plugins-aws-cli-cdk/

ルートユーザー認証情報が存在する場合

次のようにルートユーザー認証情報が存在するアカウントで試してみます。

8EA33906-FA71-4E72-A6B5-68A1FF83A14B.png

このアカウントのルートユーザーには事前に次のようにログインできるようにしておいて、MFA やらアクセスキーやらを割り当てしておきました。

5BDA2039-8955-4B56-B374-E28F343A8A8D.png

まずはルートユーザーの情報を確認してみます。
iam get-userコマンドを使う時にユーザー名を指定しなければ対象セッション(つまりこの場合だとルートユーザー)の情報が取得されます。

https://docs.aws.amazon.com/cli/latest/reference/iam/get-user.html

% aws iam get-user
{
    "User": {
        "UserId": "xxxxxxxxxxx1",
        "Arn": "arn:aws:iam::xxxxxxxxxxx1:root",
        "CreateDate": "2023-03-27T23:19:57+00:00",
        "PasswordLastUsed": "2025-12-13T22:11:47+00:00"
    }
}

情報が確認出来ましたね。
ログインプロファイルについてはget-login-profileコマンドで取得します。認証情報が存在しない場合はこのコマンドの挙動が変わるので覚えておいてください。あとで確認します。

https://docs.aws.amazon.com/cli/latest/reference/iam/get-login-profile.html

% aws iam get-login-profile
{
    "LoginProfile": {
        "CreateDate": "2023-03-27T23:19:57+00:00",
        "PasswordResetRequired": false
    }
}

アクセスキーや証明書についてはlist-access-keyslist-signing-certificatesで確認できます。

https://docs.aws.amazon.com/cli/latest/reference/iam/list-access-keys.html

https://docs.aws.amazon.com/cli/latest/reference/iam/list-signing-certificates.html

% aws iam list-access-keys
{
    "AccessKeyMetadata": [
        {
            "AccessKeyId": "AKIA6FU7H6FWXAD6YL54",
            "Status": "Active",
            "CreateDate": "2025-12-13T22:14:40+00:00"
        }
    ]
}
% aws iam list-signing-certificates
{
    "Certificates": [
        {
            "CertificateId": "4NBBG66JO4AIOZQHZEWB3MQ2X67UYVNY",
            "CertificateBody": "-----BEGIN CERTIFICATE-----\nMIIDlDCCAnygAwIBAgIgH+7i8HppwSNJ4f7uYIuXkDVX8QeXz1pm1ye7sTHyONgw\nDQYJKoZIhvcNAQELBQAwUzEhMB8GA1UEAwwYQVdTIExpbWl0ZWQtQXNzdXJhbmNl\nIENBMQwwCgYDVQQLDANBV1MxEzARBgNVBAoMCkFtYXpvbi5jb20xCzAJBgNVBAYT\nAlVTMB4XDTI1MTIxMzIyMjcwMloXDTI2MTIxMzIyMjcwMlowTjELMAkGA1UEBhMC\nVVMxEzARBgNVBAoMCkFtYXpvbi5jb20xEjAQBgNVBAsMCUFXUy1Vc2VyczEWMBQG\nA1UEAwwNMWpjZ3NueTZtODdzYTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBALtYtzpeLr9z1ZcHjl2UsBSXtaNy64dnUo7scSKK6WA59L2HXSOpNpgwYxFW\nr8036JdYkzGOxjaRKZGXnrquBAsKDnliRLg+x0Y2b5oGduAfCg62w5yBEE2ZKAIg\n7bVNjPBE2WZHkydTcMXCFH0zkoghvx406y/WjUz/v5NCabIdYmUCGDH3MymK1Lol\nVIasnU/1S4b3E9QV+jlbASEzxi+fRYob/2cFvm5622VJMEjv27q6Y4Qrm/WAHVH3\nttGm/zjAor8jhYagQkFakt1Ux4bkZYjJTWX9cBxJKwBO6FttxhG6f6mHo8fG3tUR\ngCwEEknKnu5Y68YBli+JVrU+dgkCAwEAAaNZMFcwDgYDVR0PAQH/BAQDAgWgMBYG\nA1UdJQEB/wQMMAoGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHwYDVR0OBBgwFoAU\n2C4VTlzoUFYHe1Jt6ZLGi7r97bUwDQYJKoZIhvcNAQELBQADggEBAAy8aaWzVHXY\n0dRjThkEco0gvM2TUWm6CbI5o9W3SaZBODqSNMWvk0GghD+lwRMP6BVCm6VOFIWn\nLyK36tOV3l8w/EaGjdxX+tmwjYqFpVlPOK9awnpBy7ji+DDJOiyt/mpj1k08X1hS\nO/5rzfhxX1d542NezspZfCNuP2b4lL7RGJH5JIb2/OGWLGlzxc7o0jQD698x1nDc\n4doBw0MYT7reZM4pHwV/+jrK02C+igdoAJtfLzmDZ8gPuULhBSinyvQMC1jQXp0I\n+Pok3CDonLUwg0UhuvOm46ZisfCXGcO5j8cjaCljJJLlE3gtUIjpGdR+9/WiAHXF\n+T7RSEm7LpY=\n-----END CERTIFICATE-----\n",
            "Status": "Active",
            "UploadDate": "2025-12-13T22:27:02+00:00"
        }
    ]
}

MFA デバイスの有無についてはlist-mfa-devicesです。

https://docs.aws.amazon.com/cli/latest/reference/iam/list-mfa-devices.html

% aws iam list-mfa-devices                      
{
    "MFADevices": [
        {
            "SerialNumber": "arn:aws:iam::xxxxxxxxxxx1:mfa/Authapp",
            "EnableDate": "2025-12-13T22:14:07+00:00"
        }
    ]
}

ここまでのコマンドを使えば、管理アカウントからメンバーアカウントのルートユーザーのログイン認証情報や MFA、アクセスキーや証明書の有無が確認できるでしょう。

ルートユーザー認証情報が存在しない場合

先程の確認結果はルートユーザー認証情報が存在する場合です。
次のようにルートユーザー認証情報が存在しない場合はこれらのコマンドはどういう結果になるのでしょうか。

94126949-2F5B-47E7-B7BC-D034DC929B2F.png

まずは一時認証情報が取得できるのか試してみます。

% aws sts assume-root --target-principal xxxxxxxxxxx6 --duration-seconds 900 --task-policy-arn arn=arn:aws:iam::aws:policy/root-task/IAMAuditRootUserCredentials
{
    "Credentials": {
        "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "SessionToken": "IQoJb3JpZ2luX2VjEF4aDmFwLW5vcnRoZWFzdC0xIkgwRgIhAKOcxp+fYQfHiRzaRkcsGYkB/RoSApdFnvsntIRj2B3pAiEA7Vx8AT44txIekmTRVw5rg50ZVEMlKZZ8ss1I0HHJ2H8q8gIIKBAAGgw5MjAyMzM3NzM5MzYiDP2eRKmaXdnqGPGOuSrPAtedMFqoFLpOdetwrXmZf1sHzCx3pLNBjAievfJgoBf/DLz/XmJ3LOovITXop+mKAgDuQKOLF1qYNd2tIgkSeXpEDdoPbsWFiHyUG4pThS49TdsbXuokuLJSQkfO7Krj7+JNUi0boFVEr9emtYA7RK2dAHhvDM+2MeO6fMlJ9bi5RYoQh7lAMxnpLUFbJgbRw0oy2zOWRzqjFZ1prgga+hILjKBNwRIY0cV7DqYVhR4XEGwRBPOhsXgWT1v+edzAdJZ0vSe9LwBaeyJxZeVfyG1CEkC+clmksIb+HN1EBkoUBNqyYRTPRSDGrnvKNGqlGd0/ieDUmbcpG4RAZmuS4THOWL2ESTQEHwAr84VSVF9mq2MAh6xUT7hKFTDjsYDPAaqlP/QmmECkUN9rmiYCD0GQAfbD+9JczU1KkKhLay6d39US4BvR1U9FRPXMhcRrMMnT98kGOsMBvdYVrl/tn6D3Jwcv3FUkj5nHUL28P5Mx+nMmblP9JgkCIbBRdSo13gpbk+jmJQRM5ZZENxGj5ti1TWO07v6B1M954+j/Af+7wjXxeDv6669P7mXFaCt8SdxIIC2z5zLTEFEOWzfWBj2LptQGcxIfsR0M1F2RNc0+3PnY2n6JY8PxaYwXYY1eNK8vOKSPxwXIM9ubcBKd7fzMOxuBopJXIHb4NlDYMZ273hwIFFUUjNFsxZUuq27hK2eydIeytybu54lQ",
        "Expiration": "2025-12-13T22:48:45+00:00"
    }
}

これは取得できました。
ではこの情報を使ってメンバーアカウントのget-userを試してみましょう。これは失敗するか...?

% aws iam get-user
{
    "User": {
        "UserId": "xxxxxxxxxxx6",
        "Arn": "arn:aws:iam::xxxxxxxxxxx6:root",
        "CreateDate": "2025-06-17T23:06:06+00:00",
        "PasswordLastUsed": "2025-06-18T02:05:10+00:00"
    }
}

成功しました。ほう。
ではget-login-profileはどうでしょうか。

% aws iam get-login-profile

An error occurred (NoSuchEntity) when calling the GetLoginProfile operation: Login Profile for User null cannot be found.

おお、こちらは失敗しましたね。なるほど。
ルートユーザー認証情報が存在しない場合も、ルートユーザーが存在しないわけではなく、あくまでも認証情報が存在しない。という感じですね。

ちなみに、証明書やアクセスキーもこの状態で確認したところ次のように存在していませんでした。

% aws iam list-access-keys
{
    "AccessKeyMetadata": []
}
% aws iam list-mfa-devices
{
    "MFADevices": []
}
% aws iam list-signing-certificates
{
    "Certificates": []
}

さいごに

本日はルートアクセス管理機能を AWS CLI から使って、メンバーアカウントのルートユーザー認証情報を確認してみました。

ルートアクセス管理機能を通して管理アカウントからメンバーアカウントのルートユーザー情報を参照する流れが理解できました。
ルートユーザー認証情報が削除されている時にget-login-profile実行時NoSuchEntityが発生するあたりは興味深い挙動です。

この記事をシェアする

FacebookHatena blogX

関連記事