OpenVPNクライアントを一台追い出す:kill・deny・証明書失効のどれを使うか
OpenVPNの三つの操作はどれもクライアントを外しますが、終わらせる対象は異なります。実行中のセッション、一回のログイン試行、再接続の権利です。識別子で選びます。
手元のメモにはコモンネームとアドレスがあり、どれもクライアントを外しそうに見える三つのコマンドがあります。望む結果になるのは一つだけで、選択は、いま動いているセッションを終わらせたいのか、次のログインを拒否したいのか、接続の権利そのものを奪いたいのかで決まります。OpenVPNのプールが同じトンネルアドレスを後で別のセッションに渡すため、何かに触れる前に実際に持っている識別子を読み取ってください。
実際に持っている識別子はどれか
バージョン 3 のステータスファイルが通常の出発点です。CLIENT_LISTセクションにはコモンネーム、実アドレス、バイトカウンタ、接続時間が入り、ROUTING TABLEセクションは仮想アドレスをコモンネームに対応づけ、最後に参照された時刻を持ちます。コモンネームが安定した識別子です。仮想アドレスは割り当てにすぎず、NATの背後の実アドレスはサーバー側に何の変化もなくセッション間で変わることがあります。
管理インターフェースは status コマンドで同様の見え方を提供し、セッションごとのクライアントIDを加えます。client-kill が期待するのはこのIDで、トンネルアドレスではありません。接続時にどのコモンネームがどのアドレスを受け取ったかを知る必要がある場合、client-connectスクリプトの環境変数には両方と信頼できる外側アドレスが入っていますが、そのスクリプトはOpenVPNユーザーとして実行され、書き込み可能なログパスが必要です。
| What you hold | Where it came from | What it can act on |
|---|---|---|
| Common name | CLIENT_LIST, or the auth hook | kill, and credential revocation |
| Client ID | status on the management socket | client-kill, that one session |
| Tunnel address | ROUTING TABLE, client-connect environment | Nothing durable, the address is recycled |
すぐ殺す、ログインで拒否する、恒久的に失効させる
管理インターフェースの二つの削除コマンドはいずれもセッション操作です。kill はコモンネームか実アドレスとポートを受け取り、client-kill はクライアントIDを受け取ってそのインスタンスを即座に終わらせます。どちらもブロックではなく、有効な証明書とパスワードを持つ追い出されたクライアントは数秒で再接続するため、テスト用ピアを入れ替えるときは問題なく、ノートPCが盗まれたときには役に立ちません。
client-deny は別種の判断です。通常は認証フックまたはclient-connectフックから発行され、理由付きでセッションを拒否するので、接続を中断する方針ではなくログインを拒否する方針に向きます。ドキュメントはまた、TLS再ネゴシエーション中に発行された拒否が再ネゴシエーション後の鍵を無効にする一方、既存セッションは移行ウィンドウが閉じるまで動き続けうると警告しています。クライアントが今すぐ消えていることが要件なら、文書化された答えは client-kill です。
恒久的な削除はこのすべての下にあります。証明書を失効させ、crl-verify がサーバーによって実際に再読み込みされるリストを指していることを確認し、ccdディレクトリのクライアント固有の設定ファイルを無効にし、または認証フックが問い合わせるバックエンドのアカウントを無効にします。失効も即時ではなく、既定の reneg-sec 設定では確立済みのセッションが再ネゴシエーションまで動き続けるため、セッション操作と資格情報の操作は補完関係にあり、代替ではありません。
管理ソケットは空いているか?
管理インターフェースは同時に一つのクライアントにサービスを提供します。GUIや監視デーモンがすでに接続を握っている場合、スクリプトは横から接続できず、クライアントによってはきれいに失敗する代わりに既存の接続を追い出すことになります。そのパスワードはそのソケット上を平文で流れるので、ローカルアドレスかunixソケットに置くべきで、公開インターフェースには決して置きません。
ソケットを取れない場合でも選択肢はあり、どれも遅くなります。GUIを制御下に置いているならまずそのセッションを落とすか、資格情報レイヤーの経路を受け入れて次の再ネゴシエーションを待ちます。一台のクライアントを外すためにサービスを再起動すると、他のすべてのセッションも終わり、このセッションのステータスファイルの証拠も壊れるので、それはやってはいけません。
本番サーバーで実行する順序
接続し、現在の状態を読み、いま読んだIDに対して操作し、もう一度読みます。文書からコピーした値は、間違った相手を殺す最も一般的な方法です。
status # note the client ID and common name
client-kill 3 # end that session now
kill Test-Client # alternative: by common name
status # confirm the session is gone上の名前と番号はプレースホルダーで、IDは他のクライアントが切断された後に再利用されます。何かを完了として記録する前に、その行が存在しないことを確認し、接続中のクライアント数が複数ではなく一つ動いたことを確かめます。
戻ってこないことを確認する
コモンネーム、トンネルアドレス、外側アドレス、削除した分を記録します。同じコモンネームが一分後に再び現れたなら、セッション操作は効いて資格情報レイヤーは効いていないので、コマンドがまったく効かなかった場合とはまったく別の修理になります。
次にクライアント側から試します。失効した証明書は次のハンドシェイクで失敗するはずで、それでも接続できるならCRLはまったく読まれておらず、それが報告する価値のある発見です。何を終わらせるかで操作を選び、二回目の status で確認し、答えがセッションより長く残らなければならないときは資格情報レイヤーを直します。