AWS Client VPN with TrustLogin

# TrustLoginのSAML認証
「[トラスト・ログイン (TrustLogin)](https://trustlogin.com/)」はGMOグローバルサイン社が提供するIDaaSです。
2021年7月にSAMLレスポンスに署名する機能が追加されたためAWS Client VPNの認証に使用できるか試してみました。
なお、SAMLアプリテンプレートについては2021年8月4日時点で「順次登録を行なっておりますため、リリース時期は未定となっております。」と担当の方より情報をいただきました。

2021年8月25日に公式の設定ガイドに[AWS Client VPN のSAML認証設定方法](https://support.trustlogin.com/hc/ja/articles/4405206182937)が追加されました。

# AWS公式ドキュメント
公式にサポートされているSAMLベースのIdPはOktaとMicrosoft Azure Active Directoryですが、必要な情報はドキュメントに記載されていますのでその他のIdPでも使用できる可能性があります。

https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-admin/client-authentication.html#federated-authentication

# TrunstLoginの設定
TrustLoginに管理者としてログインしておきます。

## グループの作成
[管理] ＞ [グループ] ＞ [グループ追加]でVPNユーザ用のグループを作成します。作成後にメンバーを追加します。

| 設定項目    | 設定内容            |
| ------- | --------------- |
| グループ名   | 任意の名前 （VPN-User） |
| グループの説明 | 任意の内容           |

https://support.trustlogin.com/hc/ja/articles/900001155623-%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B

## SAMLアプリの登録

[管理] ＞ [アプリ] ＞ [SAMLアプリ登録] から以下の内容を設定します。

| 設定項目           | 設定内容                                                                                                                                                      |
| -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| アプリケーション名      | 任意の名前（AWS Client VPN）                                                                                                                                     |
| アイコン           | 任意のアイコン<br><br>![vUOidFXB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24148/bc41b2e1-718e-884c-fdf8-f42285d80963.png) |
| ログインURL        | (記入しない)                                                                                                                                                   |
| SAMLレスポンスに署名する | ON                                                                                                                                                        |
| SP認証成功後の移行URL  | (記入しない)                                                                                                                                                   |
| ネームID用値        | [メンバー] [email]                                                                                                                                            |
| エンティティID       | urn:amazon:webservices:clientvpn                                                                                                                          |
| ネームIDフォーマット    | emailAddress                                                                                                                                              |
| サービスへのACS URL  | [HTTP-POST] http://127.0.0.1:35001<br>セルフポータルを利用する場合は以下も追加<br>[HTTP-POST] https://self-service.clientvpn.amazonaws.com/api/auth/sso/saml                                                                                                                        |
| ログアウトURL       | (記入しない)                                                                                                                                                   |

## SAML属性の設定
「カスタム属性を指定」のボタンで以下を追加します。「memberOf」には最初に作成したグループ名を指定します。グループ名を選択した後に右側の[＋]ボタンを押します。

| (SP)<br>属性指定名 | (SP)<br>属性種類 | (SP)<br>属性名 | (IdP)<br>属性値          |
| ------------- | ------------ | ----------- | --------------------- |
| NameID        | [Email]      | (記入しない)     | [メンバー] [メンバー―メールアドレス] |
| FirstName     | [Persisted]  | (記入しない)     | [メンバー] [メンバー―名]       |
| LastName      | [Persisted]  | (記入しない)     | [メンバー] [メンバー―姓]       |
| memberOf      | [Persisted]  | (記入しない)     | [グループ] [VPN-User]        |

![FireShot Capture 010 - TrustLogin - portal.trustlogin.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24148/991fe032-3f80-0250-ab46-cdd3ae765411.png)


## メタ情報のダウンロード
IDプロバイダーの情報にある「メタデータをダウンロード」からXMLファイルをダウンロードして保存しておきます。最後に右上の「登録」ボタンで終了します。

## アプリにグループ追加
登録されたアプリを選んで、[グループ追加]で先に作ったグループを追加します。

# AWS ACMの設定
クライアント VPN エンドポイントで使用するサーバ証明書を発行してACMにアップロードします。なお、クライアント証明書は今回は使用しません。

https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-admin/client-authentication.html#mutual

# AWS IAMの設定
コンソールの [IAM] ＞ [ID プロバイダー] ＞ [プロバイダの作成]で追加します。
## ID プロバイダーの設定
| 設定項目        | 設定内容                                         |
| ----------- | -------------------------------------------- |
| プロバイダのタイプ   | SAML                                         |
| プロバイダ名      | 任意の名前 (TrustLogon)                           |
| メタデータドキュメント | TrustLogin のメタ情報のダウンロードで保存したXMLファイルをアップロードする |

# AWS VPCの設定
## クライアント VPN エンドポイント作成
コンソールの [VPC] ＞ [クライアント VPN エンドポイント] ＞ [クライアント VPN エンドポイント作成] で追加します。
スプリットトンネルはシステム構成、セルフサービスポータルは運用方法に基づき設定します。

| 設定項目                  | 設定内容                                                                                                |
| --------------------- | --------------------------------------------------------------------------------------------------- |
| 名前タグ                  | 任意の名前 (TrustLogin)                                                                                  |
| 説明                    | 任意の内容                                                                                               |
| クライアント IPv4 CIDR      | 任意のアドレス (192.168.100.0/22)                                                                          |
| サーバー証明書 ARN           | ACMに設定した証明書を選択                                                                                      |
| 認証オプション               | ユーザーベースの認証を使用: ON<br>統合認証: ON<br>SAML プロバイダー ARN: IAMで設定したものを選択<br>セルフサービス SAML プロバイダー ARN: (記入しない) |
| クライアント接続の詳細を記録しますか?   | いいえ                                                                                                 |
| クライアント接続ハンドラを有効化しますか? | いいえ                                                                                                 |
| DNS サーバー 1 IP アドレス    | 任意のDNS                                                                                              |
| DNS サーバー 2 IP アドレス    | 任意のDNS                                                                                              |
| トランスポートプロトコル          | UDP                                                                                                 |
| スプリットトンネルを有効にする       | ON                                                                                                  |
| VPC ID                | 構成済みのVPCを選択                                                                                         |
| VPN ポート               | 443                                                                                                 |
| セルフサービスポータルを有効にする     | OFF                                                                                                 |

## AWS Client VPN Endpoint 設定
作成したエンドポイントに以下の設定をします。

### 関連付け
作成したエンドポイントをVPCに関連づけます。

| 設定項目                  | 設定内容                                                                                                |
| --------------------- | --------------------------------------------------------------------------------------------------- |
| VPC | 任意のVPC |
| 関連付けるサブネットの選択 | 任意のサブネット |

### 認証
アクセス対象をCIDR形式で許可します。AWS Client VPNは[オンプレミスのネットワークへのアクセス](https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-admin/scenario-onprem.html)や[ピア接続先 VPC へのアクセス](https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-admin/scenario-peered.html)も可能なので、対象のCIDRを許可します。「0.0.0.0/0」とすると全て許可することになります。

| 設定項目                  | 設定内容                                                                                                |
| --------------------- | --------------------------------------------------------------------------------------------------- |
| アクセスを有効にするサブネット | 任意のサブネット (0.0.0.0/0) |
| アクセス権を付与する対象 | 特定のアクセスグループのユーザーへのアクセスを許可する |
| アクセスグループID | TrustLoginで作成したグループ名 (VPN-User) |
| 説明 | 任意の説明 |

### ルートテーブル
VPC外のネットワークにアクセスする場合は[ルートの作成]でルーティングを追加します。

| 設定項目                  | 設定内容                                                                                                |
| --------------------- | --------------------------------------------------------------------------------------------------- |
| ルート送信先 | 宛先CIDR |
| ターゲット VPC サブネット ID | サブネットIDを選択 |
| 説明 | 任意の説明 |


## クライアント設定のダウンロード
[クライアント設定のダウンロード] からクライアントに設定する ovpn ファイルをダウンロードして保存します。VPNの利用者にはこのファイルを配布するか、セルフポータルを有効にして自身でダウンロードしてもらうようにします。

# AWS Client VPN for Desktop のダウンロードとインストール

クライアントPC用のプログラムをダウンロードしてインストールします。
古いバージョンはSAML認証をサポートしていませんでした。バージョン1.2.0以上でサポートされています。

https://aws.amazon.com/jp/vpn/client-vpn-download/

インストール後に [ファイル] ＞ [プロファイルを管理] ＞ [プロファイルを追加] でダウンロードした ovpn ファイルを指定してプロファイルを追加します。

# 参考にした情報
* [【AWS】AWS Client VPN メモ　～OktaでSAML認証＋セルフサービスポータル機能使ってみる～](https://qiita.com/taka-s_999/items/6b5dfd7799ea17edd201)
* [OneLoginとAWS ClientVPNをSAML連携してみた](https://techblog.pentio.com/entry/2021/04/02/121725)