🐡

AWS Client VPNを使ってAWSリソースへアクセスしてみた

2022/11/09に公開約4,900字

はじめに

AWS Client VPNを利用して、AWSリソースへのアクセス方法について調べてみたのでまとめて、
実際にOpenVPNを利用してAWSへアクセスも行ってみました。

AWSでCA認証局について

ここのURLに書いてある通り、AWSでプライベート認証機関を用意すると400ドルかかる上に、
プライベート証明書の数ごとに料金が発生するのでコスト節約の観点オレオレ認証局を立てて実施します。
https://aws.amazon.com/jp/certificate-manager/pricing/?nc=sn&loc=3

認証局の作成とクライアントの証明書とキーを生成

ADによるSimple ADを利用した接続方法もありますが、今回は相互認証を利用した接続を実施したいと思います。
https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-admin/client-authentication.html

OSはAmazonLinux2にて実施しています。
またEC2に対してAWSCertificateManagerFullAccessのロールを割り当てるようにしてください。
※後程AWSコマンドでACM にインポートするため

gitコマンドがインストールしていない場合にはgitコマンドをインストールしてください。
基本的には上記URLに記載のある通り実施していきます。

作業はec2-userフォルダで作業をします。
# cd /home/ec2-user/

OpenVPN easy-rsa リポジトリのクローンをローカルコンピュータに作成して、easy-rsa/easyrsa3 フォルダに移動
# git clone https://github.com/OpenVPN/easy-rsa.git
# cd easy-rsa/easyrsa3/

新しい PKI 環境を初期化
# ./easyrsa init-pki

新しい認証局 (CA) を構築
# ./easyrsa build-ca nopass

サーバー証明書とキーを生成
# ./easyrsa build-server-full server nopass

カスタムフォルダ作成
# mkdir published

認証局のCA証明書、サーバ証明書、キーをカスタムフォルダにコピー
# cp pki/ca.crt published/
# cp pki/issued/server.crt published/
# cp pki/private/server.key published/

カスタムフォルダに移動して、ACMへインポート
# aws acm import-certificate --certificate file://server.crt --private-key file://server.key --certificate-chain file://ca.crt --region ap-northeast-1

easyrsa3 フォルダに移動し、クライアント証明書の作成(CLIENT名は任意で記載)
# cd /home/ec2-user/easy-rsa/easyrsa3/
# ./easyrsa build-client-full CLIENT名 nopass

作成したクライアント証明書をカスタムフォルダにコピー
# cp pki/issued/CLIENT名.crt published/
# cp pki/private/CLIENT名.key published/

カスタムフォルダに移動して、ACMへインポート
# cd published/
# aws acm import-certificate --certificate file://CLIENT名.crt --private-key file://CLIENT名.key --certificate-chain file://ca.crt --region ap-northeast-1

※サーバ証明書はクライアントVPNエンドポイントを作成しているリージョンのACMに存在するようにしてください。

Client VPN Endpoint の作成

AWS Consoleにて、VPCサービスからClient VPN Endpointを作成します。

名前タグには任意の名前をクライアント IPv4 CIDR*には接続時の NAT で払い出される IP アドレスの範囲を設定しますので、
クライアントネットワーク、接続するAWSネットワークと被らないようにしてください。
CIDRは/16-/22の範囲で設定が可能です。

サーバ証明書ARN*には、先ほどアップロードしたサーバー証明書を選択し、認証オプションには相互認証の使用にチェックを入れます。
※ユーザーベースの認証を使用する際にはActive Directory 認証となるのでSimple ADが望ましいと思います。

クライアントログを保存したい場合にはCloudWatchLogsに保存ができます。
クライアント接続ハンドラは接続元IPによるアクセス制御を行いたい場合など有効にします。

DNSは特に指定せず、プロトコルはUDPとし、スプリットトンネルを有効にします。
スプリットトンネルとはインターネットをアクセスする際にVPNトンネルを経由せずに直接インターネットにアクセスします。
最後に接続するVPCとクライアントから接続するために許可されたセキュリティグループを選択して残りはデフォルトのままとして、
VPCエンドポイントを作成します。

作成したVPNエンドポイントにサブネットを関連付け

今のままでは接続できないので、サブネットをVPCエンドポイントに紐付けします。
https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-admin/cvpn-working-target.html#cvpn-working-target-associate

作成したVPCエンドポイントを選択し、関連付けタブより関連付けをクリックして、
関連付けしたいVPCとサブネットを選択して、関連付けをクリックします。
関連付けした直後は黄色マークで関連受け中と表示され、少し待つと関連付け済みになります。
注意が必要なのは関連付けされているサブネット数が増えると費用も増えます。
https://aws.amazon.com/jp/vpn/pricing/

作成したVPNエンドポイントに認証ルールを追加

作成したVPCエンドポイントを選択し、認証タブより受信の承認をクリックします。
VPNクライアントからアクセスさせるIPアドレスの範囲をアクセスを有効にする送信先ネットに記載し、
アクセスを付与する対象を全てのユーザーにアクセスを許可するにします。
AD認証を使う場合には特定のアクセスグループのユーザーへのアクセスを許可するになります。

作成したVPNエンドポイントに接続元制限

接続元制限を行いたい場合には作成したVPCエンドポイントを選択し、
セキュリティグループを選択し、セキュリティグループの適用をクリックします。
セキュリティグループについては事前に作成をするようにしてください。

クライアント側の設定

クライアントソフトウェアはOpenVPNを利用しています。

Windows版
https://www.openvpn.jp/download/

MAC版
https://openvpn.net/client-connect-vpn-for-mac-os/

インストールできたら、AWS Console から作成したVPNエンドポイントを選択して、クライアント設定のダウンロードをします。
また証明書による相互認証を行うためにクライアントの証明書とキーファイルもダウンロードします。
ダウンロードしたら.ovpnの拡張子ファイルをテキスト開き以下を修正します。
https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-admin/cvpn-working-endpoint-export.html

クライアント証明書とキーファイルの情報を末尾に記載します。

cert /path/*********.crt
key /path/*********.key

次にremote cvpn-endpointとなっているところをremote *.cvpn-endpointにします。
*の部分は任意でなんでもOKです。

修正が完了したらOpenVPNを立ち上げてプロファイルをインポートし、接続が成功すれば問題ありません。
念の為AWS内にあるEC2などへPINGなど実施して疎通確認を行なってください。

最後に

相互認証のみでのVPN Clientを実施しましたが、証明書が漏れたら誰でも接続できてしまうんだよなと思いつつ、
AD認証も合わせた方がいいのかどうなのか悩みどころです。
また今回オレオレ証明書をしていますが証明書の期限は必ずやってくるので更新を忘れずにしましょう。
更新期限を100年にするなどのやり方もあります。
認証局の設定ファイルを見るとサーバ証明書はデフォルトで825日となっているようです。
同じくCAの有効期限期限は3650日となっているようです。

# grep default_days "/home/ec2-user/easy-rsa/easyrsa3/openssl-easyrsa.cnf" 
default_days= $ENV::EASYRSA_CERT_EXPIRE# how long to certify for

# grep EASYRSA_CERT_EXPIRE "/home/ec2-user/easy-rsa/easyrsa3/vars.example"
#set_var EASYRSA_CERT_EXPIRE  825

# grep EASYRSA_CA_EXPIRE "/home/ec2-user/easy-rsa/easyrsa3/vars.example"
#set_var EASYRSA_CA_EXPIRE  3650

上記を任意の日数に変更して./easyrsa init-pkiを実施することで初期化することができます。
事前に有効日数を指定したい場合にはこちらを実施した上で進めてください。
期限を延ばすことで気をつけなきゃいけないのは使わないクライアント証明書は失効させるようにしましょう。
あとここまでやって最後調べていて気づいたのですが、AWSのハンズオン内容があるんですね。。。
https://catalog.us-east-1.prod.workshops.aws/workshops/be2b90c2-06a1-4ae6-84b3-c705049d2b6f/ja-JP

参考としてACM証明書を利用したやり方も見つけたのでクラスメソッド様のBLOG内容を引用させていただきます。
https://dev.classmethod.jp/articles/clientvpn-with-acm-public-certificates/#toc-1

終わり。

GitHubで編集を提案

Discussion

ログインするとコメントできます