Easy-RSA

提供: ArchWiki
ナビゲーションに移動 検索に移動

OpenVPN をセットアップするときはまず公開鍵基盤 (PKI) を作成します。公開鍵基盤は以下から構成されます:

  • 認証局 (CA) のマスター公開証明書と秘密鍵。
  • 各サーバーの公開証明書と秘密鍵のペア。
  • 各クライアントの公開証明書と秘密鍵のペア。

SSH 鍵による鍵認証に認証局 (CA) のレイヤーが追加されたものと考えてください。OpenVPN では双方向の認証が使われており、クライアントがサーバーの証明書を認証すると共に、サーバーはクライアントの証明書を認証しなければなりません。これはクライアントとサーバーの両方の証明書で第三者の署名 (CA) を使うことで実現されます。認証が完了する前に次のチェックが実行されます。詳しくは secure-computing guide を見てください。

ノート:
  • 以下で説明している操作を行うときはマシンから秘密鍵ファイルを安全に転送する必要があります。ガイドの目的にそって scp を使っていますが、他の方法で転送することもできます。Arch ではデフォルトで SSH で root ユーザーを使ってログインすることができないため、scp を使うときは root 以外のユーザーにファイルの所有権を移す必要があります。ガイドの中では foo という名前のユーザーを使っています。
  • エントロピーが少ないデバイスで鍵を生成するのは困難です。詳しくは [1] を見てください。場合によっては、暗号的に安全な疑似乱数生成を使用できます。

認証局 (CA)

セキュリティ上の理由から CA とするマシンは OpenVPN を実行するマシンとは分けることが推奨されます。

CA マシン には easy-rsa をインストールして新しい PKI を初期化して証明書に署名するための CA のキーペアを生成してください:

# cd /etc/easy-rsa
# export EASYRSA=$(pwd)
# easyrsa init-pki
# easyrsa build-ca

OpenVPN 2.4 以降では、TLS 接続に楕円曲線を使用することもできます (例: tls-cipher TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384)。楕円曲線暗号化によりセキュリティが向上し、Diffie-Hellman パラメータ ファイルが不要になります。[2] および [3] を参照してください。

次に、/etc/easy-rsa/vars に以下の行を追加します:

/etc/easy-rsa/vars
set_var EASYRSA_DIGEST "sha512"  # Default sha256
set_var EASYRSA_NS_SUPPORT "yes" # for Netscape compatibility, deprecated

楕円曲線の場合:

/etc/easy-rsa/vars
set_var EASYRSA_ALGO ec
set_var EASYRSA_CURVE secp521r1

または ツイステッドエドワーズ曲線 の場合:

/etc/easy-rsa/vars
set_var EASYRSA_ALGO  ed
set_var EASYRSA_CURVE ed25519

次に、PKI をセットアップして、CA 証明書を生成します:

# cd /etc/easy-rsa
# export EASYRSA=$(pwd)
# export EASYRSA_VARS_FILE=/etc/easy-rsa/vars
# easyrsa init-pki
# easyrsa build-ca

OpenVPN サーバーファイル

OpenVPN サーバーには以下が必要です (アルファベット順):

  1. CA の公開鍵。
  2. Diffie-Hellman (DH) パラメータファイル (TLS モードを使うのに必須)。
  3. サーバーのキーペア (公開証明書と秘密鍵)。
  4. Hash-based Message Authentication Code (HMAC) 鍵。

この記事に書かれている設定を全て行うと、サーバーには以下のファイルが生成されます:

  1. /etc/openvpn/server/ca.crt
  2. /etc/openvpn/server/dh.pem
  3. /etc/openvpn/server/servername.crt/etc/openvpn/server/servername.key
  4. /etc/openvpn/server/ta.key

CA 公開証明書

先に作成した CA の公開鍵 /etc/easy-rsa/pki/ca.crt を OpenVPN を動作させるマシンにコピーしてください。

CA マシンで以下を実行:

# cp /etc/easy-rsa/pki/ca.crt /tmp
# chown foo /tmp/ca.crt
$ scp /tmp/ca.crt foo@hostname-of-openvpn-server:/tmp

OpenVPN サーバーマシンで以下を実行:

# mv /tmp/ca.crt /etc/openvpn/server/
# chown root:root /etc/openvpn/server/ca.crt

サーバー証明書と秘密鍵

OpenVPN サーバーマシンeasy-rsa をインストールしてサーバーのキーペアを生成してください:

# cd /etc/easy-rsa
# easyrsa init-pki
# easyrsa gen-req servername nopass
# cp /etc/easy-rsa/pki/private/servername.key /etc/openvpn/server/

以下のファイルが作成されます:

  • /etc/easy-rsa/pki/reqs/servername.req
  • /etc/easy-rsa/pki/private/servername.key

Diffie-Hellman (DH) パラメータファイル

OpenVPN サーバーマシンで最初の dh.pem ファイルを作成:

# openssl dhparam -out /etc/openvpn/server/dh.pem 2048
ノート: 2048よりも大きな値 (例えば4096) を使うこともできますが、生成する時間が相当長くなるわりにはセキュリティ上のメリットはあまりありません。ただし DH の素数は RSA 鍵の長さと同じにすることが推奨されます。詳しくは [4] を参照。

Hash-based Message Authentication Code (HMAC) 鍵

OpenVPN サーバーマシンで HMAC 鍵を作成:

# openvpn --genkey --secret /etc/openvpn/server/ta.key

上記のコマンドで全ての SSL/TLS ハンドシェイクパケットに HMAC 署名が追加されます。さらに適切な HMAC 署名が存在しない UDP パケットはすぐに拒否されるため、以下の攻撃から防護されます:

  • ポートスキャン。
  • OpenVPN の UDP ポートに対する DOS 攻撃。
  • 未権限のマシンからの SSL/TLS ハンドシェイク。
  • SSL/TLS 実装のバッファオーバーフロー脆弱性に対する攻撃。

OpenVPN クライアントファイル

クライアント証明書と秘密鍵

easy-rsa がインストールされていればどんなマシンでもクライアントファイルを生成できます。

PKI が初期化されていない場合、以下のコマンドを実行:

# cd /etc/easy-rsa
# easyrsa init-pki

クライアント鍵と証明書を生成:

# cd /etc/easy-rsa
# easyrsa gen-req client1 nopass

以下のファイルが作成されます:

  • /etc/easy-rsa/pki/reqs/client1.req
  • /etc/easy-rsa/pki/private/client1.key

他のクライアントでも必要なだけ gen-req を繰り返しおこなってください。

証明書に署名してサーバーとクライアントに返す

CA で証明書を取得・署名

サーバーとクライアント証明書には CA による署名を加えて OpenVPN サーバー/クライアントに転送する必要があります。

OpenVPN サーバー (あるいは証明書/キーペアを生成するのに使用したマシン) で以下のコマンドを実行:

# cp /etc/easy-rsa/pki/reqs/*.req /tmp
# chown foo /tmp/*.req

CA マシンにファイルを安全に転送:

$ scp /tmp/*.req foo@hostname-of-CA:/tmp

CA マシンで証明書要求をインポートして署名:

# cd /etc/easy-rsa
# easyrsa import-req /tmp/servername.req servername
# easyrsa import-req /tmp/client1.req client1
# easyrsa sign-req server servername
# easyrsa sign-req client client1

以下の署名された証明書が作成されます:

  • /etc/easy-rsa/pki/issued/servername.crt
  • /etc/easy-rsa/pki/issued/client1.crt

残った .req ファイルは削除して問題ありません:

# rm -f /tmp/*.req

サーバーとクライアントに署名した証明書を返却

CA マシンで署名された証明書をコピーしてサーバー・クライアントに転送してください:

# cp /etc/easy-rsa/pki/issued/*.crt /tmp
# chown foo /tmp/*.crt
$ scp /tmp/*.crt foo@hostname-of-openvpn_server:/tmp

OpenVPN サーバーでは所定の場所に証明書を移動して所有権を再設定します:

# mv /tmp/servername.crt /etc/openvpn/server/
# chown root:root /etc/openvpn/server/servername.crt

署名されたクライアント証明書はどこに保存してもかまいません。ovpn クライアントプロファイルを準備するときに使います:

# mkdir /etc/easy-rsa/pki/signed
# mv /tmp/client1.crt /etc/easy-rsa/pki/signed

証明書を無効化して OpenVPN サーバーに通知

証明書の無効化

特定ユーザーのアクセスを拒否するために証明書を無効化する必要が出てくることもあります。以下は "client1" 証明書を無効化する例です。

CA マシンで以下を実行:

# cd /etc/easy-rsa
# easyrsa revoke client1
# easyrsa gen-crl

上記のコマンドで CRL ファイル /etc/easy-rsa/pki/crl.pem が生成されるので OpenVPN サーバーに転送して有効にしてください。

OpenVPN サーバーに警告

CA マシンで以下のコマンドを実行:

# cp /etc/easy-rsa/pki/crl.pem /tmp
# chown foo /tmp/crl.pem

OpenVPN マシンcrl.pem をコピーしてサーバーから読み込めるように設定:

# mv /tmp/crl.pem /etc/openvpn/server/
# chown root:root /etc/openvpn/server/crl.pem

/etc/openvpn/server/server.conf を編集して crl-verify ディレクティブをアンコメントして openvpn-server@server.service再起動してください:

/etc/openvpn/server/server.conf
.
crl-verify /etc/openvpn/server/crl.pem
.

Abbreviated example specifically for containerized Openvpn

This section is specifically for users wanting to run Openvpn in a Linux container (LXC). The code below is designed to be pasted into a root shell; the standard hash has been omitted to allow for easy copy/paste operations. It is recommended to have two different shell windows open, one for the host and one for the container.

ノート:
  • It is assumed that the CA machine is the host and the server machine is the container.
  • Both the host and container need to have both openvpn and easy-rsa installed.
  • The container needs to be running.
  • Define the name of the container in the CONTAINERNAME variable below.

On the host:

CONTAINERNAME=foo
/etc/easy-rsa
easyrsa init-pki && easyrsa build-ca
cp /etc/easy-rsa/pki/ca.crt /var/lib/lxc/$CONTAINERNAME/rootfs/etc/openvpn/server/
ノート: One may substitute other names in the 2nd line of this code (the for loop). At a minimum, one needs to generate a key for the server and for at least 1 client. The generic words "server" and "client" are shown, but in reality, these can by any words such as the hostname of the container or the name of the intended user. As well, one can add additional words to the for loop if more than 2 keys are needed. If that is the case, just be sure to add corresponding lines to the subsequent steps for each of them.

In the container:

cd /etc/easy-rsa && easyrsa init-pki
for i in server client; do easyrsa gen-req $i nopass; done
cp /etc/easy-rsa/pki/private/server.key /etc/openvpn/server/
openssl dhparam -out /etc/openvpn/server/dh.pem 2048
openvpn --genkey secret /etc/openvpn/server/ta.key

Back on the host:

easyrsa import-req /var/lib/lxc/$CONTAINERNAME/rootfs/etc/easy-rsa/pki/reqs/junk.req junk
easyrsa import-req /var/lib/lxc/$CONTAINERNAME/rootfs/etc/easy-rsa/pki/reqs/client.req client
easyrsa sign-req client client
easyrsa sign-req server server
mkdir /var/lib/lxc/$CONTAINERNAME/rootfs/etc/easy-rsa/pki/issued/
mkdir /var/lib/lxc/$CONTAINERNAME/rootfs/etc/easy-rsa/pki/signed/
cp /etc/easy-rsa/pki/issued/*.crt /var/lib/lxc/$CONTAINERNAME/rootfs/etc/easy-rsa/pki/issued/

That will provide the needed files to make an OpenVPN compatible tunnel profile for the client, and the needed server key files for the server. To generate a client profile, refer to OpenVPN#ovpngen.

参照