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件のコメント
Hacker News の意見