技術1課の水本です。
最近はリモートワークの急激な需要から、AWS Client VPN(ClientVPN)を導入するお客様が増えてきました。
今回はその中でも導入が早い相互認証における証明書発行環境を高速にセットアップする方法をご紹介します。
- 相互認証とは・・・ClientVPN接続において、証明書を用いて認証を行う方法のことです。ADユーザーなど認証基盤の準備が不要で導入が早い一方、期限が切れてしまうと接続不可能になる為、期限日管理が必要です。
- AWS CloudShell(CloudShell)とは・・・AWSマネジメントコンソールで提供されるCLI環境です。ユーザーボリュームは1GBしかないものの、CLI、Python、Nodeがインストール済の環境で、サイズの小さなアプリケーションであればyumを用いて追加することが可能です。
さっそくやってみる
難しいことは特にしていません。
いくつか準備をしたうえで、公式ドキュメントから相互認証の「Linux/macOS」手順通りにやるだけです。
準備1.操作記録の開始
まず、script
コマンドを使って、操作記録を残します。
プロンプトがsh-4.2$
に変わったら、記録が始まっていますので、そのまま操作を続けてください。
# 作業ディレクトリをユーザーホームにする $ cd ~/ # 操作記録の開始 $ script easy-rsa_$(date '+%Y%m%d_%H%M').log
準備2.不足コンポーネントのインストール
必要となるopenssl
がCloudShellには含まれていないので、先にインストールしておきます。
$ sudo yum install openssl -y
...
...
Complete!
もしインストールを忘れると、途中で以下の表示で進めなくなります。
$ ./easyrsa build-ca nopass ./easyrsa: line 459: openssl: command not found Easy-RSA error: Missing or invalid OpenSSL Expected to find openssl command at: openssl
公式ドキュメント通りに操作する
準備ができたら、公式ドキュメント通りに証明書を発行します。
CloudShellはAWS CLIもセットアップ済ですので、ACMへのインポートもそのまま行えます。(※)
※aws configure
の実施は必要です。
これで特別なコンピュータや環境を用意することなく、証明書発行環境の準備から発行までができました。
exit
を入力することで操作記録が終了します。
なお、証明書発行環境は消失が許されません。
証明書は期限が迫ってきたら更新しないといけないからです。
消失を防ぐ為には、次からの手順でZipファイルとしてダウンロードしておくことを推奨します。
環境のZip化とダウンロード、環境の削除
証明書発行環境をZipに固めて、ローカルPCへ保存が可能です。
操作記録の移動
操作記録ファイルをeasy-rsaディレクトリに移動します。(ファイル名はサンプルですので、TABキーで補完するなど、間違えないようにしてください)
$ mv easy-rsa_20220120_1020.log easy-rsa/
環境のZip化
以下のコマンドで、環境をまるごとeasy-rsa.zip
の名前でZip化します。
$ cd ~/ $ zip easy-rsa.zip -r ./easy-rsa/
ファイルダウンロード
次にCloudShellの「Actions」メニューから「Download File」を選択します。
表示されたガイダンスにて、~/easy-rsa.zip
を入力します。
しばらく待つとファイル保存ウィンドウが開きますので、保存します。
もし社内規定上、証明書発行環境をそのまま置いておくことに抵抗があるなら、環境Zipをダウンロード後、CloudShellの「Actions」メニューから「Delete AWS CloudShell home directory」を選択すると環境がユーザーディレクトリごと破棄可能です。
ダウンロードしたファイルは証明書期限更新など(主に2年後以降)に再び使いますので、紛失しないようにしてください。
環境Zipのアップロードと展開、動作確認
構築時と違う人がCloudShellを使う場合や、CloudShellの環境を消去してしまった場合は、証明書発行環境がありませんので、待避した環境のアップロードと展開が必要です。
準備作業
作成時と同じ作業のため割愛しますが、必ず実施してください。
環境Zipファイルのアップロード
次に、CloudShellの「Actions」メニューから「Upload File」を選択します。
ファイルを選択してUploadしましょう。
Zipの展開
次にファイルを展開します。CloudShellにはunzipが導入済みです。
$ unzip easy-rsa.zip
展開が終了したら、正しく復元されているかチェックします。
$ cd ./easy-rsa/easyrsa3/pki/ $ ls ca.crt certs_by_serial index.txt index.txt.attr index.txt.attr.old index.txt.old issued openssl-easyrsa.cnf private renewed reqs revoked safessl-easyrsa.cnf serial serial.old $ openssl x509 -text -noout -in ca.crt Certificate: Data: Version: 3 (0x2) Serial Number: 8e:7a:e9:32:ec:64:ca:35 Signature Algorithm: sha256WithRSAEncryption Issuer: CN=Easy-RSA CA Validity Not Before: Jan 20 05:46:12 2022 GMT Not After : Jan 18 05:46:12 2032 GMT Subject: CN=Easy-RSA CA Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus:
正常に認識出来ています。
おまけ - クライアントVPN設定ファイルのカスタマイズ
公式ドキュメントに掲載されている、クライアントVPN設定ファイルのカスタマイズを実施できるスクリプトを掲載しておきます。
- 2,4,6行目の変数を環境に合わせて書き替えてご利用ください。ドキュメント通りであれば同じ名称です。
- すべてのファイルが同一場所にあることが前提です。クライアントVPN設定ファイルをアップロードして配置してください。
# クライアントVPNエンドポイント設定ファイル config_file="downloaded-client-config.ovpn" # クライアント証明書 client_cert="client1.domain.tld.crt" # クライアントキー client_key="client1.domain.tld.key" # DNS名ランダム化 remote_address=$(cat /dev/urandom | LC_ALL=C tr -dc 'a-z' | fold -w 10 | head -n 1).$(cat $config_file | grep amazonaws.com | cut -d' ' -f2) sed -i -e "s/$(cat $config_file | grep amazonaws.com | cut -d' ' -f2)/$remote_address/" $config_file # クライアント証明書追加 echo "<cert>" >>$config_file grep -A 30 'BEGIN CERTIFICATE' "$client_cert" >>$config_file echo "</cert>" >>$config_file # クライアントキー追加 echo "<key>" >>$config_file cat "$client_key" >>$config_file echo "</key>">>$config_file
まとめ
証明書発行の為だけなら専用PCやEC2を用意せずとも、CloudShellのみで解決できます。
作業が終わったら環境をダウンロードしてユーザーディレクトリを破棄することで、安全に運用することも可能です。
お読みいただきありがとうございました。