AWS Client VPNをOktaのSAML認証を使ってアクセスしてみた
今回は、AWS Client VPNとOktaをSAML認証でVPNアクセス環境を構築する方法についてご紹介します。
「VPN接続にセキュリティを強化したいけど、どんな方法があるんだろう?」「既存のOkta環境を活用してAWS Client VPNを設定できないかな?」とお考えの方もいらっしゃるのではないでしょうか。
SAML認証によりIdP経由での多要素認証(MFA)を伴うセキュアな認証や効率的な運用管理が実現できます。
本記事では、AWS Client VPNとOktaのSAML認証を組み合わせることで、「セキュアで管理しやすいVPN環境」 の実現を目指します。
では、早速やってみます。
AWS Client VPNとは
AWS Client VPNは、クラウドベースのリモートアクセスVPNサービスです。
これにより、ユーザーはどこからでもAWSのリソースやオンプレミスネットワークに安全にアクセスできます。
スケーラブルで高可用性なサービスであり、既存のAWS環境に容易に統合できるのが特徴です。
AWS Client VPNの認証方式
AWS Client VPNでは、主に以下の3つの認証方式をサポートしています。
- Active Directory認証: AWS Directory Serviceを利用して、既存のActive Directoryと連携します。
- 相互認証(クライアント証明書認証): クライアント証明書を使用して認証を行います。高いセキュリティが確保できますが、証明書の管理が必要になります。
- Federated Authentication(フェデレーション認証): OktaなどのSAML 2.0またはOpenID Connect(OIDC)互換のIdPと連携し、IdPの認証機能を利用します。
今回は、この「Federated Authentication」に焦点を当て、特にOktaのSAML認証を用いた方法を深掘りしていきます。
Oktaとは
Oktaは、クラウドベースのID管理およびアクセス管理(IAM)サービスです。シングルサインオン(SSO)、多要素認証(MFA)、プロビジョニングなどの機能を提供し、企業がユーザーのアプリケーションやデータへのアクセスを安全に管理できるようにします。
OktaとSAML認証
SAML (Security Assertion Markup Language) は、異なるセキュリティドメイン間で認証および認可データを交換するためのXMLベースの標準です。OktaはSAMLをサポートしており、サービスプロバイダ(SP)であるAWS Client VPNが、IDプロバイダ(IdP)であるOktaに認証を委譲することを可能にします。これにより、ユーザーはOktaで一度認証すれば、AWS Client VPNを含む複数のサービスにアクセスできるようになります。
構成の全体像
今回の構成は以下のようになります。
- VPNクライアントはAWS Client VPNエンドポイントに接続要求を行います。
- AWS Client VPNエンドポイントは、認証要求をOktaにリダイレクトします。
- Oktaでユーザーは認証(必要に応じてMFA)を行います。
- OktaからのSAMLアサーションに基づいて、AWS Client VPNエンドポイントがアクセスを許可します。
- 認証に成功すると、VPNクライアントはVPC内のリソースや、Direct Connect/VPN経由で接続されたオンプレミスリソースにアクセスできるようになります。
AWS Client VPNとOkta SAML認証の設定手順
ここからは、実際にAWS Client VPNとOktaを連携させるための具体的な設定手順を解説していきます。
前提条件
- Client VPNエンドポイントの作成に必要なVPC、サブネットが準備されていること
- アクセスのテストに利用するEC2インスタンスの起動
- Amazon Route 53 でドメインを取得していること
- VPNクライアントソフトウェア(AWS VPN Clientなど)がインストールされていること
1. Oktaアプリケーションの作成
まず、Okta側でSAMLアプリケーションを作成し、AWS Client VPNからの認証リクエストを受け付ける準備をします。
-
Oktaの管理画面にログインします。
-
「Applications」>「Applications」>「Browse App Catalog」を選択します。
- 「AWS」などで検索して、AWS ClientVPN」を選択し、「Add Integration」をクリックします。
- 「App name」に任意の名前(例:
AWS Client VPN SAML
)を入力し、「Done」をクリックします。
-
「Assignments」でグループまたは人を割り当てます。
-
「Sign on」のタブで「Metadata URL」をコピーして、ブラウザで表示します。
- XMLを任意の名前(例:
oktametadata.xml
)などで保存します。※この後のIDプロバイダの設定で使用します
2. IAMにSAMLプロバイダの作成
AWS Client VPNがOktaとSAML認証を行うためには、OktaのメタデータXMLをIAMにSAMLプロバイダとして登録する必要があります。
- AWSマネジメントコンソールにログインし、IAMサービスに移動します。
- 左側のナビゲーションペインから「ID プロバイダ」を選択し、「プロバイダを追加」をクリックします。
- 「プロバイダのタイプ」で「SAML」を選択します。
- 「プロバイダ名」に任意の名前(例:
OktaSAMLProvider
)を入力します。 - 「メタデータドキュメント」に、OktaでダウンロードしたSAMLメタデータXMLファイル(例:
oktametadata.xml
)をアップロードします。 - 「プロバイダを追加」をクリックします。
- 作成されたSAMLプロバイダのARNを控えておきます。これをAWS Client VPNエンドポイント作成時に「SAML プロバイダー ARN」として指定します。
3. ACM (AWS Certificate Manager) でサーバー証明書を発行
AWS ClientVPN ではサーバー証明書が必須です。
このサーバー証明書により、クライアントが接続しようとしているAWS ClientVPN エンドポイントが正規のものであることを証明する役割を果たし、VPNクライアントとエンドポイント間の通信を暗号化します。
AWS Client VPNでは、このサーバー証明書をAWS Certificate Manager (ACM) で発行し、利用することを推奨しています。
ACMを利用することで、証明書の取得、デプロイ、および更新プロセスが簡素化され、運用の手間が大幅に削減されます。
特に、Route 53で管理されているドメインを使用する場合、DNS検証を利用することで、証明書の発行から更新までをほぼ自動化できます。
今回は、事前に Amazon Route 53 で〇〇のドメインを取得済みであることを前提とし、ACM (AWS Certificate Manager) での証明書発行していきます。
-
ACMサービスに移動し、「証明書をリクエスト」をクリックします。
-
「パブリック証明書のリクエスト」を選択し、「次へ」をクリックします。
-
「ドメイン名」に取得済みのドメインを入力します。(例: clientvpn.example.com)
-
「検証方法」で「DNS検証」を選択します。Route 53で管理されているドメインを使用する場合、この方法が最も簡単です。
-
「キーアルゴリズム」はデフォルトの「RSA 2048」で問題ありません。
-
「リクエスト」をクリックします。
- 証明書を表示すると、「保留中の検証」と表示されるので、「Route 53 でレコードを作成」をクリックするとRoute 53でCNAMEレコードが作成できます。
-
Route 53でのCNAMEレコード追加後、ACMに戻り、証明書の状態が「発行済み」になるまで待ちます。これには数分かかる場合があります。
-
証明書が発行されたら、そのARN(Amazon Resource Name)を控えておきます。このARNをClient VPNエンドポイント作成時の「Server certificate ARN」に指定します。
4. セキュリティグループ作成(AWS Client VPNエンドポイント用)
Client VPNエンドポイントに設定するセキュリティグループを用意します。
-
AWSマネジメントコンソールにログインし、EC2サービスに移動します。
-
左側のナビゲーションペインから「セキュリティグループ」をクリックして以下のセキュリティグループを作成しておきます。
インバウンドルール
なし
アウトバウンドルール
# | タイプ | プロトコル | ポート範囲 | ソース |
---|---|---|---|---|
1 | 全てのトラフィック | すべて | すべて | 0.0.0.0/0 |
5. AWS Client VPNエンドポイントの作成
次に、AWS側でClient VPNエンドポイントを作成します。
-
AWSマネジメントコンソールにログインし、VPCサービスに移動します。
-
左側のナビゲーションペインから「クライアント VPN エンドポイント」を選択し、「クライアント VPN エンドポイントを作成」をクリックします。
-
以下の設定を行います。
- 名前タグ: 任意の名前(例:
my-clientvpn-endpoint
) - クライアント IPv4 CIDR: VPN接続時にクライアントに割り当てるIPアドレス範囲(例:
10.0.0.0/22
)。既存のVPC CIDRおよびデバイスで利用中のIPアドレス(自宅のWifiで利用されるIPなど)と重複しないように注意してください。また、CIDRプレフィックスは/22
より大きい必要があります。 - サーバー証明書 ARN: VPNエンドポイントで使用するサーバー証明書のARNを指定します。ACMで事前に作成したARNを指定します。
- 認証オプション: 「ユーザーベースの認証を使用」、「フェデレーション認証」を選択し、以下の情報を入力します。
- SAML プロバイダー ARN: IAMで作成したSAMLプロバイダのARN
- DNS サーバー 1 IP アドレス: 今回はブランクでいきます
- スプリットトンネルを有効化: 必要に応じて有効/無効を設定します。有効にすると、VPNトラフィックのみVPN経由でルーティングされ、インターネットトラフィックは直接ルーティングされます。
- VPC ID: 接続先のVPCを選択します。
- Security group IDs: VPNクライアントに適用するセキュリティグループを選択します。
- 名前タグ: 任意の名前(例:
- 「クライアント VPN エンドポイントを作成」をクリックしてエンドポイントを作成します。
6. Client VPNエンドポイントとターゲットネットワークの関連付け
作成したClient VPNエンドポイントを、VPC内のサブネットに関連付けます。これにより、VPNクライアントは指定されたサブネット内のリソースにアクセスできるようになります。
- Client VPNエンドポイントの詳細画面で、「ターゲットネットワークの関連付け」タブを選択し、「ターゲットネットワークを関連付ける」をクリックします。
- 「VPC」と「パブリックに所属する Subnet ID」を選択し、「ターゲットネットワークを関連付ける」をクリックします。複数のサブネットに関連付けることも可能です。
※関連付けるサブネットは最低でも/27
プレフィックス確保する必要があります。
7. 承認ルールの追加
VPNクライアントがアクセスできるネットワークやポートを制限するために、承認ルールを設定します。
- Client VPNエンドポイントの詳細画面で、「承認ルール」タブを選択し、「承認ルールを追加」をクリックします。
- 「アクセスを有効にする送信先ネットワーク」に、VPNクライアントがアクセスを許可されるIPアドレス範囲を指定します(例:
0.0.0.0/0
で全てのトラフィックを許可、または特定のVPC CIDR)。 - アクセス権を特定のユーザー(Oktaで特定のグループに属するユーザー)のみにアクセスを許可したい場合に指定します。今回は指定なしで進めます。
- 「承認ルールを追加」をクリックします。
8. クライアント設定ファイルのダウンロードと設定
最後に、VPNクライアントが接続するための設定ファイルをダウンロードし、必要な情報を追加します。
- Client VPNエンドポイントの詳細画面で、「クライアント設定をダウンロード」をクリックします。
-
ダウンロードした
.ovpn
ファイルをテキストエディタで開きます。 -
ファイルの一番最後に、以下の行を追加します。
auth-federate reneg-sec 0
auth-federate
: フェデレーション認証を有効にするための設定です。reneg-sec 0
: OpenVPNのセッション再ネゴシエーションを無効にします。これはSAML認証との互換性のために必要です。
-
ファイルを保存します。
9. EC2インスタンスのセキュリティグループ設定
今回EC2インスタンスはプライベートサブネット内に構築している前提としていますが、EC2インスタンスに紐づけるセキュリティグループは以下になっています。
ICMPで疎通テストすることを想定しています。
インバウンドルール
# | タイプ | プロトコル | ポート範囲 | ソース |
---|---|---|---|---|
1 | 全てのICMP - IPv4 | ICMP | すべて | クライアントVPNエンドポイントのセキュリティグループ |
アウトバウンドルール
# | タイプ | プロトコル | ポート範囲 | ソース |
---|---|---|---|---|
1 | 全てのトラフィック | すべて | すべて | 0.0.0.0/0 |
VPNクライアントからの接続
準備が整ったので、VPNクライアントから接続を試してみましょう。
- AWS VPN Clientアプリケーションを起動します。
- 「File」>「Manage Profiles」を選択し、「Add Profile」をクリックします。
- 「Client VPN endpoint configuration file」で、先ほどダウンロードして編集した
.ovpn
ファイルを選択します。 - プロファイル名を入力し、「Add Profile」をクリックします。
- 追加したプロファイルを選択し、「Connect」をクリックします。
- ブラウザが起動し、Oktaのログイン画面にリダイレクトされます。Oktaのユーザー名とパスワードを入力し、必要に応じてMFAを完了します。
- 認証が成功すると、ブラウザが閉じられ、AWS VPN Clientが「Connected」と表示されます。
最後にPingを打ってみます。
EC2のIPアドレスは 10.0.0.190
です。
% ping 10.0.0.190
PING 10.0.0.190 (10.0.0.190): 56 data bytes
64 bytes from 10.0.0.190: icmp_seq=0 ttl=126 time=108.631 ms
64 bytes from 10.0.0.190: icmp_seq=1 ttl=126 time=40.906 ms
64 bytes from 10.0.0.190: icmp_seq=2 ttl=126 time=19.207 ms
64 bytes from 10.0.0.190: icmp_seq=3 ttl=126 time=38.976 ms
64 bytes from 10.0.0.190: icmp_seq=4 ttl=126 time=37.495 ms
64 bytes from 10.0.0.190: icmp_seq=5 ttl=126 time=20.128 ms
64 bytes from 10.0.0.190: icmp_seq=6 ttl=126 time=18.820 ms
無事にVPN経由でPingが到達しました。
その他
接続に失敗した場合、AWS Client VPNのログ(CloudWatch Logsで確認可能)や、VPNクライアントのログを詳細に確認することが重要です。特にOktaとの連携エラーであれば、認証関連のメッセージが出力されているはずなので、うまくいかない場合は確認してみるのが良いです。
まとめ
今回は、AWS ClientVPNとOktaのSAML認証を連携をやってみました。
私自身の、AWS ClientVPNの設定は初めてやってみたので、連携するサービスや、接続パターンを整理することができてよかったです。
AWS Client VPNをOktaのSAML認証をやってみたいときなどに、参考にしていただけると幸いです。