OpenVPNは、優れたオープンソースの1つです。多くの企業や組織で使用されており、VPN市場全体をほぼ一手に引き受けています。OpenVPN 2.4.0 は、独立機関によるセキュリティ脆弱性の監査を2回受けており、ほとんどのOSに対応した豊富な実績のクライアントがあり、リモートアクセスサーバやプライベート・ネットワークを拡張するための魅力的な選択肢となっております。
OpenVPNは、最小限の設定で多くのシナリオでうまく機能する、適切なデフォルトセットを選択します。ただし、設定可能なオプションの中には、追加の防御機能でOpenVPNのセキュリティを強化するものが多くあり、内部のセキュリティや規制上の要件に応じて望ましい設定となります。
以下は、現在のOpenVPNサーバーのテンプレートです。ご利用になられる企業や組織によって要件が異なるため、このテンプレートを見直し、それぞれの環境に合わせて調整する必要があります。ハッシュまたはセミコロンで始まる行は備考です。一部の設定オプションについては、テンプレートの下で詳細を説明しております。
# Port to listen on
port 13210
# Protocol to use
proto udp4
# Virtual network device
dev tun
# CA and CRL
ca /etc/openvpn/ca.crt
;crl-verify /etc/openvpn/crl.pem
# Server certificate and key
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.pem
# Configure server role and allocate addresses out of the given network
server 10.198.149.0 255.255.255.192
# Use a subnet rather than point-to-point topology
topology subnet
# Persist ifconfig-pool data to file, at seconds intervals
ifconfig-pool-persist ipp.txt 600
# Instruct client to redirect default gateway to the VPN
;push "redirect-gateway def1"
# Ping if inactive for 20 seconds and trigger a SIGUSR1 restart after 180 seconds without reception of a ping
keepalive 20 180
# Require that peer certificate was signed with explicit client key usage
remote-cert-tls client
;remote-cert-eku 'TLS Web Client Authentication'
# Verify fingerprint of the CA (or intermediate cert) that signed the peer's certificate
verify-hash CB:33:3F:AC:BE:8E:FB:F8:CB:F2:44:35:55:01:A2:B4:40:94:90:3B:A2:11:E2:11:51:08:09:03:51:C3:ED:F8 SHA256
# File containing Diffie Hellman parameters
dh /etc/openvpn/server/dh2048.pem
# Key to authenticate and encrypt the TLS control channel
tls-crypt /etc/openvpn/server/tls.key
# Set the minimum TLS version we will accept from the peer
tls-version-min 1.2
# Allowable ciphers for TLS 1.2 (or lower)
tls-cipher TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256
# Allowable ciphers for TLS 1.3
tls-ciphersuites TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:TLS-AES-128-GCM-SHA256
# Allowable ciphers to negotiate for the data channel
ncp-ciphers AES-256-GCM:AES-256-CBC:AES-128-GCM:AES-128-CBC
# When negotiation is disabled use this cipher
cipher AES-128-GCM
# Digest algorithm for HMAC authentication
auth SHA1
# Silence the output of replay warnings, which are a common false alarm on WiFi networks
mute-replay-warnings
# Change to this user ID after initialization
user nobody
# Change to this group ID after initialization
group nobody
# Don’t re-read key files across SIGUSR1 because privileges were dropped
persist-key
# Don’t close/reopen TUN/TAP device or run scripts across SIGUSR1 because privileges were dropped
persist-tun
# Output verbosity
verb 3
# Restrict usage of external programs and scripts
script-security 1
# Notify clients when the server restarts
explicit-exit-notify 1
port: デフォルトのOpenVPNポートは1194です。非標準ポートでソフトウェアを実行すると、自動スキャンやドライブバイ攻撃/ブルートフォース試行によるログのノイズを減らすことができます。また、一般的なモニタリングやブロッキングを回避できる場合もありますが、ターゲットを絞った偵察や攻撃に対する追加の保護を提供するものではございません。
proto: VPN接続の転送方法としては、UDPが推奨されております。TCP上にTCPをトンネリングするのは、一般的には好ましくないと考えられています。デュアルスタック環境での曖昧さを避けるため、IPv4を指定しております。
crl-verify: OpenVPN 2.4 は、SSL/TLSライブラリのCRL検証を使用しておりますが、以前よりも厳しくなっています。CAはCRLの発行者と一致する必要があり、CRLは期限切れであってはなりません。失効した証明書がない間は、crl-verifyオプションを設定したままにしておくことができるため、有効期限を追跡して空のCRLを更新する必要はございません。ただし、OpenVPNを再設定し、後で使用する必要がある場合は、更新プロセスを実装する必要がございます。
topology: サブネット・トポロジで、tunデバイスは「従来の」ブロードキャストベースのネットワークのようにIPとネットマスクで構成されており、IPスペースをより有効に活用できます。WindowsでOpenVPN 2.0.9を実行している古いクライアントが存在しない場合は、サブネット・トポロジを使用することをお勧め致します。
ifconfig-pool-persist: Pifconfig-poolのデータをファイルに永続化させます。このオプションの目的は、ifconfig-poolからクライアントに割り当てられた仮想IPアドレスとの間に長期的な関連性を持たせることで、それを維持することは「persist-tun」オプションを効果的な使用が可能なため、クライアントにとっても好ましいオプションです。このファイルのエントリーは、OpenVPNでは、コモンネームとIPアドレスの過去の関連性に基づく提案としてのみ扱われることにご注意ください。指定されたコモンネームが常に指定されたIPアドレスを受信することを保証するものではございません。
keepalive: 設定された秒数の間、非アクティブであればコントロールチャンネルを介してリモートにPingを実行し、Pingを受信せずにタイムアウト値を超えるとSIGUSR1の再起動をトリガーします。このディレクティブは、クライアントにも適用されますので、特に設定する必要はございません。サーバー側では、タイムアウトは2倍の長さになりますので、サーバ側が接続を切断する前に、クライアント側でタイムアウトが検出されるようになります。
remote-cert-tls: RFC3280 TLSルールに基づいて、明示的なキー(explicit key)と拡張キー(extended key)の使用法でピア証明書に署名する必要があります。これは、中間者攻撃(Man In The Middle Attack)から保護するための重要なセキュリティ対策です。「remote-cert-eku」オプションは、同等の代替表記です。
verify-hash: クライアントの証明書に署名するCA(中間)証明書のフィンガープリントとアルゴリズムを指定します。OpenVPNはサーバー証明書に署名したCA証明書/フィンガープリントを持っていますが、複数のCAや中間証明書を管理する場合や、自動化された構成管理/展開のための追加チェックオプションして役立ちます。フィンガープリントは、[openssl x509 -noout -fingerprint -sha256 -inform pem -inca.crt]で抽出できます。
dh: ディフィー・ヘルマン鍵共有(Diffie Hellman)のパラメータを含むファイルです。基本的にディフィー・ヘルマン鍵共有(Diffie Hellman)は、2人のユーザーが事前に秘密の共有無しに安全でない媒体上で秘密の鍵を交換することを可能にします。“none"を設定すると、ディフィー・ヘルマン鍵共有(Diffie Hellman)を無効にし、ECDHのみを使用します。この場合、相手はECDH TLSをサポートするSSLライブラリを使用している必要があることにご注意ください(tls-cipherもご参照ください)。2048ビットのDHパラメータを生成するには[openssl dhparam –out /etc/openvpn/server/dh2048.pem 2048]をご利用ください。より大きなサイズを生成することもできますが、時間が大幅にかかり、計算機使用コストが増加します。現在、2048ビットは一般的に安全であると考えられています。
tls-crypt: この鍵を使用して、全ての制御チャネルのパケットを認証/暗号化します。これには、TLSレベルがピア認証する前に送信されたパケットも含まれるため、許可されていない接続では、TLSハンドシェイクの開始などのシステムリソースを消費する前の最初のパケットが受信時に即ぐにドロップされる可能性があります。この機能はオプションであり、使用される鍵ファイルは、TLSハンドシェイクを開始する権限をピアに与えるだけで、トンネルデータの暗号化や認証には使用されません。tls-authオプションでも、まったく同じ鍵ファイルを使用して、同様のDoS攻撃防止機能が提供されます。tls-cryptオプションは、TLS接続に使用される証明書を隠すことでプライバシーを確保し、OpenVPNトラフィックを識別することを困難にします。[openvpn --genkey secret /etc/openvpn/server/tls.key]
を使用して独自のファイルを生成します。
tls-cipher & tls-ciphersuites: TLS接続のためにネゴシエートできる許容可能なTLS暗号。OpenSSL for TLS 1.3の変更により、2つの別々のオプションがあります。こちらの設定は高度なオプションのため、セキュリティを低下させたり、接続を切断したりする可能性もございます。OpenVPN 2.4以降では、以前のバージョンよりもデフォルトの暗号リストが制限されており、デフォルトで安全な暗号をネゴシエートします。こちらのオプションを使用する際の主な注意事項は、クライアント側の構成変更によって意図的に使用される望ましくない暗号を防止すること、または内部セキュリティや規制要件を満たすことです。プラットフォームで利用可能な暗号は[openvpn --show-tls]
でご確認いただけます。
ncp-ciphers: データチャネルに対してネゴシエートできる許容可能な暗号です。暗号化ディレクティブがない場合、OpenVPNv2.4クライアント/サーバーは自動的にTLSモードでAES-256-GCMのネゴシエーションを試みます。tls暗号と同様に主な注意事項としては、クライアント側の構成で望ましくない暗号が使用されるのを防ぐこと、または内部セキュリティや規制要件を満たすことです。プラットフォームで利用可能な暗号は[openvpn --show-ciphers]
でご確認いただけます。
cipher: クライアントでネゴシエーションが無効になっているときに使用される暗号(cipher)です。こちらも、望ましくない暗号の使用を防ぐための保護手段ですが、CPUの能力が限られている小規模なサイトやIoTデバイスの機器に適した暗号を定義するのにもご利用いただけます。
auth: こちらのメッセージダイジェストアルゴリズムを使用して、HMACでデータチャネルパケットを認証し、有効な場合はtls-auth制御チャネルパケットを認証します。OpenVPNのデフォルトであるSHA1はほとんどの用途で非推奨になっておりますが、HMACでは安全に使用可能です(HMACは、基盤となるハッシュアルゴリズムだけよりも衝突の影響を受けにくいため)。また。ハッシュサイズを大きくすると、計算コストと帯域幅使用コストが増加します。たとえば、SHA1は160ビット(20バイト)を生成し、SHA256は256ビット(32バイト)のハッシュ値を生成します。利用可能なアルゴリズムを確認するには、[openvpn --show-digests]
をご利用ください。
user & group: こちらのuidとgidに変更することで、起動後にroot権限を削除することができます。実際のuidとgidは、プラットフォームによって異なります。
以下は、現在のOpenVPNクライアントのテンプレートです。このテンプレートは、ご利用前に見直しを行い個々の要件に合わせる必要がございます。当社は、後からの変更管理が容易になるように、クライアントの設定を最小限にとどめ、可能な限りサーバがオプションを適用するようにしております。一部の設定オプションについては、テンプレートの下で詳細を説明しております。
# Configure client role
client
# Virtual network device
dev tun
# Don't cache credentials in virtual memory
auth-nocache
# Remote host name or IP address, port and protocol
remote dvpn.takala.consulting 13210 udp4
# Number of seconds to wait between connection attempts and max wait
connect-retry 60 600
# How long to retry if hostname resolve fails
resolv-retry infinite
# Do not bind to local address and port
nobind
# Don't re-read key files across SIGUSR1 because privileges were dropped
persist-key
# Don't close/reopen TUN/TAP device or run scripts across SIGUSR1 because privileges were dropped
persist-tun
# CRL
;crl-verify /etc/openvpn/crl.pem
# Require that peer certificate was signed with explicit server key usage
remote-cert-tls server
;remote-cert-eku 'TLS Web Server Authentication'
# Verify fingerprint of the CA (or intermediate cert) that signed the peer's certificate
verify-hash CB:33:3F:AC:BE:8E:FB:F8:CB:F2:44:35:55:01:A2:B4:40:94:90:3B:A2:11:E2:11:51:08:09:03:51:C3:ED:F8 SHA256
# Match the peer's certificate subject
verify-x509-name 'C=JP, O=Takala Consulting, CN=dvpn.takala.consulting, role=VPN Server' subject
# Disable cipher negotiation
;ncp-disable
# Use this cipher when negotiation is disabled
cipher AES-128-GCM
# Digest algorithm for HMAC authentication
auth SHA1
# Output verbosity
verb 3
# PKCS #12 file containing private key, certificate, and root CA certificate
pkcs12 /etc/openvpn/client/alfred@takala.consulting.p12
# Key to authenticate and encrypt the TLS control channel
<tls-crypt>
-----BEGIN OpenVPN Static key V1-----
28c67c8eddbe68fb9ccc462a0e325a18
7cd7a9497081e98d12684ce7691011b0
bfba38f6f16079608c71a49d2e850f2c
4bb3b6ae66d774bb77c01172f54884ef
eb5cbc9463d026e604d1ed2a0394dcf7
949369f16f80040b3050bf6e666c2037
3c687782f952ae8b822e7294f5b2618a
d551e98535619f9bf95792fe9406c183
29801a3fd06e2b1997838a0f31d14966
51e9c1d02c90514b5c03a5cb25780424
fa966afb59157c990b343148ca11a9bc
86a14cb002d0132e2f136609d139e2ab
351afac9d71c87aaba2e9be378abf529
288f0fe79a2132662b53e11a5a53aa19
75d954eb8d1e7446ebe13d3aa0f5a541
83e6ba849b0f877b93344e595cb6f98f
-----END OpenVPN Static key V1-----
</tls-crypt>
# Restrict usage of external programs and scripts
script-security 1
verify-x509-name: サーバの証明書のサブジェクトを検証して、期待通りのサーバに接続していることを確認します。こちらのオプションはより具体的なものなので、remote-cert-tlsオプションを安全に省略できます。サブジェクトは[openssl x509 -in server.crt -text -noout | grep Subject]
でご確認いただけます。
ncp-disable: 暗号ネゴシエーションを完全に無効にし、cipherオプションで定義されているものを使用致します(サーバーテンプレートの下の暗号の説明もご参照ください)。
pkcs12: OpenVPNでは、証明書や鍵を保存する方法がいくつかございます。サーバテンプレートでは、それぞれに別のファイルが使用されていて、全てをインラインで保存することも可能で、特に設定を自動生成する際には便利なオプションとなります。こちらの例では、PKCS #12 アーカイブを使用して、全ての証明書と秘密鍵を暗号化し、パスワードで保護された形式で保存しております。こちらのオプションは、mbed TLSではご利用いただけません。
tls-crypt: クライアント設定に合わせてインラインで保存される以外は、サーバーで生成したものと同じ鍵が使用されます。
auth: こちらは、サーバー設定と一致する必要がございます(サーバーテンプレートの下のauthの説明もご参照ください)。
セキュリティに関する考察
全てのピアは、同じ「tls-crypt」事前共有グループキーを使用して、制御チャネルメッセージの認証と暗号化を行っております。IVの衝突が起こらないようにするため、この鍵は2^48個以上のクライアントからサーバ、または2^48個以上のサーバからクライアントへの制御チャネルメッセージの暗号化にはご利用いただけません。これにより、tls-cryptの鍵の寿命は、8171年をユーザ数で割った概算値に制限されます。つまり、1000人のユーザがいる場合、少なくとも8年に1度は鍵をローテーションする必要があります。(8000人のユーザーがいる場合は、1年に1回となります)
IVの衝突が発生した場合、「tls-crypt」のセキュリティが「tls-auth」を使用した場合と同じセキュリティに低下する可能性がございます。つまり、制御チャネルはアクティブな中間者攻撃とDoS攻撃に対する追加の保護のメリットがありますが、TLS自体が提供するものに加えて追加のプライバシーとポスト量子セキュリティが提供されなくなる可能性がございます。
「verify-x509-name」を使用すると、指定されたサーバーに関連付けられている証明書を除くすべての証明書をクライアントが拒否できるため、クライアントでCRL(証明書失効リスト)を管理する代わりとして便利にご利用いただけます。
その他、ご質問や具体的な構成に関しましては、お気軽にお問い合わせください。