Debian10でOpenVPNサーバーをセットアップする方法
このチュートリアルの以前のバージョンは、 JustinEllingwoodによって作成されました。
序章
ホテルやコーヒーショップのWiFiなどの信頼できないネットワークに接続しているときに、スマートフォンやラップトップからインターネットに安全かつ確実にアクセスしたいですか? 仮想プライベートネットワーク(VPN)を使用すると、信頼できないネットワークをプライベートネットワーク上にいるかのようにプライベートかつ安全にトラバースできます。 トラフィックはVPNサーバーから出て、宛先への移動を続けます。
HTTPS接続と組み合わせると、この設定により、ワイヤレスログインとトランザクションを保護できます。 地理的な制限や検閲を回避し、場所と暗号化されていないHTTPトラフィックを信頼できないネットワークから保護することができます。
OpenVPN は、幅広い構成に対応するフル機能のオープンソースのSecure Socket Layer(SSL)VPNソリューションです。 このチュートリアルでは、Debian 10サーバー上にOpenVPNサーバーをセットアップし、Windows、macOS、iOS、Androidからのアクセスを構成します。 このチュートリアルでは、これらの各セットアップのインストールと構成の手順を可能な限り簡単にします。
注: DigitalOcean DropletにOpenVPNサーバーをセットアップする場合は、多くのホスティングプロバイダーと同様に、帯域幅の超過に対して課金されることに注意してください。 このため、サーバーが処理しているトラフィックの量に注意してください。
詳細については、このページを参照してください。
前提条件
このチュートリアルを完了するには、OpenVPNサービスをホストするためのDebian10サーバーにアクセスする必要があります。 このガイドを開始する前に、root以外のユーザーにsudo
権限を設定する必要があります。 Debian 10初期サーバーセットアップガイドに従って、適切な権限を持つユーザーをセットアップできます。 リンクされたチュートリアルでは、ファイアウォールも設定されます。これは、このガイド全体で使用されていると想定されています。
さらに、認証局(CA)として機能する別のマシンが必要になります。 OpenVPNサーバーまたはローカルマシンをCAとして使用することは技術的には可能ですが、VPNがセキュリティの脆弱性にさらされる可能性があるため、これはお勧めしません。 公式のOpenVPNドキュメントに従って、証明書要求のインポートと署名専用のスタンドアロンマシンにCAを配置する必要があります。 このため、このガイドでは、CAがsudo
権限と基本的なファイアウォールを持つ非rootユーザーを持つ別のDebian10サーバー上にあることを前提としています。
これらのサーバーの構成中にパスワード認証を無効にすると、このガイドの後半でサーバー間でファイルを転送するときに問題が発生する可能性があることに注意してください。 この問題を解決するには、各サーバーでパスワード認証を再度有効にすることができます。 または、サーバーごとにSSHキーペアを生成してから、OpenVPNサーバーの公開SSHキーをCAマシンのauthorized_keys
ファイルに追加することもできます。その逆も可能です。 これらのソリューションのいずれかを実行する方法については、 Debian10でSSHキーを設定する方法を参照してください。
これらの前提条件が整ったら、このチュートリアルのステップ1に進むことができます。
ステップ1—OpenVPNとEasyRSAのインストール
まず、 VPNサーバーのパッケージインデックスを更新し、OpenVPNをインストールします。 OpenVPNはDebianのデフォルトのリポジトリで利用できるので、インストールにapt
を使用できます。
- sudo apt update
- sudo apt install openvpn
OpenVPNはTLS/SSLVPNです。 これは、サーバーとクライアント間のトラフィックを暗号化するために証明書を利用することを意味します。 信頼できる証明書を発行するには、独自の単純な認証局(CA)を設定します。 これを行うには、プロジェクトの公式GitHubリポジトリから、CA公開鍵インフラストラクチャ(PKI)の構築に使用するEasyRSAの最新バージョンをダウンロードします。
前提条件で述べたように、スタンドアロンサーバー上にCAを構築します。 このアプローチの理由は、攻撃者がサーバーに侵入できた場合、攻撃者はCA秘密鍵にアクセスし、それを使用して新しい証明書に署名し、VPNにアクセスできるようになるためです。 したがって、スタンドアロンマシンからCAを管理すると、許可されていないユーザーがVPNにアクセスするのを防ぐのに役立ちます。 また、さらなる予防策として、キーの署名に使用されていないときは、CAサーバをオフにしておくことをお勧めします。
CAおよびPKIインフラストラクチャの構築を開始するには、wget
を使用して、CAマシンとOpenVPNサーバーの両方のに最新バージョンのEasyRSAをダウンロードします。 最新バージョンを入手するには、公式のEasyRSA GitHubプロジェクトのリリースページに移動し、.tgz
で終わるファイルのダウンロードリンクをコピーして、次のコマンドに貼り付けます。
- wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.6/EasyRSA-unix-v3.0.6.tgz
次に、tarballを抽出します。
- cd ~
- tar xvf EasyRSA-unix-v3.0.6.tgz
これで、サーバーとCAマシンに必要なすべてのソフトウェアが正常にインストールされました。 EasyRSAが使用する変数を構成し、CAディレクトリを設定します。このディレクトリから、サーバーとクライアントがVPNにアクセスするために必要なキーと証明書を生成します。
ステップ2—EasyRSA変数の構成とCAの構築
EasyRSAには、CAのいくつかの変数を定義するために編集できる構成ファイルがインストールされています。
CAマシンで、EasyRSAディレクトリに移動します。
- cd ~/EasyRSA-v3.0.6/
このディレクトリ内には、vars.example
という名前のファイルがあります。 このファイルのコピーを作成し、ファイル拡張子なしでコピーにvars
という名前を付けます。
- cp vars.example vars
お好みのテキストエディタを使用して、この新しいファイルを開きます。
- nano vars
新しい証明書のフィールドのデフォルトを設定する設定を見つけます。 次のようになります。
. . .
#set_var EASYRSA_REQ_COUNTRY "US"
#set_var EASYRSA_REQ_PROVINCE "California"
#set_var EASYRSA_REQ_CITY "San Francisco"
#set_var EASYRSA_REQ_ORG "Copyleft Certificate Co"
#set_var EASYRSA_REQ_EMAIL "[email protected]"
#set_var EASYRSA_REQ_OU "My Organizational Unit"
. . .
これらの行のコメントを解除し、強調表示された値を好きなように更新しますが、空白のままにしないでください。
. . .
set_var EASYRSA_REQ_COUNTRY "US"
set_var EASYRSA_REQ_PROVINCE "NewYork"
set_var EASYRSA_REQ_CITY "New York City"
set_var EASYRSA_REQ_ORG "DigitalOcean"
set_var EASYRSA_REQ_EMAIL "[email protected]"
set_var EASYRSA_REQ_OU "Community"
. . .
終了したら、ファイルを保存して閉じます。
EasyRSAディレクトリ内には、easyrsa
というスクリプトがあり、CAの構築と管理に関連するさまざまなタスクを実行するために呼び出されます。 init-pki
オプションを指定してこのスクリプトを実行し、CAサーバーで公開鍵インフラストラクチャを開始します。
- ./easyrsa init-pki
Output. . .
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /home/sammy/EasyRSA-v3.0.6/pki
この後、build-ca
オプションを指定して、easyrsa
スクリプトを再度呼び出します。 これにより、CAが構築され、SSL証明書のパブリック側とプライベート側を構成するca.crt
とca.key
の2つの重要なファイルが作成されます。
ca.crt
は、CAの公開証明書ファイルであり、OpenVPNのコンテキストでは、サーバーとクライアントは、中間者攻撃を実行している人ではなく、同じ信頼のWebの一部であることを相互に通知するために使用します。 -中間者攻撃。 このため、サーバーとすべてのクライアントにはca.crt
ファイルのコピーが必要になります。ca.key
は、CAマシンがサーバーとクライアントのキーと証明書に署名するために使用する秘密キーです。 攻撃者があなたのCAにアクセスし、次にあなたのca.key
ファイルにアクセスすると、攻撃者は証明書要求に署名してVPNにアクセスできるようになり、そのセキュリティが妨げられます。 これが、ca.key
ファイルがCAマシン上にのみあるべきであり、理想的には、追加のセキュリティ対策として証明書要求に署名しない場合、CAマシンをオフラインに保つ必要がある理由です。
CAを操作するたびにパスワードの入力を求められたくない場合は、次のようにnopass
オプションを指定してbuild-ca
コマンドを実行できます。
- ./easyrsa build-ca nopass
出力では、CAの一般名を確認するように求められます。
Output. . .
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:
一般名は、認証局のコンテキストでこのマシンを参照するために使用される名前です。 CAの一般名には任意の文字列を入力できますが、簡単にするために、ENTER
を押してデフォルト名を受け入れます。
これで、CAが配置され、証明書要求への署名を開始する準備が整いました。
ステップ3—サーバー証明書、キー、および暗号化ファイルを作成する
CAの準備ができたので、サーバーから秘密鍵と証明書の要求を生成し、その要求をCAに転送して署名し、必要な証明書を作成できます。 また、暗号化プロセス中に使用されるいくつかの追加ファイルを自由に作成できます。
OpenVPNサーバーのEasyRSAディレクトリに移動することから始めます。
- cd EasyRSA-v3.0.6/
そこから、init-pki
オプションを指定してeasyrsa
スクリプトを実行します。 このコマンドはすでにCAマシンで実行されていますが、サーバーとCAには別々のPKIディレクトリがあるため、ここで実行する必要があります。
- ./easyrsa init-pki
次に、easyrsa
スクリプトを再度呼び出します。今回は、gen-req
オプションに続けて、マシンの一般名を指定します。 繰り返しになりますが、これは好きなものにすることができますが、説明的なものにすることが役立つ場合があります。 このチュートリアル全体を通して、OpenVPNサーバーの一般名は単に「サーバー」になります。 nopass
オプションも必ず含めてください。 そうしないと、リクエストファイルがパスワードで保護され、後で権限の問題が発生する可能性があります。
注:ここで「サーバー」以外の名前を選択した場合は、以下の手順の一部を調整する必要があります。 たとえば、生成されたファイルを/etc/openvpn
ディレクトリにコピーする場合は、正しい名前に置き換える必要があります。 また、後で/etc/openvpn/server.conf
ファイルを変更して、正しい.crt
および.key
ファイルを指すようにする必要があります。
- ./easyrsa gen-req server nopass
これにより、サーバーの秘密鍵とserver.req
という証明書要求ファイルが作成されます。 サーバーキーを/etc/openvpn/
ディレクトリにコピーします。
- sudo cp ~/EasyRSA-v3.0.6/pki/private/server.key /etc/openvpn/
安全な方法(以下の例ではSCPなど)を使用して、server.req
ファイルをCAマシンに転送します。
- scp ~/EasyRSA-v3.0.6/pki/reqs/server.req sammy@your_CA_ip:/tmp
次に、 CAマシンで、EasyRSAディレクトリに移動します。
- cd EasyRSA-v3.0.6/
easyrsa
スクリプトを再度使用して、server.req
ファイルをインポートし、共通名のファイルパスをたどります。
- ./easyrsa import-req /tmp/server.req server
次に、easyrsa
スクリプトをsign-req
オプションで実行し、続いてリクエストタイプと共通名を実行して、リクエストに署名します。 リクエストタイプはclient
またはserver
のいずれかであるため、OpenVPNサーバーの証明書リクエストには、必ずserver
リクエストタイプを使用してください。
- ./easyrsa sign-req server server
出力では、リクエストが信頼できるソースからのものであることを確認するように求められます。 yes
と入力し、ENTER
を押して、これを確認します。
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 1080 days:
subject=
commonName = server
Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
CAキーを暗号化した場合は、この時点でパスワードの入力を求められます。
次に、安全な方法を使用して、署名された証明書をVPNサーバーに転送します。
- scp pki/issued/server.crt sammy@your_server_ip:/tmp
CAマシンからログアウトする前に、ca.crt
ファイルもサーバーに転送します。
- scp pki/ca.crt sammy@your_server_ip:/tmp
次に、OpenVPNサーバーに再度ログインし、server.crt
およびca.crt
ファイルを/etc/openvpn/
ディレクトリにコピーします。
- sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/
次に、EasyRSAディレクトリに移動します。
- cd EasyRSA-v3.0.6/
そこから、次のように入力して、鍵交換中に使用する強力なDiffie-Hellman鍵を作成します。
- ./easyrsa gen-dh
これが完了するまでに数分かかる場合があります。 完了したら、HMAC署名を生成して、サーバーのTLS整合性検証機能を強化します。
- sudo openvpn --genkey --secret ta.key
コマンドが終了したら、2つの新しいファイルを/etc/openvpn/
ディレクトリにコピーします。
- sudo cp ~/EasyRSA-v3.0.6/ta.key /etc/openvpn/
- sudo cp ~/EasyRSA-v3.0.6/pki/dh.pem /etc/openvpn/
これで、サーバーに必要なすべての証明書とキーファイルが生成されました。 これで、クライアントマシンがOpenVPNサーバーにアクセスするために使用する対応する証明書とキーを作成する準備が整いました。
ステップ4—クライアント証明書とキーペアの生成
クライアントマシンで秘密鍵と証明書の要求を生成し、それをCAに送信して署名することもできますが、このガイドでは、サーバーで証明書の要求を生成するプロセスの概要を説明します。 これの利点は、必要なすべてのキーと証明書を含むクライアント構成ファイルを自動的に生成するスクリプトを作成できることです。 これにより、キー、証明書、および構成ファイルをクライアントに転送する必要がなくなり、VPNに参加するプロセスが合理化されます。
このガイドでは、単一のクライアントキーと証明書のペアを生成します。 複数のクライアントがある場合は、クライアントごとにこのプロセスを繰り返すことができます。 ただし、すべてのクライアントのスクリプトに一意の名前の値を渡す必要があることに注意してください。 このチュートリアル全体を通して、最初の証明書/キーのペアはclient1
と呼ばれます。
クライアント証明書とキーファイルを保存するために、ホームディレクトリ内にディレクトリ構造を作成することから始めます。
- mkdir -p ~/client-configs/keys
クライアントの証明書/キーのペアと構成ファイルをこのディレクトリに保存するため、セキュリティ対策として、今すぐアクセス許可をロックダウンする必要があります。
- chmod -R 700 ~/client-configs
次に、EasyRSAディレクトリに戻り、[X53X]