Azure AD認証でAWS SSM Session Manager経由でWindowsインスタンスにリモートデスクトップ接続する

#はじめに
エンタープライズをはじめとする組織の認証基盤としてAzure Active Directory（Azure AD）を採用している環境では、Amazon Web Services（AWS）へのログオンにAzure AD認証によるシングルサインオンを実現したいという場合があると思います。Azure ADとのシングルサインオンにより、さまざまな方法による多要素認証（MFA）や条件付きアクセスなど強力な認証機能を使用できます。この記事では、Azure ADとAWS Identity and Access Manager（IAM）とのフェデレーションを構成してAWS CLIを使用し、AWS Systems Manager Session Manager経由でWindowsインスタンスにリモートデスクトップ接続するところまでを説明します。

#Azure ADとAWSアカウントとの間でシングルサインオン（SSO）を構成する
チュートリアルの手順に従ってAzure ADとAWSアカウントの間でフェデレーションによるシングルサインオンを構成してきます。別のやり方としてAWS Single Sign On（SSO）とAzure ADの連携によるシングルサインオンも可能です。従来、Azure ADとAWS SSOとの統合はマイクロソフトによってサポートされていなかったため、ここでは対象としませんでしたが2021年2月にAWS SSOとの統合がAzure ADアプリケーションギャラリーに追加されたことによりサポート対象となりました。

チュートリアル:Azure Active Directory シングル サインオン (SSO) とアマゾン ウェブ サービス (AWS) の統合
https://docs.microsoft.com/ja-jp/azure/active-directory/saas-apps/amazon-web-service-tutorial

>AWS Single Sign-On
>AWS Single Sign-On は、2021 年 2 月に Azure AD アプリケーション ギャラリーに追加されました。 Microsoft Azure AD を通してサインインすると、複数の AWS アカウントや AWS アプリケーションへのアクセスを一元的に管理しやすくなります。 一度 Microsoft Azure AD と AWS SSO とのフェデレーションを行って、1 つの場所から AWS SSO を使用して、すべての AWS アカウントにわたってアクセス許可を管理します。 AWS SSO では、アクセス許可が自動的にプロビジョニングされ、それらは、ポリシーやアクセスの割り当てを更新するときに最新の状態に維持されます。 エンド ユーザーは、自分の Azure AD 資格情報を使用して認証し、AWS コンソール、コマンド ライン インターフェイス、AWS SSO 統合アプリケーションにアクセスすることができます。

上記の手順を実行することで、ブラウザからマイアプリポータル（https://myapps.microsoft.com） にアクセスすることで、Azure ADユーザーがAWSマネージメントコンソールにシングルサインオンすることができるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708708/7da96345-82c6-d084-6795-7a6e670c9080.png)

#saml2awsを使用してAzure ADの認証情報をAWS CLIに保存する
上記の手順でAzure ADとAWSマネージメントコンソールとの間のシングルサインオンが実現できましたが、AWS CLIを使用するためにはSAMLレスポンスから認証に必要な情報を取得してAWS CLIのクレデンシャルとして保存する必要があります。そのためには、以下のようにブラウザから取得したSAMLレスポンスをコピーしてAssumeRoleWithSAMLを使用してAWS CLIの認証情報を~/.aws/credentialsに保存することができます。

AWS CLI を使用して AssumeRole 呼び出しを行い、一時的なユーザー認証情報を保存する方法を教えてください。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/aws-cli-call-store-saml-credentials/

ただし、認証が必要になるたびにブラウザからSAMLレスポンスをコピーしてくるのはあまり現実的ではありません。そのため、上記の手順を自動化するツールがいくつか公開されています。ここでは、そのなかからsaml2awsを使用してみます。

https://github.com/Versent/saml2aws

たとえばMac OSの場合は以下のようにしてインストールできます。その他のプラットフォームでのインストール方法は、公式のReadmeを参照してください。

````shell:MacOS
$ brew tap versent/homebrew-taps
$ brew install saml2aws
````
Azure AD認証が使用できるようにsaml2awsを構成していきます。たとえば、以下のようにして実行しますが、ここで"URL"には"https://account.activedirectory.windowsazure.com"を、"APP ID"にはAzure ADに登録したエンタープライズアプリケーションのアプリケーションIDの値を入力します。

````shell
$ saml2aws configure
? Please choose a provider: AzureAD
? Please choose an MFA Auto
? AWS Profile saml
? URL https://account.activedirectory.windowsazure.com
? Username test@example.com
? App ID xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

? Password *********
? Confirm *********

account {
  AppID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
  URL: https://account.activedirectory.windowsazure.com
  Username: test@example.com
  Provider: AzureAD
  MFA: Auto
  SkipVerify: false
  AmazonWebservicesURN: urn:amazon:webservices
  SessionDuration: 3600
  Profile: saml
  RoleARN: 
  Region: 
}

Configuration saved for IDP account: default
````
構成が完了したら、saml2aws loginコマンドを実行することでAzure ADに認証し、そのユーザーでAWS CLIが使用できるようになります。以下の例では、ログオンしたあとget-caller-identityを使用してユーザー情報を確認しています。

````
$ saml2aws login
Using IDP Account default to access AzureAD https://account.activedirectory.windowsazure.com
To use saved password just hit enter.
? Username test@example.com
? Password *********

Authenticating as test@example.com ...
Selected role: arn:aws:iam::xxxxxxxxxxxx:role/Admin
Requesting AWS credentials using SAML assertion
Logged in as: arn:aws:sts::xxxxxxxxxxxx:assumed-role/Admin/test@example.com

Your new access key pair has been stored in the AWS configuration
Note that it will expire at 2021-02-05 15:46:47 +0900 JST
To use this credential, call the AWS CLI with the --profile option (e.g. aws --profile saml ec2 describe-instances).
$ aws --profile saml sts get-caller-identity
 {
     "UserId": "ABCDEFG12345ZXYW9876S:test@example.com",
     "Account": "xxxxxxxxxxxx",
     "Arn": "arn:aws:sts::xxxxxxxxxxxx:assumed-role/Admin/test@example.com"
 }
````

#AWS Systems Manager Session Manager経由でWindowsインスタンスにリモートデスクトップ接続する
AWS Systems Manager（SSM）およびSession Managerの機能を構成します。ここではその手順についてくわしく説明しませんので、公式ドキュメントおよび参考情報などを参考にしてください。このとき、Windowsインスタンスに対するインターネット接続およびRDPのポートを開ける必要はありませんが、AWS SSMに対してアウトバウンドで通信できる必要があります。うまくいかない場合は、以下のドキュメントを参考にしてください。

AWS Systems Manager Session Manager
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager.html

Systems Manager コンソールの [マネージドインスタンス] に EC2 インスタンスが表示されないのはなぜですか?
https://aws.amazon.com/jp/premiumsupport/knowledge-center/systems-manager-ec2-instance-not-appear/

また、あらかじめクライアントにSession Managerプラグインをインストールしておきます。

````shell:MacOS
$ curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/sessionmanager-bundle.zip" -o "sessionmanager-bundle.zip"
$ unzip sessionmanager-bundle.zip
$ sudo ./sessionmanager-bundle/install -i /usr/local/sessionmanagerplugin -b /usr/local/bin/session-manager-plugin
````

Session Managerの構成が完了するとEC2 Windowsインスタンスに対してポートフォーワーディングを行うことができるようになります。以下の例では、ローカルホストの13389ポートにRDPをマッピングしています。

````
$ aws --profile saml ssm start-session --target i-xxxxxxxxxxxxxxxx --document-name AWS-StartPortForwardingSession --parameters "portNumber=3389, localPortNumber=13389"

Starting session with SessionId: test@example.com-i-xxxxxxxxxxxxxxxx
Port 13389 opened for sessionId test@example.com-i-xxxxxxxxxxxxxxxx.
Waiting for connections...
````

リモートデスクトップクライアントを使用してWindowsインスタンスに接続します。接続先には、先ほど指定した通り「localhost:13389」を指定します。ここではWindowsインスタンスに対するシングルサインオンは構成されていませんので、通常通りリモートデスクトップで認証が必要になりますが、ログオンが成功すると以下のように表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708708/f000fb79-57cb-4b70-b342-017e05309e4f.png)

#参考情報
チュートリアル:Azure Active Directory シングル サインオン (SSO) とアマゾン ウェブ サービス (AWS) の統合
https://docs.microsoft.com/ja-jp/azure/active-directory/saas-apps/amazon-web-service-tutorial

AWS CLI を使用して AssumeRole 呼び出しを行い、一時的なユーザー認証情報を保存する方法を教えてください。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/aws-cli-call-store-saml-credentials/

AWS Systems Manager Session Manager
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager.html

(オプション) AWS CLI 用の Session Manager plugin をインストールする
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html

Systems Manager コンソールの [マネージドインスタンス] に EC2 インスタンスが表示されないのはなぜですか?
https://aws.amazon.com/jp/premiumsupport/knowledge-center/systems-manager-ec2-instance-not-appear/

図解で、もう踏み台要らずAWS SSM経由Windowsサーバーにリモートデスクトップ接続
https://qiita.com/1Kano/items/1496d58b1293ff70c5ec