同僚から、PrivatesubnetのEC2にリモート接続する方法を聞かれた際に
改めて調べたところClientVPNなる存在を知り試してみた。
どうやらオレオレ証明書を利用して、ClientVPC⇔クライアント間を相互認証するらしい。
(ActiveDirectory認証もできるようですが、今回は相互認証のみで試しています。)
とりあえず、下記の図の環境を作ってみた。
DNSサーバを置いた理由は、VPN張った時に名前解決どうなるの?といった疑問があったからです。
※DNSの検証は力尽きたので後日やる
https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-admin/client-authentication.html#mutual
Windows上で作成したらOpenVPNにパラメータが~と怒られたので、結局Linuxで実施しました。
WindowsでもLinuxで発行した証明書でも認証できました。どこか間違っていたのですねすみません。
①LinuxOSにログインして、下記コマンドを実施する。
#ec2-userログオンして実施した。 cd /home/ec2-user git clone https://github.com/OpenVPN/easy-rsa.git cd easy-rsa/easyrsa3 #PKI 環境を初期化します。 ./easyrsa init-pki #認証機関 (CA) を構築します。 ./easyrsa build-ca nopass #このコマンドの後に「Common Name (eg: your user, host, or server name) [Easy-RSA CA]:」とでるが何も入力しないでエンターでOK #サーバー証明書とキーを生成します。 ./easyrsa build-server-full server nopass #クライアント証明書とキーを生成します。 ./easyrsa build-client-full client1.domain.tld nopass #必要なファイルを集約します。 mkdir ~/custom_folder/ cp pki/ca.crt ~/custom_folder/ cp pki/issued/server.crt ~/custom_folder/ cp pki/private/server.key ~/custom_folder/ cp pki/issued/client1.domain.tld.crt ~/custom_folder cp pki/private/client1.domain.tld.key ~/custom_folder/ cd ~/custom_folder/
②~/custom_folder/内を確認する。
下記の5つのファイルが存在するはずです。無ければどこか間違えています。
・ca.crt
・client1.domain.tld.crt
・client1.domain.tld.key
・server.crt
・server.key
①AWSCLIを使用してACM(Certificate Manager)に登録します。
<ありがちなミス>
・EC2インスタンスからAWSCLIコマンドを実行したが、EC2にAWSCLIが入っていない。
・EC2にAWSCLIは入っているが、EC2にACMのロールがアタッチorIAMユーザのキーでプロファイルを作成していない。
#サーバー証明書とキー(regionは自身の環境に置き換えてください。) aws acm import-certificate --certificate fileb://server.crt --private-key fileb://server.key --certificate-chain fileb://ca.crt --region region #クライアント証明書とキー(regionは自身の環境に置き換えてください。) aws acm import-certificate --certificate fileb://client1.domain.tld.crt --private-key fileb://client1.domain.tld.key --certificate-chain fileb://ca.crt --region region
②ACMを確認して、下記のように登録されていれば、証明書の登録は完了です。
※後々クライアントPCのセットアップで使用するので、以下のファイルをSCP等でクライアントPCに格納しておいてください。
・client1.domain.tld.crt
・client1.domain.tld.key
最低限赤枠の設定をします。
・名前タグ:好きな名前で
・クライアントIPv4 CIDR:AWS内(VPC)で使用していないアドレス帯を指定する。サブネットマスクは/22以上で無いと作成できない。
■認証情報
・サーバー証明書 ARN:ACMに登録した「Server」の証明書
・認証オプション:相互認証の使用を選択
・クライアント証明書 ARN:ACMに登録した「client1.domain.tld」の証明書
■その他のオプションパラメータ
・VPC ID:接続したいEC2が置いてあるVPCを選択
・セキュリティグループID:接続したいEC2が置いてあるsubnetを選択
・セキュリティグループを選択:接続したいEC2が置いてあるsubnetのDefaultセキュリティグループを選択
※ここはまだ検証していないがDefaultセキュリティグループは以下の設定になっている。
インバウンドルール→タイプ:全てのトラフィック、プロトコル:すべて、ポート範囲:すべて、ソース:選択したセキュリティグループID
アウトバウンドルール→タイプ:すべてのトラフィック、プロトコル:すべて、ポート範囲:すべて、ソース:0.0.0.0/0
②設定したら[クライアントVPNエンドポイントの作成]をクリックする。
③ClientVPN作成後のイメージ
※この章の追加設定しないと待てど暮らせど設定が終わりません。
①[関連付け]タブの[関連付け]をクリックします。
②以下のように設定し[関連付け]をクリックします。
・VPC:接続したいEC2の置いてあるVPC
・関連付けるサブネットの選択:接続したいEC2の置いてあるサブネット
①[認証]タブの[受信の承諾]をクリックします。
③以下のように設定し[認証ルールの追加]をクリックします。
・アクセスを有効にする送信先ネット:接続したいEC2の置いてあるVPCのCIDR
・アクセスを付与する対象:すべてのユーザにアクセスを許可する
④しばらくするとClientVPNの状態が[使用可能]になります。※この待ち時間でクライアント側の設定をします。
Windows端末前提で記載します
①こちらのページのWindows版の手順を参照して、OpenVPNのインストールのみ実施します。
①クライアントVPNエンドポイントの画面から、作成したClientVPNを選択し[クライアント設定のダウンロード]をクリックします。
②クライアント設定ファイルを以下の通り編集します。
クライアントPCに格納の格納先が「C:\custom_folder」の前提で記載します。
③クライアント設定ファイルをエディタで開きます。
④設定ファイルの末尾に、以下の記述を追記して保存します。※\←バックスラッシュは2つずつ書く
cert C:\\custom_folder\\client1.domain.tld.crt key C:\\custom_folder\\client1.domain.tld.key
<設定ファイルの完成イメージ>
①タスクバーにOpenVPNのアイコンがあるので、右クリック→[Inport file]から、編集したクライアント設定ファイルを選択します。
②再度、タスクバーにOpenVPNのアイコンを、右クリック→[接続]をクリックすると以下の画面が表示されVPN接続完了となります。
構成図のEC2(10.0.2.67)に無事SSH接続できました。
今回はとりあえず繋げてみたお試し設定でしたが、チューニングできそうな項目が色々ありましたね。
仕事で使うことになったら考えよう。※DNSの検証は・・・後日やる・・・ぞ