この記事はMobility Technologies Advent Calendar 2021の9日目です。
MoTでは、社内で利用してる数々のサービスやリソースに安全にアクセスできるようにするため、AWSのマネージドなVPNサービスである、AWS Client VPN環境を準備し、社内に展開しています。
この記事では、実際に利用してるこのAWS Client VPN環境の設定・構築内容をご紹介できればと思います。
SREグループ・ヒロチカです。MoTでは、サービスのクラウドインフラの設計から構築・運用までを担当しています。 MoT・SREグループでは、弊社内で利用している数々のサービスやツールに対し、リモートワーク先・出張先などのネットワーク環境から安全にアクセスしたいという要望を受け、AWS Client VPNサービスを活用し、VPN接続できる環境を社内に展開しています。
このAWS Client VPNの採用には、時間、準備コスト、運用面での負荷を考えた場合に、本格的に1からVPNサーバを用意して管理していく事が、現状のSRE業務と並行して行うには難しく、より手軽でマネージドなクラウドVPNソリューションがあればと、調査・検証したという経緯があります。特に、コロナ禍におけるリモートワーク推奨の流れにより、より利用頻度も高まっている中重宝しており、導入から今日まで大きなトラブルなく運用しています。 この記事では、そんな弊社で利用してるAWS Client VPNの構成や利用方法について、ご紹介したいと思います。
MoTでは、Client VPN Endpointを利用した、AWS Client VPNソリューションの一般的な構成で構築しています。
Client VPN Endpointを設定する前に、作成時に必要となる、VPN認証のためのサーバ・クライアント証明書を作成します。今回の証明書は、OpenVPN/easy-rsa3を利用し作成しました。
$ git clone https://github.com/OpenVPN/easy-rsa.git
$ cd easy-rsa/easyrsa3
$ ./easyrsa init-pki
中間証明書
$ ./easyrsa build-ca nopass
証明書の確認
$ ls pki/ca.crt
$ ls pki/private/ca.key
サーバ証明書 (CNは、各環境・設定に合わせて)
$ ./easyrsa build-server-full example-server.com nopass
証明書の確認
$ ls pki/issued/example-server.com.crt
$ ls pki/private/example-server.com.key
クライアント証明書
$ ./easyrsa build-client-full example-client.com
>> パスフレーズの入力
証明書の確認
$ ls pki/issued/example-client.com.crt
$ ls pki/private/example-client.com.key
ここで作成した、サーバ証明書・中間証明書をAWS Certificate Manager(ACM)に、予めに登録しておきます。
また、Client VPN Endpointを設定するためのVPCも準備します。Client VPN Endpointから、内部通信を行う場合に利用するプライベートサブネット、Client VPN Endpointから固定グローバルIPでの外部への通信も行うためのNAT Gateway + ElasticIPを設定したパブリックサブネットと、Internet Gatewayを設定し、ルートテーブルで通信経路の設定をしておきます。また、Client VPN Endpointには、SecurityGroupも設定できるため、必要に応じて接続元を絞ることも可能です。
それぞれ、構築するための環境が整ったら、いよいよClient VPN Endpointを設定していきます。作成時の項目として、ここまでに準備したリソースの情報をもとに設定を埋めていきます。
<注意点など>
Client VPN Endpoint設定後は、[関連付け] タブでプライベートサブネットを選択し、[認証][ルートテーブル]で、それぞれ経路設定を行えば、サーバ側のVPN環境の構築は完了となります。
なお、弊社ではこれらの一連のVPCリソースを、terraformにて構築し管理しています。
resource "aws_ec2_client_vpn_endpoint" "vpn-endpoint" {
description = "・・・description・・・"
client_cidr_block = "10.0.0.0/24"
server_certificate_arn = aws_acm_certificate.cert.arn
dns_servers = ["8.8.8.8", "8.8.4.4"]
authentication_options {
type = "certificate-authentication"
root_certificate_chain_arn = aws_acm_certificate.cert.arn
}
・・・
}
resource "aws_ec2_client_vpn_network_association" "vpn-network" {
client_vpn_endpoint_id = aws_ec2_client_vpn_endpoint.vpn-endpoint.id
subnet_id = aws_subnet.private-subnet.id
}
Client VPN Endpointの設定が完了すると、AWSのコンソール画面から、作成した Client VPN Endpointの、[クライアント設定のダウンロード]ができ、.ovpnファイルを手に入れることができます。このファイルには、中間証明書情報やリモート接続先が記載されています。
その.ovpnファイルに対して、利用したいクライアント証明書のcertやkeyの場所、keepalive設定などを修正・追記します。
client
dev tun
proto udp
remote cvpn-endpoint-XXXXXXXXXXX.XXXXX.region.amazonaws.com 443
・・・
keepalive 60 600
reneg-sec 0
<ca>
-----BEGIN CERTIFICATE-----
・・・
-----END CERTIFICATE-----
</ca>
cert example-client.com.crt
key example-client.com.key
編集した、.ovpnファイルを利用し、お好みのVPNクライアントソフトを利用して接続していきます。弊社では、VPNクライアントソフトとして Tunnelblick を利用しているユーザが多いです。
接続後、使用中のグローバルIPを確認し設定したElasticIPと同じであれば、正しく接続できている状態になります。
このVPN接続の構成では、社員PCユーザがVPNクライアントソフトを利用して接続を行うため、クライアント証明書一式(多くの場合.ovpnファイル)を、それぞれ社員PC上で利用することになります。万が一、この証明書情報が、漏洩した場合には、その証明書情報を持ったユーザであれば、誰でもVPNにアクセスできるようになってしまうため、社員PCユーザのキッティング時にユーザがクライアント証明書の情報を知りえない形で予め証明書などを設定しておくといった、セキュリティリスクへの対策を充分に配慮した運用にする必要があります。
Client VPN Endpointを利用した、AWS Client VPNの環境構築は、VPC周りの設定を理解していれば、簡単に設定する事ができるうえ、数年前に使い始めた頃から今日まで、大きな障害やトラブルもなく運用しており、弊社で利用中のAWSサービスの中でも、特に社内のネットワークインフラ面において、代え難いサービスの1つとなっています。
この記事が、お手軽にVPN環境を作りたいと考えているかたの一助になれば幸いです。
興味のある方は 採用ページ も見ていただけると嬉しいです。
Twitter @mot_techtalk のフォローもよろしくお願いします!