AWS Client VPN が SAML 対応したので Okta で試してみた

# はじめに
\_s\_\_o\_ です。

2020 年 5 月 19 日付けで AWS Client VPN が SAML 認証に対応しました。

[参考] [AWS Client VPN で SAML 2.0 経由のフェデレーション認証のサポートを開始](https://aws.amazon.com/jp/about-aws/whats-new/2020/05/aws-client-vpn-supports-federated-authentication-via-saml-2/)

Client VPN の ID 認証は、これまでは AWS Directory Service の利用が必須でした。ID 認証のためだけに AWS Directory Service を立て、さらには ID 管理のためだけに AWS EC2 で Windows を立て……など、あまり費用対効果が良いとは言いがたいものでした (ちなみに、MFA を有効にする場合は、AWS Directory Service に加えて Radius サーバも別途必要。。。)。

そのため、この機能追加は、非常に嬉しいものです。パスワード管理が IdP 依存になるので、IdP でポリシーや更新 UI を用意しておけば、システムとは完全に独立した形でパスワードを管理することができるようになります。また、IdP が MFA に対応していれば、よりセキュアな仕組みでシステムを構築することができます。

というわけで、2020/07/06 現在、AWS Client VPN が公式で対応している「Okta」を使って、AWS Client VPN の SAML 認証を試してみたいと思います。

なお、この記事は Okta や SAML 設定の部分に重きをおいており、Client VPN 設定に関しては最低限のことしか記載していません。Client VPN も含んだ設定に関しては、後述の「参考」に記載のサイトが詳しいので、そちらを参照してください。

# Okta 作業
## Okta 初期登録
30 日間は無料で試用できるので、下記サイトを参考にしながら登録しました。

[参考] [Okta を試してみた](https://hawksnowlog.blogspot.com/2018/08/idaas-okta.html)

特につまづいた部分はありませんでしたが、下記は留意しておく必要があります。

- Gmail (gmail.com) など、自組織を特定できないメールアドレスでは初期登録 (管理者登録) 不可。プロバイダから付与されたメールアドレスなどで初期登録する必要あり
- 2020/07/06 時点、初期登録 (管理者登録) の際は MFA 必須。事前に [Okta の MFA 用ツール](https://apps.apple.com/jp/app/okta-verify/id490179405) をダウンロードしておくとよい
- 管理者画面はすべて英語。エンドユーザ画面は日本語対応

## Okta エンドユーザ登録
エンドユーザを登録します。「Directory」 > 「People」 > 「Add Person」でサクッと登録できます。なお、エンドユーザに関しては、Gmail などのメールアドレスでも登録可能です。

![01_Okta_ユーザ登録.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46216/eb201481-6831-868d-fcff-2a3983757eae.png)

## Okta アプリ登録
アプリとして「AWS Client VPN」を登録します。「Applications」を選択して、検索欄に「AWS」と入力すれば、候補に「AWS Client VPN」が出てきます。「AWS Client VPN」を選択したら、特に設定などはいじらず、そのまま「Done」を押して登録です。

![02_Okta_Client_VPN_設定画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46216/c0d52e3e-9159-1280-ec27-6fe5f5a7e9fb.png)

## Okta アプリアサイン
「AWS Client VPN」を、先ほど作成したエンドユーザにアサインします。「Applications」 > 「AWS Client VPN」 > 「Assignments」でアサイン可能です。

![03_Okta_Client_VPN_アサイン画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46216/92487404-26d1-cd72-bc70-444342ecb974.png)

## Okta SAML 設定
AWS Client VPN 用の SAML 設定を行います。「Applications」 > 「AWS Client VPN」 > 「SSO」を選択して、「Edit」ボタンを押下します。設定画面に移行するので、下記 2 点を設定します。

- memberOf を「Matches .*」で設定する。Okta のグループ情報を Client VPN に連携するため
- Port を「35001」に設定する。AWS Client VPN から SAML 認証する際に使用するポート

![04_Okta_SAML設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46216/b27ddff7-9127-4d9a-79f5-5f97a470fbc2.png)

設定が完了したら、AWS の IdP 登録で使用するため、メタデータの XML をダウンロードしておきます。下図赤枠部分を右クリックして、「名前を付けてリンク先を保存」で保存できます。

![05_Okta_メタデータダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46216/c90a87b0-a9b8-e8d8-7318-568b90562ea2.png)

# AWS 作業
## IdP 登録
IAM から登録します。「IAM」 > 「ID プロバイダー」 > 「プロバイダの作成」で作成します。メタデータドキュメントでは、先ほどダウンロードしたメタデータを指定します。

![06_AWS_IdP登録.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46216/d08413a2-0759-c2d6-0bcf-37021dd35172.png)

## Client VPN Endpoint 作成

ポイントのみ解説します。認証オプションで「ユーザーベースの認証を使用」を選択します。おそらく、前までは「Active Directory 認証」のみだけだったと思いますが、ここに「統合認証」の選択が増えているはずです。こちらを選択し、下部の「SAML プロバイダー ARN」で、先ほど作成した IdP の ARN を指定します。

![07_ClientVPN登録.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46216/f2ec58fa-63b9-6d3c-1537-d92fccf7d93d.png)

エンドポイント作成後、「関連付け」や「認証」で、接続先サブネットや接続許可 CIDR を指定します。詳しい手順に関しては、後述の「参考」のサイトを参照してください。

# 接続試行
エンドポイントの ovpn ファイル (プロファイル) をダウンロードし、AWS 公式の「AWS VPN Client」にインポートします。

ちなみに、私が試した範囲では、VPN クライアントから認証がフェデレートする (Okta の認証画面が表示される) のは、AWS 公式の「AWS VPN Client」だけでした。残念ながら、OpenVPN クライアント (使用したのは OpenVPN Connect) では、VPN クライアントから認証がフェデレートせず、認証失敗として接続不可でした。

話を戻して、プロファイルを「AWS VPN Client」にインポートしたら、「接続」を押して接続開始します。「ID 連携中...」と画面に表示された後、ブラウザで Okta の画面が立ち上がります。

![08_Okta_SSO.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46216/8e790fa0-230d-8c0b-3ded-ea2c56bf57bf.png)

ここで Okta のエンドユーザ ID/Password を入力し、「サインイン」ボタンを押下します。ID/Password が正しければしばらく待ったのち、「接続完了」と表示され、はれて AWS Client VPN に接続できるようになります。

# まとめ
以上、AWS Client VPN の SAML 認証を Okta で試してみた、でした。

2020/07/06 現在、公式でサポート (公式に手順が記載) [[参考]](https://aws.amazon.com/jp/blogs/networking-and-content-delivery/authenticate-aws-client-vpn-users-with-saml/) されている IdP は「Okta」ぐらいのようですが、「AWS SSO」で試して成功したような記事もあるようです。

[参考] [AWS Client VPNでSAML認証がサポートされたのでAWS SSOで認証してみた](https://tech.smartcamp.co.jp/entry/aws-client-vpn-aws-sso)

まだ出始めの機能なので、公式対応の IdP もこれからドンドン増えていくと思います。期待大です。

あと、個人的には、何とかして OpenVPN クライアントからも SAML 認証を利用したいなあと思っています。というのも、AWS 公式の「AWS VPN Client」は、2020/07/06 現在、proxy 接続に非対応のため、proxy を挟むような企業 NW 環境では、OpenVPN クライアント一択となってしまうからです。。。

いずれにせよ、SAML 認証をサポートしたことで、ちょっと煩雑だった Client VPN の ID 認証まわりがスッキリし始めているのは確かです。サポート状況をウォッチしていきつつ、その他のいろんな IdP も試していきたいと思います。

# 参考
[参考] [多要素認証の実装が簡単になるぞ！AWS Client VPN で SAML ベースのフェデレーション認証がサポートされました](https://dev.classmethod.jp/articles/aws-client-vpn-supports-federated-authentication-via-saml-2/)