ご挨拶
明けましておめでとうございます。(遅い)
皆さんセキュリティ設定ちゃんとしてますか?
少し筆者がバタバタしており時間が取れず記事が出せなくなっていたところ、Client VPNのセキュリティ強化をする検証が取れたので執筆しています。
お題
AWS Client VPNを構築します。
ただ、セキュリティ性や利便性を考えた時に、以下の要件を満たしたいと考えています。
今回の要件
- IAM Identity Center(以下IIC)にてユーザ・グループを管理する
- AWS Client VPNを経由してインターネットに接続できるようにする
- インターネットにアクセスする際は、静的IPアドレス(Elastic IP)で出ること
- 携帯(スマホ)からもつなげること
- MFAを導入すること
構成図
Mermaid記法で書いていますが、とてもシンプルです。
ここで気づかれるかと思いますが、エンドポイントが2種類あります。
どうやらスマホ版ではMFA用のオプションが設定に含まれると対応していないため、接続が行えない様子です。
色々友人や会社の人に知見を聞いたところ、Profileに記載するオプションが対応していないということまでは判明しましたが、公式ドキュメントまでは探すことができませんでした。
設計のポイント
MFA有り(必須)とMFA無しは同じエンドポイントではできないため、エンドポイントを分離することにしました。
また、MFA認証のセキュリティ担保として、証明書認証を導入することになります。
さらに、スマホ版に関しては、AWS VPN Clientは提供されていないため、OpenVPN Clientを利用することになります。
最終的な要件は以下となります:
- MFA認証を行うエンドポイント(PC用)
- MFA認証を行わないエンドポイント(スマホ用)
- MFA認証無しの場合は、証明書認証を行うこと
構築
上記までで設計まで終わりました。
実際に作成して試してみましょう。手動で実施するのももったいないので、Infrastructure as CodeのTerraformを用います。
また、Kiro-cli及びKiroを利用してSpec開発をさせて作成しました。
Spec開発のやり方などは、今回の本筋からは離れてしまいますので、記載いたしません。
ご自身でお調べください。
IAM Identity CenterとSAML連携の設定
コードから展開されているときに学べたのですが、通常IAMとIdPプロバイダは、認可などでポチポチする形となりますが、IAM Identity Center(以下IIC)の場合は、以下のコードのように
IICのプロバイダ情報をダウンロードしてIAMのIdPプロバイダへインポートを行う必要があります。
設定を忘れないようにしましょう。
## SAMLメタデータのダウンロード
1. Applications → `client-vpn-pc` → Actions → Edit attribute mappings
2. 以下のマッピングを追加:
- Subject: `${user:email}` (Format: emailAddress)
- Attribute: `FirstName` → `${user:givenName}`
- Attribute: `LastName` → `${user:familyName}`
- Attribute: `memberOf` → `${user:groups}`
3. Applications → `client-vpn-pc` → Application metadata
4. "IAM Identity Center SAML metadata file" をダウンロード
5. ダウンロードしたXMLファイルを `terraform/environments/prod/saml-metadata.xml` として保存
今回はKiroのSpecで自動で行っています。
ポイントとなるのはIICで作成した「SAML2.0 認証用カスタムアプリケーション」とそのメタデータファイルをIAMのIdPとして登録を行うことです。
こちらを行うことで、IICのMFAで接続ができるようになります。
エンドポイントの作成
展開されるとVPCの画面で以下のようにエンドポイントが発行されます。
NAT Gatewayで固定IPで出るようにしていますので、同じ固定IPから出ることになります。
VPNに繋がれば、NAT Gatewayの99から始まるElastic IPでインターネットに繋がるようになる想定です。
VPN設定ファイルのダウンロード
エンドポイントをダウンロードしてくる必要があります。
コマンドは以下です:
# 1. VPN設定ファイルのダウンロード
aws ec2 export-client-vpn-client-configuration \
--client-vpn-endpoint-id "mobile-use-vpn-endpoint-name" \
--output text > mobile-client-config.ovpn
# 2. 証明書の取得
# Terraform stateから証明書を抽出するか、以下のコマンドで確認:
terraform output -raw mobile_client_cert > client.crt
terraform output -raw mobile_client_key > client.key
IAM Identity Centerのアプリケーション設定
また、IICで行う場合、アプリケーションがSAML2.0での認証となります。そのためカスタムアプリケーションを作成してください。
エンドポイント毎に必要となります。
私は、この認証設定でかなり悩みKiroに色々確認しながらTF化できるかなと思ったのですが、TF化はうまくできず、手動で行いました。
認可設定の注意点
接続された後インターネットへ接続できない場合、IICの認可設定をグループ単位ではなく、全員にしておかないと追加のルーティングが上書きできないという問題があります。
この点に注意して設定を行ってください。
接続確認
PC版の接続確認
- AWS VPN Clientをダウンロードしてセットアップします
- PC版のプロファイルを読み込みます
- IICのログイン画面が表示されます
- 多要素認証を行います
- ApplicationのタブからVPNを選びます
- 接続認証の返答応答があり、接続されます
- MFA認証にること、NAT Gatewayで設定されているEIPでインターネットに接続をして繋がることが確認できれば問題なし
Mobile版の接続確認
- iOS版もしくはAndroid版をインストールします
- Mobile版のプロファイルと作成している証明書を統合して専用プロファイルを作成します
- OpenVPN Connectに作成したProfileを読み込ませて接続確認
- 接続後、PC同様IPアドレスが変更されていれば完了
未接続時:
接続時:
スマホでも接続確認:
PC版とMobile版で分離した理由
証明書認証にした場合、ユーザ単位での証明書認証が必要となります。
ユーザのセキュリティを担保しながらとなると、管理コストが爆上がりしてしまうためです。
また、最近ではVPNそのものの脆弱性等があり、MFAを必須化する傾向にもあります。
今回はIICのユーザを作成しましたが、IdPを利用する場合はEntra ID等を用いることでユーザ管理コストも下げることに繋がります。
PC版ではIIC + MFAによる強固な認証を実現し、Mobile版では証明書認証によるセキュリティを担保することで、両方のデバイスで安全なVPN接続を実現しています。
コスト試算
AWS Client VPNの主なコスト要素は以下の通りです(東京リージョン: ap-northeast-1):
料金はリージョンによって異なります。以下は東京リージョン(ap-northeast-1)での試算です。
最新の料金はAWS VPN料金ページおよびAWS VPC料金ページをご確認ください。
Client VPN エンドポイント関連付け(Subnet Association)
- サブネット関連付け料金: $0.15/時間(東京リージョン)
- 1エンドポイントあたり2AZ(2サブネット)を想定
- 2エンドポイント × 2AZ = 4サブネット関連付け
- 月額: $0.15 × 24時間 × 30日 × 4 = 約$432
Client VPNは各AZに1つのサブネットを関連付ける必要があり、サブネット関連付け毎に課金されます。高可用性のため通常2AZ以上での構成が推奨されます。
参考: AWS Client VPN - サブネット関連付けコスト削減
接続時間料金
- 接続料金: $0.05/時間
- 例:10ユーザーが1日8時間接続
- $0.05 × 8時間 × 30日 × 10ユーザー = 約$120
データ転送料金
- データ転送(アウト): $0.114/GB(最初の10TBまで、東京リージョン)
- 例:1ユーザーあたり月10GB使用
- $0.114 × 10GB × 10ユーザー = 約$11.4
NAT Gateway
- NAT Gateway時間料金: $0.062/時間(東京リージョン)
- 月額: $0.062 × 24時間 × 30日 = 約$44.64
- データ処理料金: $0.062/GB
- 例:月100GB処理
- $0.062 × 100GB = 約$6.2
Elastic IP
- 使用中のPublic IPv4アドレス: $0.005/時間
- 月額(1個): $0.005 × 24時間 × 30日 = 約$3.6
- 参考: AWS VPC料金 - Public IPv4アドレス
月額コスト概算(10ユーザー想定、2AZ構成、東京リージョン)
- サブネット関連付け(4個): $432
- 接続時間: $120
- データ転送: $11.4
- NAT Gateway: $50.84
- Elastic IP: $3.6
- 合計: 約$617.84/月
実際のコストは使用状況により変動します。特に接続時間とデータ転送量によって大きく変わるため、CloudWatchでモニタリングすることをお勧めします。
Terraformコードの公開
今回作成したコードを公開しています。
公開時点では、鍵などサンプルファイルはそのまま入れておりますが、テストで利用しているAWSアカウントは削除済みとなります。
まとめ
AWS Client VPNとIAM Identity Centerを組み合わせることで、以下を実現できました:
- PC版:IIC + MFAによる強固な認証
- Mobile版:証明書認証によるセキュリティ担保
- 固定IPアドレス(Elastic IP)でのインターネット接続
- ユーザー管理の一元化
証明書認証の場合、証明書の実装とIdP Federationの設定が少しややこしいため、Terraformなどで作成することをお勧めします。
また、コスト面も考慮しながら、自社の要件に合わせた構成を検討してください。









