OpenVPN をインターネット側に公開する場合、証明書とユーザー認証だけを見ていると、制御チャネルの入口で何が起きているかを見落としやすくなります。
tls-auth は、OpenVPN の TLS 制御チャネルに HMAC による追加認証をかけるための仕組みです。正しい共有鍵を持たないパケットを TLS ハンドシェイクへ進ませにくくすることで、不要な処理やスキャン、未認証アクセスの影響を抑えます。
この記事では、OpenVPN の tls-auth を、制御チャネル保護、HMAC、鍵方向、tls-crypt との違い、鍵ファイル管理の観点で整理します。tls-auth は暗号化ではなく、TLS 制御チャネルの入口に追加の認証を置く設定として理解すると見通しがよくなります。
tls-auth は何を守るのか
OpenVPN には、実際のトンネルデータを流すデータチャネルと、認証や鍵交換を扱う TLS 制御チャネルがあります。tls-auth が関係するのは、主にこの TLS 制御チャネルです。
tls-auth を有効にすると、TLS 制御チャネルのパケットに HMAC 署名が付与されます。正しい共有鍵を持たない相手からのパケットは、TLS 処理へ進む前に破棄されやすくなります。
- 未認証クライアントによる TLS ハンドシェイク試行を抑える。
- OpenVPN ポートに対する雑なスキャンや不要なパケット処理を減らす。
- TLS スタックへ到達する前段でパケットをふるいにかける。
- インターネット公開時の入口防御を一段増やす。
tls-auth は暗号化ではない
重要なのは、tls-auth は制御チャネルを暗号化する設定ではないという点です。tls-auth は HMAC による認証を追加する設定であり、TLS 制御チャネルそのものの内容を隠す目的ではありません。
TLS 制御チャネルをより隠したい場合は、tls-crypt を検討します。tls-crypt は、制御チャネルを暗号化しつつ認証する方向の設定です。
| 設定 | 主な役割 | 見るポイント |
tls-auth | TLS 制御チャネルの HMAC 認証 | 暗号化ではない。共有鍵を持たないパケットを早い段階で落とす。 |
tls-crypt | TLS 制御チャネルの暗号化と認証 | 制御チャネルの見え方を減らしたい場合に検討する。 |
tls-crypt-v2 | クライアントごとの鍵管理を含む方式 | 大規模・個別管理寄り。設計を理解してから使う。 |
tls-auth 鍵を作成する
tls-auth では、サーバーとクライアントで共有する静的鍵ファイルを使用します。鍵ファイルは、OpenVPN が利用できる安全な場所で生成し、必要なクライアントへ配布します。
openvpn --genkey secret ta.keyこの ta.key は、証明書や秘密鍵とは別の共有鍵です。漏洩すると tls-auth の入口防御としての意味が弱くなるため、クライアント証明書と同じように慎重に扱います。
サーバー側の設定例
サーバー側では、tls-auth に鍵ファイルと方向を指定します。サーバー側は一般的に 0 を指定します。
tls-auth /etc/openvpn/server/ta.key 0既存の証明書、秘密鍵、CA、DH パラメータなどとは別に、ta.key を配置します。ファイルの権限は、OpenVPN プロセスから読める範囲に限定します。
chmod 600 /etc/openvpn/server/ta.key
chown root:root /etc/openvpn/server/ta.keyクライアント側の設定例
クライアント側では、同じ ta.key を配置し、方向に 1 を指定します。
tls-auth ta.key 1クライアント設定ファイルに鍵をインラインで埋め込む場合は、key-direction を明示します。
key-direction 1
<tls-auth>
-----BEGIN OpenVPN Static key V1-----
...
-----END OpenVPN Static key V1-----
</tls-auth>direction の 0 と 1 を揃える
tls-auth では方向指定が重要です。サーバーとクライアントで同じ方向を指定してしまうと、正しく認証できません。
| 側 | 指定例 | 意味 |
| サーバー | tls-auth ta.key 0 | サーバー側の方向 |
| クライアント | tls-auth ta.key 1 | クライアント側の方向 |
接続できない場合、証明書、ユーザー認証、経路設定を見る前に、ta.key が一致しているか、direction が逆になっているかを確認します。
ログで確認する
tls-auth の鍵や方向が合っていない場合、TLS ハンドシェイクに進む前の段階で落ちるため、ログ上は認証失敗や HMAC 関連のエラーとして見えることがあります。
journalctl -u openvpn-server@server
grep -i 'tls\|hmac\|auth' /var/log/openvpn/*.logログを見る時は、証明書エラーなのか、ユーザー認証エラーなのか、tls-auth の HMAC 検証で落ちているのかを分けて考えます。
tls-auth とファイアウォールは役割が違う
tls-auth を入れたからといって、OpenVPN ポートを雑に公開してよいわけではありません。ファイアウォール、接続元制限、ログ監視、証明書失効管理は別の層の対策です。
- ファイアウォールは、どこから OpenVPN ポートへ到達できるかを制御する。
tls-authは、到達したパケットを OpenVPN の制御チャネル入口で認証する。- 証明書と CRL は、クライアントとして認める主体を管理する。
- ログ監視は、失敗や異常な接続試行を後から確認する。
VPN の安全性は、一つの設定で決まるものではありません。入口、認証、証明書、経路、失効、監視を層で見る必要があります。
tls-crypt を使うべきか
新しく構成する場合は、tls-auth ではなく tls-crypt を検討する場面もあります。tls-crypt は制御チャネルを暗号化するため、OpenVPN の制御通信をより見えにくくできます。
ただし、既存環境で tls-auth が安定して動いている場合、無理に変更する必要があるとは限りません。クライアント配布済み設定、互換性、鍵更新手順、障害時の切り分けを含めて判断します。
まとめ
tls-auth は、OpenVPN の TLS 制御チャネルに HMAC 認証を追加する設定です。正しい共有鍵を持たないパケットを早い段階で落とし、未認証の TLS ハンドシェイク試行や雑なスキャンの影響を抑える役割があります。
一方で、tls-auth は暗号化ではありません。制御チャネルの秘匿性を高めたい場合は tls-crypt を検討します。どちらを使う場合でも、鍵ファイルの配布、direction、ログ確認、CRL、ファイアウォールを含めて設計することが重要です。
参考情報
参考書籍
書籍
暗号技術入門 第3版 秘密の国のアリス
公開鍵暗号、電子署名、証明書、認証など、TLS や VPN の前提になる暗号技術を確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。

