web-dev-qa-db-ja.com

OpenSSH sftp jail / chrootはどのように機能していますか?

この質問は実際には広すぎます...

私が本当に知りたいのは、それが実際にchrootであるかどうか、もしそうなら、chrootに必要なbinary/libが明らかに不足しているにもかかわらず、SSHユーザーdeamon [1]をそのjailで起動する方法です。

グーグルはこの問題について驚くほど沈黙している。しかし、それで十分であることを説明するための良い参考資料です(ただし、私は彼らのCを読んで理解するのに十分なほど散らかっていません)。

[1]:メインルートのOpenSSHデーモンによる接続時に起動されるユーザー権限を持つ実際の一時デーモンについて話しています。

1
LouisTP

もう1つの答えは非常にあいまいです(質問もそうです)ので、この現象についてもっと冗長にしようと思います。このトピックがすべての人に向けられているわけではないことは知っていますが、興味のある人にとっては、知っておくと非常に良いことです。

chrootが行われる場所は2つあり、両方を突っ込んでいるので、アイデアを調整しようと思います。

  1. 特権分離 があります。これはセキュリティメカニズムであり、その一部はネットワークの子の制限としてchrootでもあります。これは通常、/var/emptyのような空のディレクトリです。

    その理由は、簡単に言えば、このプロセスはファイルシステムを認識せず、他の方法でも制限されているため、脆弱性があった場合、おそらく悪用できないためです(サンドボックス、さらなる読み物のためのSECCOMPキーワード)。

  2. 後で、特定のディレクトリでユーザーのセッション(SFTPだけでなく)をchrootして、ファイルシステム全体へのアクセスを防ぐことができます。タイトルからすると、これはおそらくあなたが興味を持っている部分です。

    Chrootのsftpに関するmagicは、(フルパスSubsystem sftp internal-sftpの代わりに)Subsystem sftp /usr/lib/openssh/sftp-serverを指定できることです。これは、sshdsftp-server全体がコンパイルされており、バイナリではexecの代わりに、サーバーの動作が定義されている関数を 呼び出し することを意味します。これには、ユーザーのchrootにサポートファイルは必要ありません(シェルとその依存共有オブジェクトが必要な通常のセッションとは異なります)。このような情報に関心がある場合は、ロギングソケットも必要になる場合があります。

1
Jakuje

リモートサーバーのコマンドで呼び出されたsshにログを追加するために、特権分離モードの操作を処理しようとしています。あなたが言うように、あなたはそれについて多くのものを見つけません。

明らかな鍵は、オプション「UsePrivilegeSeparation」です。

ユーザー認証の過程で、sshdフォークは特権を削除し、ユーザーsshdを使用してchrootで実行されます。ソースコードを分析したところ、/ var/emptyにchrootされていることがわかりました。

また、chrootの前後のコード間でいくつかの操作が一致する必要があることを確認するためのチェックもいくつかありますが、これについてはまだ調べていません。

関連するリンクも残しておきます。

http://www.openbsd.org/papers/openssh-measures-asiabsdcon2007-slides.pdf

0
Rui F Ribeiro