OpenVPNドキュメント

OpenVPNのセキュリティ強化

ひとつのセキュリティコンポーネントに過度の信頼を寄せない、ひとつのコンポーネント障害が壊滅的なセキュリティ侵害を引き起こすような事態を招かないようにする、というのはネットワークセキュリティの原則です。
OpenVPNではこのような事態を防ぐために、セキュリティレイヤーを追加するための複数のメカニズムを提供しています。


tls-auth

tls-authディレクティブは、すべてのSSL/TLSハンドシェイクパケットに整合性検証用のHMAC署名を追加します。
正しいHMAC署名を持たないUDPパケットは、その後の処理を行わずに破棄されます。
tls-auth HMAC署名はSSL/TLSが提供するセキュリティに加えてさらに高度なセキュリティを提供し、以下の諸問題に対処します。

  • OpenVPN UDPポートに対するDoS攻撃またはポートへのフラッディング攻撃
  • どのサーバーのUDPポートがlisten状態にあるかを特定するためのポートスキャン
  • SSL/TLS実装におけるバッファオーバーフローの脆弱性
  • 権限のないマシンからのSSL/TLSハンドシェイクの開始
    (このようなハンドシェイクは最終的に認証に失敗しますが、tls-authはそれを手前の段階で遮断できます)

tls-authを使用する場合、標準のRSA証明書と鍵に加えて共有秘密鍵を生成する必要があります。

openvpn --genkey --secret ta.key

このコマンドはOpenVPNの静的鍵を生成し、ta.keyファイルに書き込みます。
この鍵は既存サーバーと全てのクライアントマシンに安全にコピーする必要があります。
このファイルはRSAの.keyファイルと.crtファイルのあるディレクトリに置きます。

サーバー設定ファイルに以下の行を追加します。

tls-auth ta.key 0

クライアント設定ファイルには以下を追加します。

tls-auth ta.key 1

proto udp

OpenVPNではVPNキャリアプロトコルとしてTCPまたはUDPプロトコルのいずれかを使用できますが、UDPプロトコルの方がDoS攻撃やポートスキャンに対して頑強です。

proto udp

user/group(Windows以外)

OpenVPNはインストール後にルート権限を削除できるよう設計されており、Linux/BSD/Solarisでは常にこの機能を使用する事を推奨します。
ルート権限のないOpenVPNサーバーデーモンは、外部からの攻撃に対して極めて強固なものとなります。

user nobody
group nobody

非特権モード(Linux)

LinuxではOpenVPNを非特権モードで実行する事が可能です。
この設定はやや複雑ですが、最高のセキュリティを実現します。

この構成で動作させるには、configureスクリプトで--enable-iproute2を指定し、OpenVPNがiprouteインターフェイスを使用するよう設定されている必要があります。
また、システム上でsudoパッケージが利用可能である必要があります。

この設定では、Linuxの機能を利用してtunデバイスのパーミッションを変更し、非特権ユーザーがアクセスできるようにします。
また、インターフェースのプロパティとルーティングテーブルを変更するために、sudoを使用してiprouteを実行します。

以下のように設定をおこないます。

  • 以下のスクリプトを記述して、/usr/local/sbin/unpriv-ipとして保存します。
#!/bin/sh
sudo /sbin/ip $*
  • visudoを使用してユーザー'user1''が/sbin/ipを実行できるよう以下を追加します。
user1 ALL=(ALL) NOPASSWD: /sbin/ip
  • 以下のコマンドでユーザーグループを有効にすることも可能です。
%users ALL=(ALL) NOPASSWD: /sbin/ip
  • OpenVPN設定ファイルに以下の記述を追加します。
dev tunX/tapX
iproute /usr/local/sbin/unpriv-ip
  • 定数Xに値を設定し、tunまたはtapのいずれかを指定します。
  • インターフェースを追加し、指定ユーザー/グループのインターフェースの管理を許可します。
    以下のコマンドでtunX(適切な値に書き換えてください)を作成し、user1およびグループユーザーがアクセスできるようにします。
openvpn --mktun --dev tunX --type tun --user user1 --group users
  • 非特権ユーザーのコンテキストでOpenVPNを起動します。

/usr/local/sbin/unpriv-ipスクリプトのパラメータ設定により、さらにセキュリティを強固なものにできます。


chroot(Windows以外)

chrootディレクティブを使用すると、OpenVPNデーモンをchroot jailにロックさせることができます。
これにより、OpenVPNデーモンはパラメータとして指定されたディレクトリを除き、ホストシステムのファイルシステムのいかなる部分にもアクセスできなくなります。

chroot jail

これにより、OpenVPNデーモンは初期化時にjailディレクトリに移動し、その後このディレクトリをルートファイルに再設定します。
OpenVPNデーモンはjailディレクトリとそのサブディレクトリ以外のファイルにアクセスできなくなります。
たとえ攻撃者がサーバーに侵入できたとしても、そのサーバーのファイルシステムの大部分から締め出されます。


RSA鍵のサイズを大きくする

RSA鍵のサイズはeasy-rsa/varsファイルのKEY_SIZE変数によって制御されています 。
この変数は全ての鍵を生成する前に設定する必要があります。
デフォルトでは1024に設定されていますが、2048まで数値を増やす事ができます。
値を大きくする事によってVPNトンネルのパフォーマンスそのものに悪影響が出る事はありませんが、1クライアントにつき1時間おきに実行されるSSL/TLS再ネゴシエーションハンドシェイクが若干遅くなります。
また、初期設定時に一度だけ行うeasy-rsa/build-dhスクリプトを使用したDiffie Hellmanパラメータ生成プロセスが大幅に遅くなります。


対称鍵を大きくする

デフォルトでは、OpenVPNは128ビットの対称暗号であるBlowfishを使用します。

OpenVPNはOpenSSLライブラリがサポートするあらゆる暗号を自動的にサポートするため、鍵サイズを大きくする事も可能です。
例えば、256ビット版のAES(Advanced Encryption Standard)を使用するには、サーバーとクライアント両方の設定ファイルに以下のコードを追加します。

cipher AES-256-CBC

ルートキー(ca.key)をネットワーク接続のないスタンドアロンマシンに保存する

X509 PKIを使用するセキュリティ上のメリットのひとつとして、ルートCA鍵(ca.key)をOpenVPNサーバーマシン上に置く必要がないという事が挙げられます。
高いセキュリティレベルを必要とする環境では、鍵署名専用のマシンを用意し、そのマシンを物理的に保護し、全てのネットワークから切り離しておくことが推奨されます。
フロッピーディスクを使用して鍵ファイルをやり取りすることもできます。
このような対策により、攻撃者が鍵署名マシンを物理的に盗まない限り、ルート鍵を盗むことは極めて困難になります。