AWS CloudShellで証明書発行環境を高速セットアップ

記事タイトルとURLをコピーする

技術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へのインポートもそのまま行えます。(※)

docs.aws.amazon.com

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」を選択します。

f:id:swx-masatoshi-mizumoto:20220120163551p:plain
メニューウィンドウ

表示されたガイダンスにて、~/easy-rsa.zipを入力します。
しばらく待つとファイル保存ウィンドウが開きますので、保存します。

f:id:swx-masatoshi-mizumoto:20220120163548p:plain
ダウンロードウィンドウ

もし社内規定上、証明書発行環境をそのまま置いておくことに抵抗があるなら、環境Zipをダウンロード後、CloudShellの「Actions」メニューから「Delete AWS CloudShell home directory」を選択すると環境がユーザーディレクトリごと破棄可能です。

ダウンロードしたファイルは証明書期限更新など(主に2年後以降)に再び使いますので、紛失しないようにしてください。

環境Zipのアップロードと展開、動作確認

構築時と違う人がCloudShellを使う場合や、CloudShellの環境を消去してしまった場合は、証明書発行環境がありませんので、待避した環境のアップロードと展開が必要です。

準備作業

作成時と同じ作業のため割愛しますが、必ず実施してください。

環境Zipファイルのアップロード

次に、CloudShellの「Actions」メニューから「Upload File」を選択します。

f:id:swx-masatoshi-mizumoto:20220120163551p:plain
メニューウィンドウ

ファイルを選択してUploadしましょう。

f:id:swx-masatoshi-mizumoto:20220120163544p:plain
アップロードウィンドウ

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のみで解決できます。
作業が終わったら環境をダウンロードしてユーザーディレクトリを破棄することで、安全に運用することも可能です。

お読みいただきありがとうございました。

水本 正敏(執筆記事の一覧)

クラウドインテグレーション部 技術1課

国内ITベンダーのカスタマーエンジニアからAWSに魅了されサーバーワークスへ。