Easy-RSA

提供: ArchWiki
移動先: 案内検索

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

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

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

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

認証局 (CA)

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

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

# cd /etc/easy-rsa
# 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 鍵の長さと同じにすることが推奨されます。詳しくは [2] を参照。

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
.

参照