このページは大阪弁化フィルタによって翻訳生成されたんですわ。

翻訳前ページへ


特権分離 (Privilege Separated) OpenSSH
Translation: [EN] [FR] Wishlists: [Books],[Music]
 
   Center for Information Technology Integration   
特権分離 (Privilege Separated) OpenSSH
  
 

特権分離 (Privilege Separated) OpenSSH

わてたちはプログラミング上のミスによる影響を、 特権 (root権限) をもたへん子プロセス内に閉じこめることで その影響を制限するっちうことにしてるんや。 特権をもたへん子プロセスからシステムをやぶることはでけしまへん。 ゴチャゴチャゆうとる場合やあれへん、要は、わてたちの目標は OpenSSH の中で完全に特権を分離するっちうことなんやこれがホンマに。

特権分離には 2つのプロセスを使用しまっせ。 特権をもつ親プロセスは、特権をもたへん子プロセスの進行を監視しまっせ。 子プロセスは特権をもってへんねん。こらその uid/gid を実際には使われへん ユーザのもんに変更し、chroot() によってそのプロセスの ファイルシステムへのアクセスを /var/empty に制限するっちうことで 達成されはります。こらネットワークデータを処理するためだけのプロセスなんやこれがホンマに。 特権をもつ親プロセスは、どエライ小さな有限状態遷移機械として モデル化するっちうことが可能なんやし、これによって特権をもった状態で実行される コードについて理づめで考える (reasonする) のが容易になるんですわ。

特権をもつ親と、特権をもたへん子の間で きちんと定義されたインターフェイスがあれば、 子プロセスは特権を必要とする操作を親プロセスに委任するっちうことが可能や。 認証が性交...ひひひ,ウソや,成功したかどうかは親プロセスによって決定されはります。

特権をもつプロセスともたへんプロセス間における通信は、 パイプによって実現されはります。パイプでは共有でけへん それ以外のデータは、共有メモリに保持されはります。 子プロセスは特権をもつ親に認証が性交...ひひひ,ウソや,成功したかどうかを尋ねる必要がおます。

  Diagram

もし子プロセスがおかしくなって (corrupted)、リモートにおるユーザが認証できたと 信じてしもたとしたかて、親プロセスがそれと同じ結論に達せんかぎりアクセスが 許可されることはおまへん。

これまでの sshd では、これが認証前におかしくなっていまうこと (corruption) は、すぐさまリモートからの root 権限取得につながる 可能性がおました。認証後におかしなると、こら ローカルでの root 権限取得の可能性がおます。 特権分離は、こないな風な攻撃を不可能ではおまへんにせよ どエライむずかしくしまっせ。

プロジェクトの状況

  • 2002-03-18: 特権分離 OpenSSH が OpenBSD cvs リポジトリに統合されたんですわ。
  • 2002-03-16: ユーザからのフィードバックによって判明した いくつかの枝葉な問題が解決されとりまんねん。
  • 2002-03-15: 最終バージョン。 フィードバックをまちまんねん。
  • 2002-03-14: 少々のバグフィックス。わてのデスクトップマシンでは どこでもどエライ安定して動いとりまんねん。
  • 2002-03-13: SSHv1 も特権分離されたんですわ。 BSD-auth がサポートされ、その他の認証システムもじきに 特権分離された状態で動作するようになるんですわ。
  • 2002-03-12: ずぅぇえええぇぇええんぶの OpenSSH は完全に特権が分離されたんですわ。 認証後に特権分離を使うためには、OS は ファイル記述子 (file descriptor) の受け渡しをサポートする必要がおます。 もしファイル記述子の受け渡しが使えんと、特権分離は認証が性交...ひひひ,ウソや,成功したあとで 終わってまうでっしゃろ。
    • SSH v2 only: 特権分離はいまのトコ SSH プロトコル バージョン 2 で動きまんねん。 SSH プロトコル バージョン 1 に関しては目下作業中や。
  • 2002-03-11: 認証前の段階では完全に特権が分離されるようになったんですわ。 認証が性交...ひひひ,ウソや,成功したあとは特権をもたへん子プロセスがその暗号状態と圧縮状態を export し、特権をもつ親がそれをもとに処理しまっせ。
    • 暗号状態: OpenSSH は現在の IV と、ストリーム暗号化のために鍵の状態全体を 追う必要がおます。いまのトコは、EVP_CIPHER_CONTEXT 構造体から このコンテキストを取得してるんや。
    • 圧縮状態の export: 2つの共有メモリマップを作成する必要がおました。 zlib のメモリ割り当て関数をオーバーライドして メモリマップ 1 を割り当とるようにしまっせ。 メモリマップ 1 の割り当て関数をオーバーライドして メモリマップ 2 から要素を割り当とるようにしまっせ。 このプロセスが存在してん間、メモリマップ 2 中に格納された メモリマップ 1 から制御構造をずぅぇえええぇぇええんぶ手にできまんねん。 またメモリマップ 2 の情報をつこうて、メモリマップ 1 の状態を プロセス間で完全に同期させることができまんねん。
      zlib ライブラリには自前の割り当て機構に対するフックが用意されとるさかい、 こら完全に透過的 (transparent) に実現されとりまんねん。

参考文献

特権分離に関する論文はまもなく出まんねん。

ソースコード

ソースコードは OpenBSD CVS リポジトリから取得可能や。
  • 2002-03-18: 以下のコマンドで ssh のソースを取得するっちうことができまんねん。
    cvs -d anoncvs@anoncvs1.ca.openbsd.org:/cvs get src/usr.bin/ssh
    
    せやなかったら、他の anoncvs server でもかまいまへん。

謝辞

Markus Friedl が特権分離のコードを書くのを手伝ってくれはりました。 コードの質が飛躍的に向上したんは彼の提案のおかげや。

移植性

移植性を確保するっちうことは急務や。 共有メモリへのインターフェイスがきれいに抽象化され、 匿名のメモリマップ (anonymous memory map) をサポートしておらへん OS でも再実装が簡単になるようにすべきや。

移植版 OpenSSH は特権分離をサポートしてるんや。 せやけどダンさんいくつかの OS では多少の問題が残っており、 これについては現在作業中や。

 

  

Questions and Comments:
Niels Provos
Last modified: Sat Jul 6 12:24:15 EDT 2002
  You can keep me happy while hacking by reducing my Wishlists: Books, Music

Japanese translation by Yusuke Shinyama.