AWS Client VPNの認証方式がシングルサインオン (SAML 2.0 のフェデレーション認証)の場合、OpenVPN easy-rsaの証明書の作成と更新手順まとめ

2023.06.09

はじめに

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日に設定しました。各々有効期限を設定してください。こちらがデフォルトの設定です

easy-rsa/easyrsa3/vars

#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_EXPIREEASYRSA_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の接続が成功します。

こちらで自分が利用しているIPアドレスが分かります

証明書の更新

接続できることは、確認できましたので、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つの変数を意識して変えましょう。今回は、変えません。

easy-rsa/easyrsa3/vars

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.crtserver-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にアップロードした証明書が、更新する前に有効期限を過ぎた場合、再度証明書を作成する必要があります。

参考