あなたの VPN コマンドは非特権で動き、サービスはそうではない
パスワードを求められないことは、誰が経路を変えるかを何も語らない。サービスと、それが公開するインターフェースと、誰が要求できるかを決めるポリシーを探す。
VPN コマンドはあなたのユーザーとして動き、パスワードは表示されず、トンネルが立ち上がる。この流れは非特権の操作のように感じられるが、たいていそうではない。ネットワークの変更は別のサービスが行い、興味深い問いは、そのサービスが検証していない呼び出し元に対して何をするかだ。パスワードの要求を数えても、その境界については何も分からない。
インターフェース、仕組み、検査
インターフェースは、接続、切断、プロファイルの選択といった要求を受け付ける。仕組みは、インターフェースの作成、経路の変更、フィルタの適用といったネットワーク操作を所有する。認可の検査は、この呼び出し元がこの操作を要求してよいかを決める。この三つはバイナリ、ヘルパー、システムサービスに分散し得るが、利用者に見えるのは最初の一つだけだ。
役割は一つのバイナリに住むことも、二つのプロセスに住むことも、クライアントとシステムサービスに分かれることもあり、利用者が見るコマンドがどれかを明かすことはほとんどない。トレイのアイコンとシステムデーモンは、まったく異なる権限で動いていても一つのアプリのように見え得る。インストール時の権限と要求時の権限も別のものだ。root として動いたインストーラは、パッケージマネージャが終わったずっと後まで、後続の要求を待ち受けるサービスを残すことがある。権限を持つのはそのサービスであり、あなたが打ち込んだコマンドではない。
委譲はふつうの設計だ
特権を持つネットワーク作業をサービスに委ねるのは妥当なアーキテクチャだ。ふつうのアプリを非特権のままにし、注意を要する操作を集約できる。この設計が報われるのは、サービスが誰の何のための要求かも検査するときだけだ。その検査がなければ、ただの広い扉にすぎない。
NetworkManager は Linux の具体的な例だ。その設定ガイドは、既定の設定で PolicyKit が root 以外の要求をどう認可するかを説明している。これは実際の製品における委譲された認可を示している。すべての商用クライアントが NetworkManager を使うことの証明ではなく、特定ベンダーのソケットパスやポリシーを述べたものでもない。
この型は、背後にポリシーを伴う委譲だ。この例はその型の一つの実装であり、普遍的なものではない。
境界を読むのであって、要求を読むのではない
サービスと、その設定の所有者と、フロントエンドが使うローカルのインターフェースを見つける。次に、どの利用者がどの操作を要求できるかを問う。保存済みのプロファイルを一つ上げ下げできることは、運用者が一度も見ていない設定を読み込む許可と同じではない。その差がセキュリティの問いのすべてだ。
サービスマネージャと、クライアント自身が自分の権限をどう見ているかから始める。以下のコマンドは、デーモンが動いているか、呼び出し元が何を要求できるか、デーモンが実行時ディレクトリの下で何を公開しているかを示す。
systemctl status NetworkManager
nmcli general permissions
ls -l /run/NetworkManager
その操作が何に影響するかも問う。個人的に見えるメニュー項目は、マシン全体の経路と DNS を変え得るので、他の利用者のセッションを妨げ得る。影響範囲は権限と同じ検討に入るもので、サービスがより狭い役割を必要とするかはたいていこれで決まる。
対応した方法で権限を直す
保護された制御ソケットを誰でも書き込めるようにしたり、アカウントを広い管理グループに加えたりすると、権限エラーは消えるが、より大きなものが生まれる。そのエラーは、境界が存在すると告げていた唯一のものだった。文書化されたメンバーシップや認可の手順を使い、それが要求するセッションの更新も行う。グループのメンバーシップは新しいログインセッションにだけ適用されることが多く、だから変更が次のサインインまで何もしていないように見えるのだ。
製品がその操作により狭い役割を用意しているなら、包括的な付与よりそちらを選ぶ。選んだ役割とその所有者を、サービスの名前の横に書く。
よい分割とはどんなものか
ふつうのアプリは非特権のままで、サービスは設計された設定だけを行い、どの呼び出し元も誰かが所有するポリシーに対して検査される。それは弁護できる設計だ。ポリシーに名前が結びついているので、監査もできる。それより大きいものは、静かな権限変更ではなく書面の例外に値する。
失敗の型は、インターフェースが便利だからという理由で、どのローカル利用者のどの要求でも実行してしまうサービスだ。利用者から見れば同じに見え、はるかに大きな権限を運ぶ。成功した要求だけでなく、拒否された要求を一つ試す。ポリシーから来る拒否こそ、ポリシーが存在する証拠だ。