AWS Managed Microsoft ADの認証情報を使ってAWSマネジメントコンソールにログインしてみた

IAMユーザーの管理を極力したくない時に使えるかも
2022.08.17

ADの認証情報を使ってAWSマネジメントコンソールにログインしたい

こんにちは、のんピ(@non____97)です。

皆さんはADの認証情報を使ってAWSマネジメントコンソールにログインしたいなと思ったことはありますか? 私はあります。

AWS IAM Identity Center(旧AWS SSO)のIDソースをADの認証情報とすることで、ADの認証情報を使ってAWSマネジメントコンソールにログインが可能です。

しかし、AWS IAM Identity Centerを利用できない場面もあると思います。

何となくAWS公式ドキュメントを漁ってみると、AWS IAM Identity Centerを使わずに、ADの認証情報でAWSマネジメントコンソールにログインできると紹介しているページがありました。

早速試したみたので、紹介します。

AD Connector編は以下記事をご参照ください。

いきなりまとめ

  • AWS IAM Identity Centerを使わずに、AWS Managed Microsoft ADの認証情報でAWSマネジメントコンソールにログインできる
  • AWS IAM Identity Centerを使わずに、AWS Managed Microsoft ADの認証情報でAWSマネジメントコンソールにログインする場合はアクセスURLを作成する必要がある
  • ログインできるドメインユーザーはユーザー単位もしくはグループ単位で指定する
  • 操作できる権限はIAMロールで指定する
  • IAMロールの信頼関係でプリンシパルとしてds.amazonaws.comを指定する必要がある
  • AWS Managed Microsoft ADはリージョナルサービスなので、可用性を向上させる場合にはマルチリージョンレプリケーションを行う
  • 個人的には「AWS IAM Identity Centerが使用できない」 & 「既存のADの認証情報を使ってログインできないと困る」という要件が出てきた時に使うかなという印象

検証の環境

検証の環境は以下の通りです。

構成図

Managed Microsoft ADの認証情報を使ってIAMポリシーAmazonEC2ReadOnlyAccessをアタッチしたIAMロールにAssume Roleし、AWSマネジメントコンソールにログインできるか確認します。

検証環境の構築

検証環境はAWS CDKでデプロイします。

利用したコードは以下リポジトリに保存しています。

ADの認証情報でAWSマネジメントコンソールにログインするにはアクセスURLの作成が必要です。

ディレクトリメンバーにコンソールへのアクセス権限を付与する際には、ディレクトリにアクセス するための URL を設定しておく必要があります。ディレクトリの詳細表示およびアクセス URL の取得に関する詳細は、「ディレクトリ情報の表示」を参照してください。アクセス URL 作成方法の詳細については、「アクセス URL の作成」を参照してください。

今回はアクセスURLの作成もCloudFormationで行いました。Managed Microsoft ADのパラメーターcreateAliastrueを指定します。

./lib/managed-msad-stack.ts

    const managedMSAD = new directoryservice.CfnMicrosoftAD(
      this,
      "Managed Microsoft AD",
      {
        name: domainName,
        password: new CfnDynamicReference(
          CfnDynamicReferenceService.SECRETS_MANAGER,
          `${managedMSADSecret.secretArn}:SecretString:password`
        ).toString(),
        vpcSettings: {
          subnetIds: vpc.selectSubnets({
            subnetType: ec2.SubnetType.PRIVATE_ISOLATED,
          }).subnetIds,
          vpcId: vpc.vpcId,
        },
        createAlias: true,
        edition: "Standard",
        enableSso: false,
      }
    );

CloudFormationでアクセスURLを作成する場合は、スタック名-Managed MSADの名前-ランダムな文字列となります。任意の文字列をアクセスURLにする場合は、Managed Microsoft ADデプロイ後にコンソールから作成してください。

AWSマネジメントコンソールへのアクセスできるように設定

以下AWS公式ドキュメントを参考に、Managed Microsoft ADの認証情報を使ってAWSマネジメントコンソールにログインできるように設定していきます。

まず、作成されたManaged Microsoft ADにアクセスして、アクセスURLが作成されていることを確認します。

アクセスURLの確認

下にスクロールすると、AWSマネジメントコンソールという項目が表示されます。コンソールアクセスへ委任できるIAMロールが表示されていますね。

AWSマネジメントコンソールの設定

Managed Microsoft ADの認証情報を使ってAWSマネジメントコンソールにログインできるようにアクション-有効化をクリックします。

有効化

有効化が正常にできるとステータスが有効になります。次に、Managed Microsoft AD内のドメインユーザーがIAMロールにAssumeRoleしてマネジメントコンソールにログインできるようにします。表示されているIAMロールをクリックします。

有効化されたことを確認

追加をクリックします。

追加

Adminで検索して、ドメインのAdminユーザーを選択し追加をクリックします。

Adminユーザーの追加

ドメインのAdminユーザーが追加されたことを確認します。

ユーザー追加の確認

それではManaged Microsoft ADの認証情報を使ってマネジメントコンソールにログインします。

`https://アクセスURL/console/`(今回の場合は`https://managedmsadstack-managedmicrosoftad-rtletr8o8whr.awsapps.com/console/`)にアクセスします。すると以下のようにログイン画面が表示されます。

ログイン画面の確認

ドメインのAdminユーザーの認証情報を入力してサインインをクリックすると、マネジメントコンソールにログインできました。

ログインできることを確認

S3のコンソールを確認すると、権限不足でバケット一覧は確認できませんでした。

S3のコンソール確認

EC2のコンソールを確認すると、こちらはIAMロールでIAMポリシーAmazonEC2ReadOnlyAccessを指定しているので、各種情報を確認できました。

EC2のコンソール確認

CloudTrailでログイン時に発行されたAPIを確認すると、AssumedRoleConsoleLoginが記録されていました。

  • AssumeRole
    {
        "eventVersion": "1.08",
        "userIdentity": {
            "type": "AWSService",
            "invokedBy": "ds.amazonaws.com"
        },
        "eventTime": "2022-08-17T04:44:16Z",
        "eventSource": "sts.amazonaws.com",
        "eventName": "AssumeRole",
        "awsRegion": "us-east-1",
        "sourceIPAddress": "ds.amazonaws.com",
        "userAgent": "ds.amazonaws.com",
        "requestParameters": {
            "roleArn": "arn:aws:iam::<AWSアカウントID>:role/ManagedMsadStack-AWSmanagementconsoleloginIAMRoleE-1CRB6P8P6DL6G",
            "roleSessionName": "Admin",
            "externalId": "<AWSアカウントID>"
        },
        "responseElements": {
            "credentials": {
                "accessKeyId": "ASIA6KUFAVPU2APONTSQ",
                "sessionToken": "IQoJb3JpZ2luX2VjEH0aCXVzLWVhc3QtMSJIMEYCIQDhL6ctbZp5ICugaAFgxW2Vt2o0PYjK/vnoMaPdOiBGowIhAPU4iHO0Ly6BTcxts7iF0WV+5JSoh0K11Tp8qvWzJamDKskCCOb//////////wEQAhoMOTg0OTAwMjE3ODMzIgzJMyjNTyf1BOqsTzAqnQJ2OMIuLc4E2SdnStcydx3Q7uJrTNacdHIQ3kvGv2eVpLGCCSU4EeU9xjQEqw3Z5yGRNWfsMGLqCMILUpp+iAGNBLgNQ8yqxaObRHAkQofN1ZHxDqO9eo9GC1QOITICUygWRzRLysFsiieAjI9/wnWs8fmyYHGFVXh+AEGeCjiAW/H7rJW7mDURhDS8ZdT3hwM2b8r2goKMB5TbkT4lzrnPxZeokjmzkZ0UnRa5ThiEGh+asRJsWtxxJs7K+kg0pePjF3a18Pb8izmctw0ckiNs8Yn2Nd4ZzKuod0/mJ14xJGkF4UicMo6jOXsTjXBGfAJFxiTVqyzmagokiOMlt55uPHon2HHf/j+TW9DojzKRgdUeJu8FnunstkKG22YwoOTxlwY6vgEIm37U8paTG2XRGZ4l6Hh3ytqadnTS8pnaMAvXg62qfbZQlEpzZjv/SLUwPO0KItvYIPk33GA2/pICIBznlGfUPdkJYoLU3L3MjSBtBaG4T62nr7qjDLiEa2YYXzC+UgBsqgxZLtJmxuNUrpUwobex0EqO1/d4nbhPkQklpaEnWFUw5wXbhaMa4mCqb0K2P+6W3ZqplU3usf/9Rw3Za3rYZAKNBbPQDBccRLySP7wcilMEb45NCXpZfUzOLMgC",
                "expiration": "Aug 17, 2022, 5:44:16 AM"
            },
            "assumedRoleUser": {
                "assumedRoleId": "AROA6KUFAVPU2KCBLNW4E:Admin",
                "arn": "arn:aws:sts::<AWSアカウントID>:assumed-role/ManagedMsadStack-AWSmanagementconsoleloginIAMRoleE-1CRB6P8P6DL6G/Admin"
            }
        },
        "requestID": "8d9830d0-e9dd-491d-a5e4-43fa1623bba1",
        "eventID": "53b24437-583c-4e2b-9afa-24c73f6cb69a",
        "readOnly": false,
        "resources": [
            {
                "accountId": "<AWSアカウントID>",
                "type": "AWS::IAM::Role",
                "ARN": "arn:aws:iam::<AWSアカウントID>:role/ManagedMsadStack-AWSmanagementconsoleloginIAMRoleE-1CRB6P8P6DL6G"
            }
        ],
        "eventType": "AwsApiCall",
        "managementEvent": true,
        "recipientAccountId": "<AWSアカウントID>",
        "sharedEventID": "79009513-4c40-4249-a311-14e890acce43",
        "eventCategory": "Management"
    }
  • ConsoleLogin
    {
      "eventVersion": "1.08",
      "userIdentity": {
          "type": "AssumedRole",
          "principalId": "AROA6KUFAVPU2KCBLNW4E:Admin",
          "arn": "arn:aws:sts::<AWSアカウントID>:assumed-role/ManagedMsadStack-AWSmanagementconsoleloginIAMRoleE-1CRB6P8P6DL6G/Admin",
          "accountId": "<AWSアカウントID>",
          "sessionContext": {
              "sessionIssuer": {
                  "type": "Role",
                  "principalId": "AROA6KUFAVPU2KCBLNW4E",
                  "arn": "arn:aws:iam::<AWSアカウントID>:role/ManagedMsadStack-AWSmanagementconsoleloginIAMRoleE-1CRB6P8P6DL6G",
                  "accountId": "<AWSアカウントID>",
                  "userName": "ManagedMsadStack-AWSmanagementconsoleloginIAMRoleE-1CRB6P8P6DL6G"
              },
              "webIdFederationData": {},
              "attributes": {
                  "creationDate": "2022-08-17T04:44:16Z",
                  "mfaAuthenticated": "false"
              }
          },
          "invokedBy": "ds.amazonaws.com"
      },
      "eventTime": "2022-08-17T04:44:17Z",
      "eventSource": "signin.amazonaws.com",
      "eventName": "ConsoleLogin",
      "awsRegion": "us-east-1",
      "sourceIPAddress": "ds.amazonaws.com",
      "userAgent": "ds.amazonaws.com",
      "requestParameters": null,
      "responseElements": {
          "ConsoleLogin": "Success"
      },
      "additionalEventData": {
          "MobileVersion": "No",
          "MFAUsed": "No"
      },
      "eventID": "399f238f-7142-4d8b-9e40-083fc6b4bc24",
      "readOnly": false,
      "eventType": "AwsConsoleSignIn",
      "managementEvent": true,
      "recipientAccountId": "<AWSアカウントID>",
      "eventCategory": "Management"
    }

"invokedBy": "ds.amazonaws.com"など所々にAWS Directory Serviceから呼び出されたということが分かる情報が記録されていますね。一方で、Managed Microsoft ADのIDやドメイン名は記録されていないので、どのディレクトリの認証情報を使ったのか判断するのが難しいです。Adminなどよく使われる名前を使用する場合はトラブルシューティングに手こずりそうです。

グループ単位でマネジメントコンソールへのアクセスを許可

ドメインユーザーとセキュリティグループの作成

グループ単位でマネジメントコンソールへのアクセスを許可することもできるようなので、やってみます。

まず、ドメインに参加しているWindows Server 2022でActive DirectoryやDNSの管理ツール、グループポリシー管理などManaged Microsoft ADの管理に必要な機能をインストールします。

# 現在インストールされている役割と機能の確認
> Get-WindowsFeature | Where-object {$_.Installed -eq $True}

Display Name                                            Name                       Install State
------------                                            ----                       -------------
[X] File and Storage Services                           FileAndStorage-Services        Installed
    [X] Storage Services                                Storage-Services               Installed
[X] .NET Framework 4.8 Features                         NET-Framework-45-Fea...        Installed
    [X] .NET Framework 4.8                              NET-Framework-45-Core          Installed
    [X] WCF Services                                    NET-WCF-Services45             Installed
        [X] TCP Port Sharing                            NET-WCF-TCP-PortShar...        Installed
[X] Microsoft Defender Antivirus                        Windows-Defender               Installed
[X] System Data Archiver                                System-DataArchiver            Installed
[X] Windows PowerShell                                  PowerShellRoot                 Installed
    [X] Windows PowerShell 5.1                          PowerShell                     Installed
[X] WoW64 Support                                       WoW64-Support                  Installed
[X] XPS Viewer                                          XPS-Viewer                     Installed

# Active DirectoryやDNSの管理ツール、グループポリシー管理をインストール
> Install-WindowsFeature -Name RSAT-ADDS,RSAT-DNS-Server,GPMC

Success Restart Needed Exit Code      Feature Result
------- -------------- ---------      --------------
True    No             Success        {Group Policy Management, Remote Server Ad...

# インストールされたことを確認
> Get-WindowsFeature | Where-object {$_.Installed -eq $True}

Display Name                                            Name                       Install State
------------                                            ----                       -------------
[X] File and Storage Services                           FileAndStorage-Services        Installed
    [X] Storage Services                                Storage-Services               Installed
[X] .NET Framework 4.8 Features                         NET-Framework-45-Fea...        Installed
    [X] .NET Framework 4.8                              NET-Framework-45-Core          Installed
    [X] WCF Services                                    NET-WCF-Services45             Installed
        [X] TCP Port Sharing                            NET-WCF-TCP-PortShar...        Installed
[X] Group Policy Management                             GPMC                           Installed
[X] Microsoft Defender Antivirus                        Windows-Defender               Installed
[X] Remote Server Administration Tools                  RSAT                           Installed
    [X] Role Administration Tools                       RSAT-Role-Tools                Installed
        [X] AD DS and AD LDS Tools                      RSAT-AD-Tools                  Installed
            [X] Active Directory module for Windows ... RSAT-AD-PowerShell             Installed
            [X] AD DS Tools                             RSAT-ADDS                      Installed
                [X] Active Directory Administrative ... RSAT-AD-AdminCenter            Installed
                [X] AD DS Snap-Ins and Command-Line ... RSAT-ADDS-Tools                Installed
        [X] DNS Server Tools                            RSAT-DNS-Server                Installed
[X] System Data Archiver                                System-DataArchiver            Installed
[X] Windows PowerShell                                  PowerShellRoot                 Installed
    [X] Windows PowerShell 5.1                          PowerShell                     Installed
[X] WoW64 Support                                       WoW64-Support                  Installed
[X] XPS Viewer                                          XPS-Viewer                     Installed

PowerShellでドメインユーザーとセキュリティグループを作成し、セキュリティグループにドメインユーザーを追加します。

# ドメインユーザーの作成
> New-ADUser `
  -Name "AWSLoginUser" `
  -UserPrincipalName "AWSLoginUser@corp.non-97.net" `
  -Accountpassword (Read-Host -AsSecureString "AccountPassword") `
  -Path "OU=Users,OU=corp,DC=corp,DC=non-97,DC=net" `
  -PasswordNeverExpires $True `
  -Enabled $True
AccountPassword: ********************************

# セキュリティグループの作成
> New-ADGroup `
  -Name AWSLoginGroup `
  -GroupCategory Security `
  -GroupScope Global `
  -Path "OU=Users,OU=corp,DC=corp,DC=non-97,DC=net"

# セキュリティグループにドメインユーザーを追加
> Add-ADGroupMember -Identity AWSLoginGroup -Members AWSLoginUser

# セキュリティグループにドメインユーザーが追加されたことを確認
> Get-ADGroupMember -Identity AWSLoginGroup


distinguishedName : CN=AWSLoginUser,OU=Users,OU=corp,DC=corp,DC=non-97,DC=net
name              : AWSLoginUser
objectClass       : user
objectGUID        : c2bccf11-f4ee-431b-b15c-ce2998e91825
SamAccountName    : AWSLoginUser
SID               : S-1-5-21-1042898337-254592246-1083546402-1147

グループの追加

作成したセキュリティグループに所属しているドメインユーザーがIAMロールにAssumeRoleし、マネジメントコンソールにログインできるようにします。

グループで検索を選択し、グループを指定して追加をクリックします。

グループの追加

グループが追加されたことを確認します。

グループの追加確認

動作確認

`https://アクセスURL/console/`し、セキュリティグループに所属しているドメインユーザーの認証情報を入力し、`サインイン`をクリックします。

グループのユーザーでログイン

正常にログインできました。フェデレーティッドユーザーを確認すると、確かに追加したグループに所属しているドメインユーザーであることが分かります。

グループのユーザーでログイン確認

IAMユーザーの管理を極力したくない時に使えるかも

AWS Managed Microsoft ADの認証情報を使ってAWSマネジメントコンソールにログインしてみました。

ドメインユーザーの認証情報をそのまま使えるので、IAMユーザーの管理を極力したくない時に使えるかもしれませんね。

マネジメントコンソールにログインする際のIAMロールにユーザーやグループを追加する際に、信頼されたフォレストを選択することが可能です。そのため、Managed Microsoft ADとオンプレミスのAD間で信頼関係を作成すれば、オンプレミスのADで管理しているドメインユーザーの認証情報でマネジメントコンソールにログインすることも可能そうです。

[Add users and groups to role] (ロールへのユーザーとグループの追加) ページの [Select Active Directory Forest] (Active Directory フォレストの選択) で、AWS Managed Microsoft AD フォレスト (このフォレスト) またはオンプレミスフォレスト (信頼されたフォレスト) の内、AWS Management Console へのアクセスが必要なアカウントが含まれている方を選択します。信頼されたフォレストの設定方法の詳細については、「チュートリアル: AWS Managed Microsoft AD とセルフマネージド Active Directory ドメイン間で信頼関係を作成する - AWS Directory Service」を参照してください。

ユーザーまたはグループの既存のロールへの割り当て - AWS Directory Service

一方で、Managed Microsoft ADはリージョナルサービスです。そのため、Managed Microsoft ADがいるリージョンに障害が発生してしまうとログインできなくなってしまいます。可用性を向上させる場合にはマルチリージョンレプリケーションの設定も考える必要があります。

セキュリティ面で言うと、「MFAが設定されていない場合はログインさせない」といった制限をすることができません。ログインURLとドメインユーザーの認証情報が分かればマネジメントコンソールにログインできてしまうので、AWS側でMFAによる制限を強制できないのはちょっと心配です。

料金的にも、単純に「ADの認証情報を使いたい」という要件だけでは、Managed Microsoft ADを構築するのは料金とのバランス的にあまりないのではと考えます。

以上のことから、個人的には「AWS IAM Identity Centerが使用できない」 & 「既存のADの認証情報を使ってログインできないと困る」という要件が出てきた時に使うかなという印象を持ちました。

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!