giftee Tech Blog

ギフティの開発を支えるメンバーの技術やデザイン、プロダクトマネジメントの情報を発信しています。

AWS Client VPNを社内で導入したら快適になったお話

はじめに

こんにちは、CTO室でコーポレートエンジニアしている垣内(@kakinotane)です。

普段は社内ネットワークの管理やIT統制、社内で利用するシステムに関する諸々を担当しております。

昨今(2020年9月現在)の情勢により、様々な企業がテレワークの導入を進めている中で、
セキュアな社内ネットワークやサービスへの接続方法として、VPNを導入している企業も多いかと思います。

そんな中、弊社も例に漏れず、このタイミングでAWS Client VPNを導入してみました。
(AWS Client VPNの詳しい説明は以下となります。)

https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-admin/what-is.html

今回は、そんなAWS Client VPNの導入に関するお話をしていきます。
結論から言ってしまえば、「こんなに好きになっちゃっていいの?」と思うぐらい、AWS Client VPNが気に入っています。
ちょっと言い過ぎたかも。なんでそんなに好きなの?と思った方は、ぜひ読んでみてください。

想定読者

  • VPN接続の安定性に課題を感じている方
  • AWSのサービスに興味のあるエンジニア
  • ギフティのコーポレートエンジニアが何をしているのか興味のある方

書くこと・書かないこと

書くこと

  • AWS Client VPN導入の背景
  • AWS Client VPNの構成図
  • AWS Client VPNの認証方法
  • 導入後の運用方法
  • 導入して良かった点
  • 今後の課題
  • まとめ

書かないこと

  • VPNの構築の手順および、ベーシックな構成の説明
    以下のサイトを参考に導入を進めさせていただきました。大変勉強になりました!
    気になる方はご参照いただければ幸いです。
    https://qiita.com/tomozo6/items/92382f57b747d325352b

AWS Client VPN導入の背景

元々、弊社では他のVPNを導入しておりましたが、先の説明のようにVPN利用者が急増していき、以下の課題点も徐々に見えてきました。

  • VPN接続が途中で切断されたり、接続速度が遅くなる
  • 1人あたりのVPN接続までの待ち時間が発生する
    (ライセンス付与等の運用負荷や、クライアントアプリケーションの一時的なエラーで止まるなど)

そんなある日弊社CTOが、AWSさんから紹介いただいたAWS Client VPNに目をつけて、今ある課題が解消できるのか試してみようということで、CTO室として、実際に環境構築をして試してみたというのが始まりとなります。

ちなみに、ここでは軽くコストの話に触れますが、元々使用していたVPNのほうはとてもお安くなっていました。
正直、AWS Client VPNはそのときの3倍の金額はかかっています。なので、コストを抑えてVPNを導入したいという方には、個人的には他のVPNをオススメしたいところですが、それでもなお、弊社がAWS Client VPNを導入した理由を知りたい方は、もうしばらくお付き合いください。

AWS VPN Clientの構成

弊社が構築した、AWS Client VPNの構成としては以下となります。

弊社の構成のポイントだけに絞って、解説させていただきます。

冗長化

  • マルチAZ対応とする(冗長化)
  • Clinet VPN Endpointにて自動で各NAT Gatewayに振り分ける
  • Elastic IPを2つ用意して、各NAT Gatewayに設定している

冗長化しない形でももちろんVPN接続は可能となりますが、万が一に備えて冗長化しています。
今回はElastic IPを2つ用意していますが、VPN接続したいシステムへのIPアドレスの許可設定が必要となります。お忘れなく。

クライアント鍵・証明書の発行

  • Private Subnetに立てたEC2でクライアント鍵・証明書を発行する。

また、運用目線のお話となりますが、最終的にユーザー(社員)に接続用の設定ファイル(ovpnファイル)を配布するのですが、その設定ファイルに追記する必要のある、クライアント鍵と証明書をセキュアな環境で発行したいと考え、Private Subnet上のEC2で発行するような構成としています。

AWS Client VPNの認証方法

AWS Client VPN(厳密に言えば、Clinet VPN Endpoint)の認証方法については、以下の2点が挙げられます。(両方の認証方法を併用も可能)

  • ActiveDirectoryによるアカウント管理
  • サーバ証明書・クライアント証明書による相互認証

弊社では、サーバ証明書・クライアント証明書による相互認証の方法を取って、認証することなりました。ActiveDirectoryが構築されておらず、できるだけコストを抑えて導入したい場合は、相互認証でまず導入されることをオススメします。

AWS Client VPNの運用方法

AWS Client VPNを管理する立場として、どう運用するかという点で少し悩んだので、その点を掘り下げていこうと思います。
運用するうえで大事なポイントは、以下の3点です。順番に見ていきましょう。

  • クライアントアプリケーションをインストールしてもらう
  • 設定ファイルの準備と配布
  • 設定ファイルの無効化

クライアントアプリケーションをインストールしてもらう

AWS公式にリリースしている、クライアントアプリケーションがあるので、これをユーザーにダウンロードして使用もらえば大丈夫です。接続までの設定が簡単すぎて、「え、これでいいの?」って思ってしまうぐらいですが、大丈夫です。
https://aws.amazon.com/jp/vpn/client-vpn-download/

設定ファイルの準備と配布

設定ファイルを配布していけばいいのですが、その準備が少し手間となります。 慣れてしまえば(もしくは、自動化してしまえば)簡単なはずなので、手動で行っていた際の流れをお伝えします。

相互認証でVPN接続する際には、AWSコンソール上のクライアントVPNエンドポイントの画面で、ovpnファイルをダウンロードして、それをユーザーに配布する必要があります。 ただ、ダウンロードしたものをそのまま配布しても接続はできないので、注意してください。

ダウンロードした、ovpnファイルには、個別で作成したクライアント証明書と鍵の記述を、追記してあげる必要があります。このタイミングで、クライアント証明書と鍵の発行もしています。以下、ovpnファイルにクライアント証明書と鍵の記述を追加したものとなります。

client
dev tun
proto udp
remote *.cvpn-endpoint-XXXXXXXXXXXXXXXX.clientvpn.ap-northeast-1.amazonaws.com 443
remote-random-hostname
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-GCM
verb 3
<ca>
-----BEGIN CERTIFICATE-----
XXXXXXXXXXXXXXXXXXXX
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
YYYYYYYYYYYYYYYYYYYY
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
ZZZZZZZZZZZZZZZZZZZZ
-----END PRIVATE KEY-----
</key>
reneg-sec 0

2つポイントがあるので、そちらも抜粋してお伝えします。

remote *.cvpn-endpoint-XXXXXXXXXXXXXXXX.clientvpn.ap-northeast-1.amazonaws.com 443

デフォルトのファイルですと、remote cvpn-endpointになっています。 *.を入れることによって、iPhoneからの接続エラーを防ぐことができます。 細かい点ですが、注意してください。(私はここで詰まりました)

<cert>
-----BEGIN CERTIFICATE-----
YYYYYYYYYYYYYYYYYYYY
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
ZZZZZZZZZZZZZZZZZZZZ
-----END PRIVATE KEY-----
</key>

ここが、クライアント証明書と鍵の記述を表しています。 ダウンロードしてきた、ovpnファイルにはこのように記述してあげてください。

こんな形で、手動で設定ファイルを準備して運用していました。 ただ、最近は手動でやるのが少し手間でしたので少し効率化しました。
ざっくりお伝えすると、以下のようなことを行っています。

  • ダウンロードしてきたovpnファイルをEC2上に置く
  • 個人名でクライアント証明書と鍵を作成し、その内容をovpnファイルに追記(自動化)

ここで準備をしたファイルは何らかの手段で、ユーザーに渡せば設定ファイルについては終わりです。
できれば、流出リスクの低い手段で渡すことが望ましいと思います。

設定ファイルの無効化

AWS公式で手順が公開されているものを参考にしています。これに沿っていけばOKです。 https://aws.amazon.com/jp/premiumsupport/knowledge-center/client-vpn-revoke-access-specific-client/

導入して良かった点

さて、弊社ではAWS Client VPNを導入してしばらく経ちましたが、良かった点としては以下が挙げられます。

  • 接続が切れない!(切れたという声を聞かないとも言える)
  • それなりに速度が早い!(遅いという声はあまり聞かない)
  • 接続するまでのユーザー側のセットアップが楽(これは社内でも多く言ってもらえて嬉しい)

そんな感じで、今まで抱えていた課題が解消できているので、冒頭お伝えしたように、個人的には気に入っています!
本当にいいことばかりなの?と思う方もいるかと思うのですが、もちろん課題もあります。

今後の課題

AWS Client VPN導入の背景でも触れたのですが、やはりコストの部分が以前に比べて、高くなっているというのが気になるところです。
AWS Client VPNを利用する際の料金の計算方法は以下を意識する必要があります。

  • Client VPN Endpointに関連付けられているサブネットの数 × 利用時間
  • アクティブなクライアント接続の数 × 利用時間

上記を踏まえた上で、弊社が今よりコストダウンさせるためには2点の方法を模索しています。

  • Client VPN Endpointに関連付けられているサブネットを業務時間外では関連付けを外す
    →0時〜7時まではサブネットを自動で外れ、7時以降は関連付けられるような仕組みづくりなど

  • 1人あたりの利用時間を減らしていく
    →利用時間が◯時間を超えたら、その段階で個人に通知がいく仕組みづくりなど。

対策はあくまでもパッと思っていることなので、果たしてそれを実装するかは置いておいて、うまくできたらまた共有したいなと思っています。逆に良い案をお持ちの方はお声がけいただけると嬉しいです!笑

まとめ

今回は、弊社内で行ったAWS Client VPNの導入背景から課題までご紹介させていただきました。
今後、AWS Client VPNを導入しようと考えられている方の参考になっていれば幸いです。構築の手間もそんなにかからないし、接続まで時間かからないし、接続切れないしで、今のところは最高というのが今回の感想でした。個人的には、社内の方から導入したことによって感謝の言葉をいただけて嬉しい限りです。
まだ課題も残っているので、そこも払拭していけるように精進します。それでは、ここまで読んでいただきましてありがとうございました!
トゥリマカシー!