ユーザーは OpenVPN の GUI をダブルクリックし、UAC のダイアログを承認し、次の再接続でも同じ手順を繰り返します。このダイアログはパッケージの不備ではありません:クライアントは仮想アダプターを作成し、ルーティングテーブルを編集しますが、どちらも特権を必要とする変更です。本当に問うべきは、そのうちどの権限をユーザーが実際に必要とするかです。サービスと限定的な委任で、管理者のメンバーシップを配らずに接続を賄えます。

どの操作に実際に昇格が必要か

トンネルは仮想ネットワークインターフェースで終端し、そのインターフェースの導入は一度だけ管理者権限を要するドライバー操作です。アダプターが存在した後も、接続のたびにルートが書き込まれ、プロファイルによっては DNS の構成も変わります。通常のアカウントで昇格が起きるのは、この二つの手順のためです。認証や暗号化には管理者権限が一切不要で、まさにそのために特権を切り離せます。

権限を与える前に、インストール時と接続時を分けて考えてください。両者は所有者も寿命も異なります。

サービスを特権コンポーネントとして使う

サポートされる構成では 必要な権限を持つ Windows サービスを実行し、GUI がそのサービスに接続を要求します。こうすれば特権コードがユーザーのセッション内で動くことはありません。

sc query OpenVPNService
sc qc OpenVPNService

バイナリのパスが導入済みのクライアントを指すサービスが動いていることこそ、何かを委任する前に確かめる最初の事実です。アダプターとルートはサービスが所有するため、ユーザーは接続を開始し停止するだけです。共有マシンでは、接続をクリックするアカウントが常設の特権を持たないため、この形を使うべきです。ディスクリプターは sc sdshow で読み、編集する前に出力の正常な控えを残してください。

組み込みグループでルート変更を委任する

対話的に動かす必要があるクライアントでは、委任先の組み込みグループは Network Configuration Operators です。ネットワーク設定とルート変更を対象とし、ソフトウェアの導入や一般的な管理作業は含みません。

net localgroup "Network Configuration Operators" alice /add
sc sdshow OpenVPNService

アカウントの追加は無言では済みません:既定のポリシーは依然としてセッションごとに一度ダイアログを出すため、この許可は昇格でできることを減らすだけで、なくすものではありません。メンバーシップは静かに積み上がり、ほとんど見直されないので、文書化してください。サービスの経路では、sc sdset を使ったディスクリプターの編集で開始と停止をグループに委任できますが、ディスクリプターの打ち間違いは全アカウントの開始権限を奪いかねず、取り消しには管理者が必要です。ディスクリプターの変更は、本番ホストに届く前にラボのマシンで試してください。

ユーザーアカウントで確認する

管理者セッションで行った構成は、それを使うアカウントについて何も証明しません。そのユーザーでサインインし、接続し、前後でマシンの状態を比べてください。

route print -4
Get-DnsClientServerAddress

ルーティングテーブルにはトンネルのルートが加わり、接続中はリゾルバーが VPN の提供するサーバーを指すはずです。切断後は、両方の出力が事前に取った控えと一致するはずで、だからこそ先に取っておくことが重要です。ドライバーの更新で管理者の要件が再び入ることがあるため、結果の横にクライアントのバージョンを記録してください。プロファイルと鍵のファイルは、共有インストールのために権限を緩めるのではなく、使うアカウントだけが読めるようにしてください。

誰がトンネルを開始でき、どのグループがそれを許し、何にまだ管理者が必要かを書き留めてください。そのメモがあれば、次のクライアント更新は当て推量の午後ではなく計画された作業になります。

関連記事