※こちらの記事は2019/11/13に更新しています。
こんにちは、ロジカルアーツの井川です。
今年は夏があっという間に終わってしまいましたね。朝晩も急に冷えてきて、最近風邪気味です。
はじめに
会社で固定IPアドレスを持っていないけど、お客さんのサイトにアクセスするのに固定IPアドレスが必要になってしまった!急にそんなこと言われても・・・その気持ちわかります。こういうケースでは、プロキシサーバやVPNを使用するのが一般的ですよね。弊社でもプロキシサーバを運用しているんですが、運用者が使用するのに管理者に使用開始と停止を申請しなければなりませんでした。業務効率化を考えたときにあまり綺麗な運用方法じゃないなぁと思っておりました。そんなときにAWSより新しくローンチされたClientVPNを知り、弊社では6月からClientVPNを導入しました。
今日はそもそもプロキシサーバやVPNとは?という方への用語解説から、新たなClientVPNまでをご紹介しようと思います。
プロキシサーバとは?VPNとは?
まずは、プロキシサーバやVPNとはどういったものなのか、簡単に用語の解説をします。既にご存じの方は飛ばしていただければと思います。
プロキシサーバとは?
プロキシ(Proxy)とは英語で代理を意味し、PC環境から何らかの理由で直接アクセスができないWebサイト等に対して”代理”でアクセスしてくれる仕組みです。
VPNとは?
VPNは正式名称が”Virtual Private Network”と言い、直訳すると仮想専用線を意味します。 その名の通り、インターネット上で安全にデータ通信をするために暗号化トンネルを用意してくれる仕組みです。
プロキシサーバとVPNの違い
2つの最も大きな違いは通信プロトコルによるところでしょう。
プロキシサーバはHTTP通信を行うことによって、VPNよりも通信が高速なケースがほとんどです。 デメリットは通信の暗号化をしないのでセキュアな接続は担保することができません。
VPNは暗号化通信に対応している分、セキュリティ対策とプライバシー保護に向いています。 デメリットは無料VPNは通信が遅かったり、有料サービスを利用する必要があったりします。
どういった用途で使われるのかによって、使い分けが必要ですね。
ClientVPNとは?
ClientVPNとは、AWSで作成したVPCリソース上にクライアント側と接続するためのエンドポイントを提供するサービスです。サーバ側はAWSが提供してくれるため、セットアップする必要はありません。運用者は自身のクライアント端末よりAWSリソースとのセキュアな接続を実現できます。
導入した背景
冒頭でも触れたのですが、弊社ではAWSのEC2を用いプロキシサーバを運用しています。 といっても常に使うわけではなく、必要にならないときはインスタンスはTerminateしています。
各部署の利用頻度
- 技術部: プロジェクトで必要になった場合は数か月間(数台が同時接続します)
- 管理部門: 月に数回程度
弊社のAWSアカウント管理者はAWSチームなんですが、運用者はプロキシサーバを使いたいときは、セキュリティの関係から都度AWSチームに連絡しなければなりませんでした。EC2の起動・停止を行うためです。
技術部は毎日、管理部門でも月に数回とは言え、毎度となると心理的にはすごく負担ですよね。そこを何とかできないかなというのが、今回ClientVPNの導入検証を始めたきっかけです。
やってみる
前置きが長くなりましたが、それでは実際にやってみましょう。
ClientVPNのアーキテクチャ
こちらがネットワーク構成図です。なんだか上のプロキシサーバよりも少し複雑に見えますね。
前提条件
- Windows10 Pro 64bit/Amazon Linux2 EC2インスタンス環境で検証する
- AWS CLIはインストール済み
- 接続に用いるVPCとサブネット、セキュリティグループを準備しておく
- セキュリティグループの開放ポートは下記の通り
タイプ | プロトコル | ポート範囲 | ソース |
---|---|---|---|
HTTPS | TCP | 443 | カスタム 0.0.0.0/0 |
自己署名証明書の発行とACMへ登録
私と同環境で検証するのであれば、EC2へSSHした状態で下記を実行ください。
自己署名証明書の発行準備
$ git clone https://github.com/OpenVPN/easy-rsa.git $ cd easy-rsa/easyrsa3 $ ./easyrsa init-pki $ ./easyrsa build-ca nopass
自己署名証明書発行
$ ./easyrsa build-server-full server nopass $ ./easyrsa build-client-full client1.domain.tld nopass
AWS CLIを使ってACMへ登録
※aws configure
を入力し、アクセスキーとシークレットアクセスキーでログインを行う必要があります。
$ aws acm import-certificate --certificate file://pki/issued/server.crt --private-key file://pki/private/server.key --certificate-chain file://pki/ca.crt --region ap-northeast-1 $ aws acm import-certificate --certificate file://pki/issued/client1.domain.tld.crt --private-key file://pki/private/client1.domain.tld.key --certificate-chain file://pki/ca.crt --region ap-northeast-1
上記の工程が問題なく終わり、ACMのコンソール画面に下記のように表示されればここまでは完了です。
クライアントVPNエンドポイントの作成
続いて、ClientVPNのコンソール画面を開きましょう。(VPC→クライアントVPCエンドポイント)
”クライアントVPCエンドポイント作成”をクリックすると下記の画面が表示されると思います。
入力事項
以下は画像の通り入力したパラメータになります。自分の設定合うよう調整していただければと思います。
項目名 | 内容 |
---|---|
名前タグ | ClientVpn |
説明 | ClientVpn |
クライアント IPv4 CIDR | 11.0.0.0/20 |
サーバー証明書 ARN | arn:aws:acm:ap-northeast-1:831461333044:certificate/bd224480-5aee-4cb4-8486-xxxxxxxxxxxxxx |
認証オプション | 相互認証の使用にチェック |
クライアント証明書 ARN | arn:aws:acm:ap-northeast-1:831461333044:certificate/72d483fc-cfba-4d5e-acc5-xxxxxxxxxxxxxx |
接続ログ記録 | いいえ |
- サーバー証明書ARNとクライアント証明書ARNはACMに登録したものをそれぞれ選択してください。
- 接続ログ記録を保持したい場合は CloudWatch Logs上でロググループ、ログストリームを作成する必要があります。
各種設定
ターゲットVPCへの関連付け
作成されたエンドポイントを選択すると、下にタブが開きますので、画像のように関連付け→ Associate と進んでください。
- 新たに画面が開いたら、予め準備しておいた任意のVPCとサブネットを選択してください。
セキュリティグループの適用
続いて、セキュリティグループの項目をクリックし、関連付けされたVPCを選択してからセキュリティグループの適用に進んでください。
- 新たに画面が開いたら、VPN接続が可能なセキュリティグループを選択してください。
認証の設定
続いて、認証の設定を行います。認証を開き Authorize Ingress をクリックしてください。
認証ルールの追加という画面が出てきたら、アクセスを有効にする送信先ネットワーク先として0.0.0.0/0
を入力。
その他の項目は変更なしで構いません。
ルートテーブルの作成
続いて、ルートテーブルを選択し、Create Route
に進んでください。
上記の画面が出たら、送信先は0.0.0.0/0
とし、先ほど関連付けで使用したサブネットを選択しましょう。
configファイルのダウンロード
設定が完了したら、反映された configファイルをダウンロードしていきましょう!下記から行えます。
クライアントソフトウェアのインストール
まず、OpenVPNをインストールします。
インストールが完了したら右下のインジケーターを確認してください。
パソコンのマークが表示されてればインストールは完了です。
ルートディレクトリは、変更していなければ下記になると思います。
C:\Program Files\OpenVPN
クライアントソフトウェアの設定
configファイルを保存
鍵専用のディレクトリを作成し、今まで発行した証明書や configファイルを下記の通りまとめちゃいましょう。ここではkey
ディレクトリを OpenVPN 直下に作成しています。
key/client1.domain.tld.crt key/client1.domain.tld.key key/downloaded-client-config.ovpn
configファイルの設定変更
key/downloaded-client-config.ovpn
を開き、下記のように変更ください。
remote cvpn-endpoint-xxxxxxxxxxxxxx.prod.clientvpn.ap-northeast-1.amazonaws.com 443
また、同ファイルの最下部に下記を追加ください。
cert <クライアント証明書へのファイルパス> key <証明書の秘密鍵へのファイルパス>
configファイルの選択
先ほどの OpenVPN のインジケーターを右クリックして、設定画面を開いてください。
Advanced→設定ファイルより、先ほど移動したkey/downloaded-client-config.ovpn
を選択してください。
そして、インジケーターの OpenVPN のアイコンを右クリックして「接続」を押し、下記のように表示されれば完了です。
この接続は ClientVPN のコンソール画面からも確認できます。
成果と今後の課題
ClientVPNを導入した弊社管理部門の利用料金(例) 週1回2時間×5週×2端末=20h (0.05×20h)+(0.15×5週×2端末)=2.5USD
※こちらの金額はAWS公式に確認したものですが、誤りがありましたので訂正いたします。
ClientVPNを導入することによって、EC2を使ってる時よりも無駄なコストを排除でき、運用者が好きな時にVPNを立ち上げて使用することができるようになりました。 ただ、料金面の課題がまだ残っています。ClientVPNに接続したまま長時間放置すると時間課金されてしまいます。忘れないように各自で管理することが必要です。
1か月間(1日24時間)止めずに稼働した場合の料金
★Client VPN
(0.05×24時間×30日)+0.15=40.5USD※接続端末1台の時※こちらの金額はAWS公式に確認したものですが、誤りがありましたので訂正いたします。 きちんとした料金計算は下記をご参考ください。 aws.amazon.com★EC2インスタンス
概算13.56USD
EC2 t3.micro×1 EBS 30GB Snapshot/データ転送量含まず
また、上記は1か月使用した際のプロキシサーバ(EC2)とClientVPNの料金なのですが、長時間の利用や多数の端末を使用する場合、ClientVPNのほうがどうしても高くなってしまいます。手軽に使える反面、費用がかかってしまっては元も子もないですよね・・・・。
こういった問題は今後の課題としたいと思います。