開発者ドキュメント

Ubuntu20.04でOpenVPNサーバーをセットアップおよび構成する方法

序章

仮想プライベートネットワーク(VPN)を使用すると、信頼できないネットワークを、プライベートネットワーク上にいるかのようにトラバースできます。 ホテルやコーヒーショップのWiFiなど、信頼できないネットワークに接続している場合は、スマートフォンやラップトップからインターネットに安全かつ確実にアクセスできます。

HTTPS接続と組み合わせると、この設定により、ワイヤレスログインとトランザクションを保護できます。 地理的な制限や検閲を回避し、場所と暗号化されていないHTTPトラフィックを信頼できないネットワークから保護することができます。

OpenVPN は、幅広い構成に対応するフル機能のオープンソーストランスポート層セキュリティ(TLS)VPNソリューションです。 このチュートリアルでは、Ubuntu 20.04サーバーでOpenVPNをセットアップし、クライアントマシンからアクセスできるように構成します。

注: DigitalOcean DropletにOpenVPNサーバーをセットアップする場合は、多くのホスティングプロバイダーと同様に、帯域幅の超過に対して課金されることに注意してください。 このため、サーバーが処理しているトラフィックの量に注意してください。

詳細については、このページを参照してください。

前提条件

このチュートリアルに従うには、次のものが必要です。

注: OpenVPNサーバーまたはローカルマシンをCAとして使用することは技術的には可能ですが、VPNがセキュリティの脆弱性にさらされる可能性があるため、これはお勧めしません。 公式のOpenVPNドキュメントに従って、証明書要求のインポートと署名専用のスタンドアロンマシンにCAを配置する必要があります。 このため、このガイドでは、CAが別のUbuntu 20.04サーバー上にあり、sudo権限と基本ファイアウォールが有効になっている非rootユーザーもいることを前提としています。

それに加えて、OpenVPNサーバーへの接続に使用するクライアントマシンが必要になります。 このガイドでは、これをOpenVPNクライアントと呼びます。 このチュートリアルでは、ローカルマシンをOpenVPNクライアントとして使用することをお勧めします。

これらの前提条件が整ったら、Ubuntu20.04でOpenVPNサーバーのセットアップと構成を開始する準備が整います。

注:これらのサーバーの構成中にパスワード認証を無効にすると、このガイドの後半でサーバー間でファイルを転送するときに問題が発生する可能性があることに注意してください。 この問題を解決するには、各サーバーでパスワード認証を再度有効にすることができます。 または、サーバーごとにSSHキーペアを生成してから、OpenVPNサーバーの公開SSHキーをCAマシンのauthorized_keysファイルに追加することもできます。その逆も可能です。 これらのソリューションのいずれかを実行する方法については、 Ubuntu20.04でSSHキーを設定する方法を参照してください。

ステップ1—OpenVPNとEasy-RSAのインストール

このチュートリアルの最初のステップは、OpenVPNとEasy-RSAをインストールすることです。 Easy-RSAは、OpenVPNサーバーで使用する公開鍵インフラストラクチャ(PKI)管理ツールであり、証明書要求を生成してから、CAサーバーで検証してサインオンします。

まず、OpenVPNサーバーのパッケージインデックスを更新し、OpenVPNとEasy-RSAをインストールします。 どちらのパッケージもUbuntuのデフォルトのリポジトリで利用できるため、インストールにaptを使用できます。

  1. sudo apt update
  2. sudo apt install openvpn easy-rsa

次に、OpenVPNサーバー上に~/easy-rsaという非rootユーザーとして新しいディレクトリを作成する必要があります。

  1. mkdir ~/easy-rsa

次に、作成した~/easy-rsaディレクトリにパッケージがインストールしたeasyrsaスクリプトからシンボリックリンクを作成する必要があります。

  1. ln -s /usr/share/easy-rsa/* ~/easy-rsa/

注:他のガイドがeasy-rsaパッケージファイルをPKIディレクトリにコピーするように指示する場合がありますが、このチュートリアルではシンボリックリンクアプローチを採用しています。 その結果、easy-rsaパッケージへの更新は、PKIのスクリプトに自動的に反映されます。

最後に、ディレクトリの所有者がroot以外のsudoユーザーであることを確認し、chmodを使用してそのユーザーへのアクセスを制限します。

  1. sudo chown sammy ~/easy-rsa
  2. chmod 700 ~/easy-rsa

これらのプログラムがインストールされ、システムの適切な場所に移動されたら、次のステップは、OpenVPNサーバー上に公開鍵インフラストラクチャ(PKI)を作成して、クライアントやその他のサーバーのTLS証明書を要求および管理できるようにすることです。 VPNに接続します。

ステップ2—OpenVPN用のPKIを作成する

OpenVPNサーバーの秘密鍵と証明書を作成する前に、OpenVPNサーバー上にローカルの公開鍵インフラストラクチャディレクトリを作成する必要があります。 このディレクトリを使用して、CAサーバー上で直接作成するのではなく、サーバーとクライアントの証明書要求を管理します。

OpenVPNサーバー上にPKIディレクトリを構築するには、varsというファイルにいくつかのデフォルト値を入力する必要があります。 最初にcdeasy-rsaディレクトリに配置し、次にnanoまたはお好みのテキストエディタを使用してvarsファイルを作成および編集します。

  1. cd ~/easy-rsa
  2. nano vars

ファイルを開いたら、次の2行を貼り付けます。

〜/ easy-rsa / vars
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"

これらは、認証局として使用されないため、OpenVPNサーバー上のこのvarsファイルに必要な2行だけです。 これにより、秘密鍵と証明書要求が、最新の楕円曲線暗号(ECC)を使用して、クライアントとOpenVPNサーバーの鍵と安全な署名を生成するように構成されていることが保証されます。

OpenVPNおよびCAサーバーをECCを使用するように構成すると、クライアントとサーバーが共有対称鍵を確立しようとしたときに、楕円曲線アルゴリズムを使用して交換を行うことができます。 鍵交換にECCを使用すると、従来のRSAアルゴリズムでプレーンなDiffie-Hellmanを使用するよりも大幅に高速になります。これは、数値がはるかに小さく、計算が高速であるためです。

背景:クライアントがOpenVPNに接続するとき、クライアントは非対称暗号化(公開鍵/秘密鍵とも呼ばれます)を使用してTLSハンドシェイクを実行します。 ただし、暗号化されたVPNトラフィックを送信する場合、サーバーとクライアントは対称暗号化を使用します。これは共有キー暗号化とも呼ばれます。

非対称暗号化と比較して、対称暗号化の計算オーバーヘッドははるかに少なくなります。使用される数ははるかに少なく、最新のCPU は命令を統合して、最適化された対称暗号化操作を実行します。 非対称暗号化から対称暗号化に切り替えるために、OpenVPNサーバーとクライアントは楕円曲線ディフィーヘルマン(ECDH)アルゴリズムを使用して、共有秘密鍵について可能な限り迅速に合意します。

varsファイルにデータを入力したら、PKIディレクトリの作成に進むことができます。 これを行うには、init-pkiオプションを指定してeasyrsaスクリプトを実行します。 前提条件の一部としてCAサーバーでこのコマンドをすでに実行しましたが、OpenVPNサーバーとCAサーバーには別々のPKIディレクトリがあるため、ここで実行する必要があります。

  1. ./easyrsa init-pki

OpenVPNサーバーでは、認証局を作成する必要がないことに注意してください。 CAサーバーは、証明書の検証と署名に単独で責任を負います。 VPNサーバー上のPKIは、証明書要求と公開証明書を保存するための便利で一元化された場所としてのみ使用されます。

OpenVPNサーバーでPKIを初期化したら、次のステップに進む準備ができています。次のステップでは、OpenVPNサーバーの証明書要求と秘密鍵を作成します。

ステップ3—OpenVPNサーバー証明書リクエストと秘密鍵の作成

OpenVPNサーバーにすべての前提条件がインストールされたので、次のステップは、OpenVPNサーバーで秘密鍵と証明書署名要求(CSR)を生成することです。 その後、リクエストをCAに転送して署名し、必要な証明書を作成します。 署名された証明書を取得したら、それをOpenVPNサーバーに転送し直して、サーバーが使用できるようにインストールします。

開始するには、root以外のユーザーとしてOpenVPNサーバーの~/easy-rsaディレクトリに移動します。

  1. cd ~/easy-rsa

次に、gen-reqオプションを指定してeasyrsaを呼び出し、その後にマシンの共通名(CN)を付けます。 CNは好きなものにすることができますが、わかりやすいものにするのに役立ちます。 このチュートリアル全体を通して、OpenVPNサーバーのCNはserverになります。 nopassオプションも必ず含めてください。 そうしないと、リクエストファイルがパスワードで保護され、後で権限の問題が発生する可能性があります。

注:ここでserver以外の名前を選択した場合は、以下の手順の一部を調整する必要があります。 たとえば、生成されたファイルを/etc/openvpnディレクトリにコピーする場合は、正しい名前に置き換える必要があります。 また、後で/etc/openvpn/server.confファイルを変更して、正しい.crtおよび.keyファイルを指すようにする必要があります。

  1. ./easyrsa gen-req server nopass
Output
Common Name (eg: your user, host, or server name) [server]: Keypair and certificate request completed. Your files are: req: /home/sammy/easy-rsa/pki/reqs/server.req key: /home/sammy/easy-rsa/pki/private/server.key

これにより、サーバーの秘密鍵とserver.reqという証明書要求ファイルが作成されます。 サーバーキーを/etc/openvpn/serverディレクトリにコピーします。

  1. sudo cp /home/sammy/easy-rsa/pki/private/server.key /etc/openvpn/server/

これらの手順を完了すると、OpenVPNサーバーの秘密鍵が正常に作成されました。 OpenVPNサーバーの証明書署名要求も生成しました。 これで、CSRはCAによる署名の準備が整いました。 このチュートリアルの次のセクションでは、CAサーバーの秘密鍵を使用してCSRに署名する方法を学習します。

ステップ4—OpenVPNサーバーの証明書リクエストに署名する

前の手順で、OpenVPNサーバーの証明書署名要求(CSR)と秘密鍵を作成しました。 ここで、CAサーバーはserver証明書について認識し、それを検証する必要があります。 CAが証明書を検証してOpenVPNサーバーに中継すると、CAを信頼するクライアントはOpenVPNサーバーも信頼できるようになります。

OpenVPNサーバーで、root以外のユーザーとして、SCPまたは別の転送方法を使用して、server.req証明書要求をCAサーバーにコピーして署名します。

  1. scp /home/sammy/easy-rsa/pki/reqs/server.req sammy@your_ca_server_ip:/tmp

前提条件Ubuntu20.04 チュートリアルで認証局(CA)をセットアップおよび構成する方法に従った場合、次のステップはCAサーバーに非ルートとしてログインすることです。 CAを管理するために作成したユーザー。 cdをPKを作成した~/easy-rsaディレクトリに移動し、easyrsaスクリプトを使用して証明書要求をインポートします。

  1. cd ~/easy-rsa
  2. ./easyrsa import-req /tmp/server.req server
Output
. . . The request has been successfully imported with a short name of: server You may now use this name to perform signing operations on this request.

次に、sign-reqオプションを指定してeasyrsaスクリプトを実行し、続いてリクエストタイプと共通名を実行して、リクエストに署名します。 リクエストタイプは、clientまたはserverのいずれかです。 OpenVPNサーバーの証明書リクエストを処理しているため、必ずserverリクエストタイプを使用してください。

  1. ./easyrsa sign-req server server

出力では、リクエストが信頼できるソースからのものであることを確認するように求められます。 yesと入力し、ENTERを押して確認します。

Output
You are about to sign the following certificate. Please check over the details shown below for accuracy. Note that this request has not been cryptographically verified. Please be sure it came from a trusted source or that you have verified the request checksum with the sender. Request subject, to be signed as a server certificate for 3650 days: subject= commonName = server Type the word 'yes' to continue, or any other input to abort. Confirm request details: yes . . . Certificate created at: /home/sammy/easy-rsa/pki/issued/server.crt

CA秘密鍵を暗号化した場合は、この時点でパスワードの入力を求められることに注意してください。

これらの手順が完了すると、CAサーバーの秘密鍵を使用してOpenVPNサーバーの証明書要求に署名したことになります。 結果のserver.crtファイルには、OpenVPNサーバーの公開暗号化キーとCAサーバーからの署名が含まれています。 署名のポイントは、CAサーバーを信頼するすべての人に、OpenVPNサーバーに接続するときにも信頼できることを伝えることです。

証明書の構成を完了するには、server.crtおよびca.crtファイルをCAサーバーからOpenVPNサーバーにコピーします。

  1. scp pki/issued/server.crt sammy@your_vpn_server_ip:/tmp
  2. scp pki/ca.crt sammy@your_vpn_server_ip:/tmp

ここでOpenVPNサーバーに戻り、ファイルを/tmpから/etc/openvpn/serverにコピーします。

  1. sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/server

これで、OpenVPNサーバーは接続を受け入れる準備がほぼ整いました。 次のステップでは、サーバーのセキュリティを強化するためにいくつかの追加のステップを実行します。

ステップ5—OpenVPN暗号化資料の構成

セキュリティをさらに強化するために、サーバーとすべてのクライアントがOpenVPNのtls-cryptディレクティブで使用する共有秘密キーを追加します。 このオプションは、サーバーとクライアントが最初に相互に接続するときに使用されるTLS証明書を難読化するために使用されます。 また、OpenVPNサーバーは、着信パケットのクイックチェックを実行するために使用します。パケットが事前共有キーを使用して署名されている場合、サーバーはそれを処理します。 署名されていない場合、サーバーはそれが信頼できないソースからのものであることを認識し、追加の復号化作業を実行することなく破棄できます。

このオプションは、OpenVPNサーバーが認証されていないトラフィック、ポートスキャン、およびサーバーリソースを占有する可能性のあるサービス拒否攻撃に確実に対処できるようにするのに役立ちます。 また、OpenVPNネットワークトラフィックの識別が困難になります。

tls-crypt事前共有キーを生成するには、OpenVPNサーバーの~/easy-rsaディレクトリで次のコマンドを実行します。

  1. cd ~/easy-rsa
  2. openvpn --genkey --secret ta.key

結果はta.keyというファイルになります。 /etc/openvpn/server/ディレクトリにコピーします。

  1. sudo cp ta.key /etc/openvpn/server

これらのファイルをOpenVPNサーバーに配置すると、VPNへの接続に使用するユーザーのクライアント証明書とキーファイルを作成する準備が整います。

ステップ6—クライアント証明書とキーペアの生成

クライアントマシンで秘密鍵と証明書の要求を生成し、それをCAに送信して署名することもできますが、このガイドでは、OpenVPNサーバーで証明書の要求を生成するプロセスの概要を説明します。 このアプローチの利点は、必要なすべてのキーと証明書を含むクライアント構成ファイルを自動的に生成するスクリプトを作成できることです。 これにより、キー、証明書、および構成ファイルをクライアントに転送する必要がなくなり、VPNに参加するプロセスが合理化されます。

このガイドでは、単一のクライアントキーと証明書のペアを生成します。 複数のクライアントがある場合は、クライアントごとにこのプロセスを繰り返すことができます。 ただし、すべてのクライアントのスクリプトに一意の名前の値を渡す必要があることに注意してください。 このチュートリアル全体を通して、最初の証明書/キーのペアはclient1と呼ばれます。

クライアント証明書とキーファイルを保存するために、ホームディレクトリ内にディレクトリ構造を作成することから始めます。

  1. mkdir -p ~/client-configs/keys

クライアントの証明書/キーのペアと構成ファイルをこのディレクトリに保存するため、セキュリティ対策として、今すぐアクセス許可をロックダウンする必要があります。

  1. chmod -R 700 ~/client-configs

次に、EasyRSAディレクトリに戻り、[X53X]

モバイルバージョンを終了