16 ポイント 投稿者 GN⁺ 2024-05-01 | 1件のコメント | WhatsAppで共有

run0: systemdのsudo代替ツール

  • v256に含まれる新しいツール(実際には既存の systemd-run へのシンボリックリンク)
  • sudoと似たように動作するが、SUIDではない
  • サービスマネージャーに対し、対象ユーザーのUIDでコマンドやシェルを起動するよう要求する
    • クライアントからコンテキストを継承せず、PID 1から新たにforkされた隔離された実行コンテキストで対象コマンドを呼び出す
  • run0は独自の設定言語を実装せず、認可にはpolkitを使用する。
  • 権限昇格中はターミナルの背景を赤みがかった色調に変え、特権で動作中であることを知らせる。ウィンドウタイトルにも権限昇格の有無を示す赤い点を表示する。
  • systemd-run--property= スイッチをサポートしており、起動された特権コマンド/セッションに対して任意のサービス設定を指定できる。

sudoの問題点

  • sudoは比較的大きなSUIDバイナリであり、非特権ユーザーが自分のコンテキストで呼び出せる特権コードである。
  • 複雑な設定言語、ロード可能なプラグイン(LDAPなど)、ホスト名マッチングなど、攻撃対象領域が大きい。
  • SUIDバイナリである点が最大の問題。非特権コードによって呼び出され、非特権コードが制御する実行コンテキスト(環境変数、プロセススケジューリング属性、cgroup割り当て、セキュリティコンテキスト、受け渡されたファイルディスクリプタなど)を継承する。SUIDバイナリはこれらを非常に慎重にクリーンアップしなければならないが、うまくできていない場合が多い。

そのほか

  • run0ではシェルだけでなく、root権限でほかのコマンドも実行できる。プログラム終了時にはターミナルの色が元に戻る。
  • 背景色の自動変更は煩わしいかもしれないが、--background= スイッチで変更または無効化できる。
  • sudoをrun0で完全に置き換えることも可能に見えるが、ディストリビューションごとに好みは異なるかもしれない。
  • LDAP対応など、sudoのプラグイン方式には問題が多い。polkitはsystemdで安全に管理される形で拡張できる。
  • run0でbashスクリプトが実行されているかどうかは、sudo互換の SUDO_xxx 環境変数で確認できる。

GN⁺の意見

  • よく使われるsudoの代替としてrun0を提示した点は印象的。SUIDの危険性を避けつつ、sudoの長所は引き継いでいるように見える。
  • 権限昇格の有無を視覚的に明確に知らせるのは、ミスによる被害を減らすのに役立ちそうだ。ターミナルの背景色を変えるのは気になるかもしれないが、オプションで調整できるので大きな問題ではなさそう。
  • polkitによる権限設定はsudoほど柔軟ではないかもしれないが、そのぶん単純化され、攻撃対象領域を減らせるはずだ。polkitの設定例をきちんと文書化することが重要に見える。
  • sudoに依存する既存スクリプトなどの移行のため、しばらくはsudoも併せて提供されるべきだろう。ただし新しい環境なら、最初からrun0を使うのがよさそうだ。
  • 長期的には、run0導入をきっかけにSUIDを大胆に排除し、システム権限をシステムサービスで集中管理するアーキテクチャへの移行が期待される。セキュリティと堅牢性の面で望ましい方向だと思う。

1件のコメント

 
GN⁺ 2024-05-01
Hacker News の意見
  • run0 は sudo と異なり、クライアントからいかなるコンテキストも継承せず、PID 1 から新たに fork された隔離された exec コンテキストで対象コマンドを呼び出す。これは shell コマンドの一般的なユースケースに合っておらず、実際には問題の原因となり、広く採用されるのは難しいだろう。
  • run0 が広く使われるようになれば、sudo のように動作するフラグが追加され、人々は常にそのフラグを使うようになるだろう。これが問題を引き起こしたとき、systemd プロジェクトは sudo を排除しようとするかもしれない。
  • run0 は権限レベル間に厳格な IPC 境界を設けることで、sudo とは異なるアプローチを取っている。systemd を使いたい人にとっては良い方法かもしれない。
  • sudo はほとんど一人の人物によって保守されている。
  • run0 の挙動は、多くの点で sudo より ssh に近い。localhost に SSH 接続することで、似たようなツールを実装できる。
  • 1980 年代半ば、Berkeley の実験的な BSD クローンで似たアイデアが試されたが、すべてをパイプで渡す複雑さのため却下された。代わりに、継承される環境の検査が強化された。
  • run0 には、ロギング、受け渡される環境変数、シグナル処理、sudoedit の代替策などについて疑問点がある。
  • run0 以外にも、Rust で書かれたメモリ安全でバグの少ない sudo 実装がある。
  • 最近では、1 台の物理マシンに 1 人のユーザーしかいないことが多く、Unix の権限システムを簡素化する必要がある。
  • 権限昇格時にターミナルの背景色を赤く変えることは、重要な部分ではない。