Easy-RSA
OpenVPN をセットアップするときはまず公開鍵基盤 (PKI) を作成します。公開鍵基盤は以下から構成されます:
- 認証局 (CA) のマスター公開証明書と秘密鍵。
- 各サーバーの公開証明書と秘密鍵のペア。
- 各クライアントの公開証明書と秘密鍵のペア。
SSH 鍵による鍵認証に認証局 (CA) のレイヤーが追加されたものと考えてください。OpenVPN では双方向の認証が使われており、クライアントがサーバーの証明書を認証すると共に、サーバーはクライアントの証明書を認証しなければなりません。これはクライアントとサーバーの両方の証明書で第三者の署名 (CA) を使うことで実現されます。認証が完了する前に次のチェックが実行されます。詳しくは secure-computing guide を見てください。
目次
認証局 (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 サーバーには以下が必要です (アルファベット順):
- CA の公開鍵。
- Diffie-Hellman (DH) パラメータファイル (TLS モードを使うのに必須)。
- サーバーのキーペア (公開証明書と秘密鍵)。
- Hash-based Message Authentication Code (HMAC) 鍵。
この記事に書かれている設定を全て行うと、サーバーには以下のファイルが生成されます:
/etc/openvpn/server/ca.crt
/etc/openvpn/server/dh.pem
/etc/openvpn/server/servername.crt
と/etc/openvpn/server/servername.key
/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
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.
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/
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.