シングルサインオンはいいぞ。AWS SSOでEC2 Windows Serverにログインする。

この記事は[ZOZO Advent Calendar 2021 #3](https://qiita.com/advent-calendar/2021/zozo) 13日目の記事です。

https://qiita.com/advent-calendar/2021/zozo

# とあるリリース
https://aws.amazon.com/jp/about-aws/whats-new/2021/11/aws-single-sign-on-one-click-login-ec2-windows/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62601/c2cd53d8-a55a-1b91-710a-d224838d5df0.png)

弊社は古くからWindows Serverを利用しており、AWS上でも多少のEC2 Windows Serverが動いています。徐々にLinuxコンテナに置き換わっているものの、まだまだ現役です。

アカウント管理が容易になるリリース、これは見逃せません。

# どうなっているのか

全体像はブログにまとめられています。

https://aws.amazon.com/jp/blogs/security/how-to-enable-secure-seamless-single-sign-on-to-amazon-ec2-windows-instances-with-aws-sso/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62601/349385ff-d8ec-091b-2aa1-c147c83d60f0.png)
cf. 上記ブログより

Systems ManagerのFleet Managerを利用するようです。Fleet Managerは、昨年のre:Invent 2020で発表されたもので、OSの垣根を越えて様々な情報を集約してくれる便利なサービスです。

https://techblog.zozo.com/entry/aws-reinvent-2020#AWS-Systems-Manager-Fleet-Manager

ローカルからSSOをプロキシのように使って接続するのではなく、Webコンソールからの接続を提供してくれる模様です。

# やってみた

## 前準備
AWS SSOの有効化（省略）

## Windows Serverの作成
次の条件で作成します

* インバウンドルールなしのセキュリティグループを設定
* パブリックIPアドレスあり
    * ここではデフォルトVPCのパブリックサブネットに置く
    * Systems Managerと通信できる必要がある
* SSH鍵はなし
* インスタンスプロファイルでAmazonSSMManagedInstanceCoreポリシーを持ったロールを設定

CloudFormationで書いたものが以下です。

https://github.com/kotatsu360/cfn-templates/blob/main/aws-sso-ec2-windows-server.yaml

## Fleet Managerから接続

起動後、[Fleet Manager](https://console.aws.amazon.com/systems-manager/managed-instances?region=us-east-1)に移動し、「Connect with Remote Desktop」を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62601/3c865eee-28c2-2afb-ee18-85c1977dfb7b.png)

「SSO」というボタンが増えています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62601/06d3a760-2fb9-6114-59e9-e42852b43be8.png)

SSOを押すだけで、Windows側にアカウントが作成されログインできました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62601/d268d288-9caa-5296-6f1a-787445dfce02.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62601/466bc850-a6fe-0834-b767-5552993bb608.png)

:::note warn
[2021/12/12時点]
whats newでは「AWS SSO および AWS Systems Manager を提供中のすべての AWS リージョン (AWS 中国および AWS GovCloud (米国) を除く) で利用可能です。」と書かれていますが、東京リージョンではSSOログインが表示されませんでした。そのため、検証は北バージニアリージョンで行いました。
:::

# 比較してみる
## Session Managerとの比較
既存の類似手段として、セッションマネージャーがあります。ポートフォワーディングすれば、RDP接続も可能です。

| | Session Manager | Fleet Manager |
| --- | --- | --- |
| 接続の開始 | Webコンソールから or CLIから | Webコンソールから |
| RDPでの接続 | 利用可能（ポートフォワーディング） | 利用可能 |
| Windows側の事前準備 | アカウント作成が必要 | **アカウント作成が不要** |

1利用者として利用するだけであれば、WebコンソールからもCLIからも接続が可能なSession Managerの方が便利かもしれません。

一方、管理者視点では、「**アカウント作成が不要**」というのが何より魅力的です！
利用者にFleet Managerを使う権限さえあれば、すぐさまWindowsへのログインが可能です。

## 【未検証】操作感・速度比較
接続方法（Session Manager、Fleet Manager）ごとの操作感を比較・・・できませんでした。

Windows力が足りず、Session Manager越しのRDP接続エラーを解消できなかったためです。
逆を言えば、Windows力が足りなくても、アクセスできるのは大変ありがたいです。

# 試してみる
## AWS SSO経由で接続するとき、既に同名のアカウントが存在するとどうなる？
**エラーにはならず、既に存在するアカウントとしてログインします。**

この場合、アカウント名/パスワードでのログインも引き続き可能です。
また、このアカウントの種類が「標準」の場合、自動的に「管理者」へ変更されます。

AWS SSO経由のアカウントは、必ず`sso-`というプリフィクスから始まるため、まず衝突しないとは思いますが注意が必要です。別人のアカウントにログインできてしまう可能性があります。

## AWS SSO経由で接続するとき、ユーザ名にWindowsアカウントとして利用できない文字が含まれているとどうなる？
**先頭から利用できる文字までのアカウントが作成されます。**
例えば、abc.efg@example.comというSSOユーザの場合、「sso-abc.efg」というアカウントが作成されます。

## ユーザ名の先頭文字がWindowsアカウントとして利用できない文字だとどうなる？
**エラーになります。**

例えば、+abcというSSOユーザの場合、以下のエラーとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62601/33442566-3436-453d-6eca-dab83350accd.png)


## SSOユーザを削除したら、Windows上のアカウントはどうなる？
**SSOユーザを削除しても、Windows上のアカウントは残ります。**
不要なWindowsアカウントの棚卸し（削除）は、別途対応する必要があります。

## 削除したSSOユーザと同名のユーザをAWS SSO上で再作成して、再接続したらどうなる？
**既に存在するアカウントとしてログインします。**

1. Windowsを使っていたhogeさん（初代）が退職したので、AWS SSOからhogeユーザを削除
1. AWS SSOにhoge（二代目）を作成してWindowsに接続すると、hogeさん（初代）としてWindowsにログインできる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62601/ee38f387-55fa-3871-45a0-c36e97430aae.png)

アカウント名とパスワードを使って接続する場合と異なり、SSOユーザ名だけを知っていればログインできてしまいます。
通常、そのSSOユーザ自体が特定の個人に紐づくはずですが、退職者のSSOユーザ名を使い回すようなAWS SSO運用をしている場合は、見直す必要があります。

# まとめ
AWS SSOを使うことで、起動したばかりのEC2 Windows Serverへ前準備なしにログインできました。

SSO側のユーザ名に注意する必要があるものの、メールアドレスなど組織内で唯一かつ通常は使い回さないものを用いてユーザ管理をすることで、回避できる範囲かと思います。

シングルサインオンはいいぞ。