AWS Client VPNの認証方式がシングルサインオン (SAML 2.0 のフェデレーション認証)の場合、OpenVPN easy-rsaの証明書の作成と更新手順まとめ
はじめに
AWS Client VPNの認証方式がSSO認証の場合、OpenVPN easy-rsaを使用して自己証明書を更新する方法が分からなかったため、作成と更新の手順をまとめました。
証明書の作成と更新方法については、相互認証の場合は様々な参考記事がありますが、SSO認証の場合は参考記事がなく、作成および更新の手順が異なります。
相互認証の場合、クライアント証明書とサーバー証明書の両方が必要ですが、SSO認証の場合はサーバー証明書のみの作成で十分です。
したがって、SSO認証で必要なサーバー証明書の作成と更新手順について説明します。
構成図
構成は以下のようになります。Client VPNを使用してVPC経由でインターネットにアクセスします。
今回は、証明書の作成更新がメインですので、Client VPNの構成は、何でもよいです。
事前準備
- SSO認証の場合、サービスプロバイダーが様々ありますので、事前にプロバイダー側の設定とAWS IAM 側のIDプロバイダーの設定しておきます。
- oktaを利用する場合、以下が参考になります
- 今回は、以下のように、VPCやサブネットは作成しておきます
証明書の作成
おおよその証明書の作成は、ドキュメントと似ておりますが、相互認証ではないため、クライアント証明書の作成は不要です。
AWS CloudShellで証明書を作成しますので、CloudShellにアクセスします。
まず、opensslをインストールします。
$ sudo yum install openssl -y
OpenVPN easy-rsa リポジトリのクローンして、easy-rsa/easyrsa3
フォルダに移動します。
$ git clone https://github.com/OpenVPN/easy-rsa.git $ cd easy-rsa/easyrsa3
次に、varsファイル内の証明書の有効期限などの設定を変えます。(デフォルトでよければ、スキップ)
easy-rsa/easyrsa3 $ cp -p vars.example vars easy-rsa/easyrsa3 $ vim vars
今回は、あえて有効期限を2日に設定しました。各々有効期限を設定してください。こちらがデフォルトの設定です
#set_var EASYRSA_CA_EXPIRE 3650 #set_var EASYRSA_CERT_EXPIRE 825 set_var EASYRSA_CERT_EXPIRE 2 # set_var EASYRSA_CRL_DAYS 180 set_var EASYRSA_CRL_DAYS 2 # set_var EASYRSA_PRE_EXPIRY_WINDOW 90 set_var EASYRSA_PRE_EXPIRY_WINDOW 2
EASYRSA_CA_EXPIRE
:ルート証明書の有効期限(日)を指定- 今回は、変更しない
EASYRSA_CERT_EXPIRE
:証明書の有効期限(日)を指定EASYRSA_CRL_DAYS
:失効リストの有効期限(日)を指定EASYRSA_PRE_EXPIRY_WINDOW
:証明書の更新可能日を指定- 以前は、
EASYRSA_CERT_RENEW
でしたが、EASYRSA_PRE_EXPIRY_WINDOW
に変わりました。 - 更新可能日とは、例えば
EASYRSA_PRE_EXPIRY_WINDOW
が30の場合、有効期限が30日未満の場合、更新できます
- 以前は、
EASYRSA_CERT_EXPIRE
とEASYRSA_CRL_DAYS
は、どちらかの期限が切れたらVPN接続できませんので、値を合わせましょう。
ちなみに、有効期限と失効の違いは、以下です
- 証明書の有効期限が切れると証明書は使用できなくなりますが、更新手続きを経ることで新しい証明書を入手することができます。
- 失効した証明書は、その信頼性が破棄され、更新することはできず、新しい証明書が必要です。
新しい PKI 環境を初期化します。
easy-rsa/easyrsa3 $ ./easyrsa init-pki Notice ------ 'init-pki' complete; you may now create a CA or requests. Your newly created PKI dir is: * /home/cloudshell-user/easy-rsa/easyrsa3/pki
/home/cloudshell-user/easy-rsa/easyrsa3
配下にpkiが作成されました
新しい認証局 (CA) を構築します。
easy-rsa/easyrsa3 $ ./easyrsa build-ca nopass Notice ------ 'init-pki' complete; you may now create a CA or requests. Your newly created PKI dir is: * /home/cloudshell-user/easy-rsa/easyrsa3/pki * Using Easy-RSA configuration: /home/cloudshell-user/easy-rsa/easyrsa3/vars
途中で、以下のようにCommon Name を問われますが、デフォルトのEasy-RSA CAのままで構いませんので、空白のままEnterを押します。
Common Name (eg: your user, host, or server name) [Easy-RSA CA]: A creation complete. Your new CA certificate is at: * /home/cloudshell-user/easy-rsa/easyrsa3/pki/ca.crt
/home/cloudshell-user/easy-rsa/easyrsa3/pki/
配下に、ca.crtが作成されました。
サーバー証明書とキーを生成します。コマンド実行時、確認されますので、yesと入力します。
easy-rsa/easyrsa3 $ ./easyrsa build-server-full server nopass Type the word 'yes' to continue, or any other input to abort. Continue with renewal: yes * Using Easy-RSA configuration: /home/cloudshell-user/easy-rsa/easyrsa3/vars
server.crtの中身は、有効期限が2日であることが確認できます。
easy-rsa/easyrsa3 $ cat pki/issued/server.crt Signature Algorithm: sha256WithRSAEncryption Issuer: CN=Easy-RSA CA Validity Not Before: Jun 9 02:50:58 2023 GMT Not After : Jun 11 02:50:58 2023 GMT
サーバー証明書とキーをACMにアップロードします
easy-rsa/easyrsa3 $ mkdir server-cert easy-rsa/easyrsa3 $ cp pki/ca.crt ./server-cert/ easy-rsa/easyrsa3 $ cp pki/issued/server.crt ./server-cert/ easy-rsa/easyrsa3 $ cp pki/private/server.key ./server-cert/ easy-rsa/easyrsa3 $ cd ./server-cert/ easy-rsa/easyrsa3/server-cert $ aws acm import-certificate \ --certificate fileb://server.crt \ --certificate-chain fileb://ca.crt \ --private-key fileb://server.key //下記が表示されれば、成功 { "CertificateArn": "arn:aws:acm:ap-northeast-1:AWSアカウントID:certificate/ランダム文字列" }
ACMにアップロードされていることがわかります。
最後に、更新作業でeasy-rsaを再利用するため、ZIP化してダウンロードします
$ cd $ zip -r easy-rsa.zip ./easy-rsa
パスは、/home/cloudshell-user/easy-rsa.zip
です
エラー
opensslをインストールしていない場合、以下のエラーが出ます。
easy-rsa/easyrsa3 $ ./easyrsa renew server nopass * Using Easy-RSA configuration: /home/cloudshell-user/easy-rsa/easyrsa3/vars Easy-RSA error: * OpenSSL must either exist in your PATH or be defined in your vars file. Invalid SSL output for 'version': ./easyrsa: line 1085: openssl: command not found
openssl: command not found
とありますので、opensslをインストールしましょう。
更新の前に、クライアント VPN エンドポイントを作成してVPN接続を試します
Client VPNの構築
クライアント VPN エンドポイントは、以下の設定で作成します。
ちなみに、セキュリティグループは、インバウンドは許可せず、アウトバウンドは、0.0.0.0/0で全開放しています。
ターゲットネットワーク
エンドポイントと紐づく ENI が生成されるサブネットを選択します。サブネットは、構成図でいうところのパブリックサブネットを選択しました。
承認ルール
承認ルールは、Client VPN 経由でアクセス可能なネットワークとユーザーを制御します。
今回は、全ユーザーにインターネットにアクセスできるように、0.0.0.0/0を設定します
基本的には、作成済みですが、なければ作成しましょう
ルートテーブルを作成
Client VPN に紐付けるルートテーブルが存在します。
インターネットにアクセスできるように、0.0.0.0/0のテーブルを作成します。
ClientVPNを利用する
クライアント設定ファイルをダウンロードします。
接続クライアントの設定
インストールした、AWS Client VPN の接続クライアントを起動します。
メニューのファイルからプロファイルを管理をクリックします。
[プロファイルの追加]から表示名をokta-vpn
にして、先程ダウンロードしたdownloaded-client-config.ovpn
ファイルを指定し、[プロファイルを追加]をクリックします。
そして、接続をします。
シングルサインオンのプロバイダーのログイン画面に遷移しますので、ログイン情報を入力すると、VPNの接続が成功します。
証明書の更新
接続できることは、確認できましたので、ACMにアップロードしたサーバー証明書を更新します。
ZIP化したeasy-rsaをCloudShellにアップロードします
ZIP化したeasy-rsaを解凍しつつ、opensslをインストールします
$ unzip easy-rsa.zip $ sudo yum install openssl -y $ cd easy-rsa/easyrsa3
証明書の更新前に、varsファイル内の証明書の有効期限などの設定を変えます。(変更がなければ、スキップ)
easy-rsa/easyrsa3 $ vim vars
有効期限を変えたい場合、以下の3つの変数を意識して変えましょう。今回は、変えません。
set_var EASYRSA_CERT_EXPIRE 2 set_var EASYRSA_CRL_DAYS 2 set_var EASYRSA_PRE_EXPIRY_WINDOW 2
証明書を更新します。コマンド実行時、確認されますので、yesと入力します。
easy-rsa/easyrsa3 $ ./easyrsa renew server nopass Type the word 'yes' to continue, or any other input to abort. Continue with renewal: yes Certificate created at: * /home/cloudshell-user/easy-rsa/easyrsa3/pki/issued/server.crt Notice ------ Renew was successful.
Renew was successful.
と表示されると、更新成功です。
/home/cloudshell-user/easy-rsa/easyrsa3/pki/issued
配下に、server.crt(サーバー証明書)が作成されました。
server.crtの中身は、有効期限が更新されていることが確認できます。
easy-rsa/easyrsa3 $ cat pki/issued/server.crt Signature Algorithm: sha256WithRSAEncryption Issuer: CN=Easy-RSA CA Validity Not Before: Jun 9 03:57:38 2023 GMT Not After : Jun 11 03:57:38 2023 GMT
server.crtをserver-cert/
配下にコピーします。また、server.crt以外は、更新されていないことも確認しておきます。
easy-rsa/easyrsa3 $ cp pki/issued/server.crt server-cert/ easy-rsa/easyrsa3 $ ls -la server-cert/ total 24 drwxrwxr-x 2 cloudshell-user cloudshell-user 4096 Jun 9 02:53 . drwxrwxr-x 5 cloudshell-user cloudshell-user 4096 Jun 9 02:52 .. -rw------- 1 cloudshell-user cloudshell-user 1172 Jun 9 02:52 ca.crt -rw------- 1 cloudshell-user cloudshell-user 4552 Jun 9 04:00 server.crt -rw------- 1 cloudshell-user cloudshell-user 1704 Jun 9 02:53 server.key
更新したserver.crtを含めてACMにアップロードします。--certificate-arn
のARNは、作成したACMのARNです。
easy-rsa/easyrsa3 $ cd server-cert/ easy-rsa/easyrsa3/server-cert $ aws acm import-certificate --certificate fileb://server.crt \ --certificate-chain fileb://ca.crt \ --private-key fileb://server.key \ --certificate-arn arn:aws:acm:ap-northeast-1:アカウントID:certificate/ランダムな文字列 { "CertificateArn": "arn:aws:acm:ap-northeast-1:アカウントID:certificate/ランダムな文字列" }
ACMも失効日が更新されたことが確認できます。本来、有効期限も伸びますが、同日に証明書の作成と更新をしましたので、変わっておりません。
更新後、VPNも利用できることを確認しておきましょう。
更新したeasy-rsaは、不要なので、削除しましょう。
$ cd $ rm -R easy-rsa rm: remove write-protected regular file ‘easy-rsa/.git/objects/pack/pack-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.idx’? yes rm: remove write-protected regular file ‘easy-rsa/.git/objects/pack/pack-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.pack’? yes $ easy-rsa.zip
次回更新する場合
次回更新する場合、最初に作成してZIP化したeasy-rsa.zipを解凍して、更新作業を行います。
更新作業を行い、ACMにアップロード後のeasy-rsaは、不要なので削除して構いません。
最初に作成してZIP化したeasy-rsa.zipのみ保管しておきましょう!
証明書が失効した場合
ACMにアップロードした証明書が、更新する前に有効期限を過ぎた場合、再度証明書を作成する必要があります。