SFTP が SSH に基づいていないのはなぜですか?

SFTP が SSH に基づいていないのはなぜですか?

私はちょうど完了しましたOverTheWire Bandit ウォーゲーム、レベル 18

それは驚きでした。これがこのレベルの説明です。

次のレベルのパスワードはファイルに保存されますリードミーホームディレクトリにあります。残念ながら、誰かが変更しました.bashrcSSH でログインするときにログアウトします。

シェルがソースをスキップする方法を考えていました.bashrc。しかし、解決策を見つける前に、サーバーとの SFTP 接続を開始するだけの誘惑に駆られました。うまくいくとは思っていませんでした。しかし、うまくいきました。その理由を知りたいです。SFTP は SSH 経由で実行されるものだと思っていました。

明確に言うと、サーバーに SSH で接続すると、予想どおりに追い出されます。

答え1

bash全般について

起動ファイルに関する Bash の設計はかなり特殊です。Bash は.bashrc2 つの無関係な状況でロードされます。

  • 対話型シェルの場合、ログインシェル(ただし、 として呼び出された場合は除くsh)。これが理由です.bash_profile通常はロード.bashrc
  • bashがない対話型でもログイン シェルでも として呼び出されず、sh実行するコマンドが指定されており-cSHLVL設定されていないか 1 以下であり、次のいずれかが当てはまります。

    • 標準入力がソケットの場合。実際には、これは主にbashが次のように呼び出されたときに発生します。rshdつまり、実行中の場合ですrsh remotehost.example.com somecommand
    • コンパイル時に有効になっている場合 (Debian やその派生ディストリビューションなど、一部のディストリビューションではこれが該当します)、環境変数 または のいずれかSSH_CLIENTSSH2_CLIENT定義されている場合。実際には、これは bash が によって呼び出されることを意味しますsshd(つまりssh remotehost.example.com somecommand)。bash
      がどのようにコンパイルされたかわからない場合は、バイナリに文字列 が含まれているかどうかを確認することで、このオプションが設定されているかどうかを確認できますSSH_CLIENT

      strings /bin/bash | grep SSH_CLIENT
      

SSH全般について

SSH プロトコルを介してコマンドを実行すると、コマンドは文字列としてネットワーク上に渡されます。文字列はリモート シェルによって実行されます。 を実行するとssh example.com somecommand、リモート ユーザーのログイン シェルが の場合/bin/bash、SSH サーバーは を実行します/bin/bash -c somecommand。ログイン シェルをバイパスする方法はありません。これにより、たとえば次のような制限されたログイン シェルが許可されます。ファイルのコピーのみ許可する一般的なコマンド実行ではありません。

例外が1つあります。SSHプロトコルでは、クライアントが特定のサブシステムを要求できます。クライアントがサブシステムを要求した場合sftp、デフォルトではOpenSSHサーバーはユーザーのログインシェルを介してプログラム/usr/lib/openssh/sftp-server(場所は異なる場合があります)を呼び出します。ただし、次の行を介して内部SFTPサーバーを実行するように構成することもできます。

Subsystem sftp internal-sftp

ファイル内sshd_config。内部 SFTP サーバーの場合のみ、ユーザーのログイン シェルはバイパスされます。

この挑戦のために

.bashrcOverTheWire Bandit 18の場合、


# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
echo 'Byebye !'
exit 0

したがって、bash が対話的でなくなるような操作を行うことで、このレベルを解決できます。

ご存知のとおり、SFTP は機能します。
ただし、も機能します。 も 同様です。 また、対話型ログイン中に適切なタイミングで Ctrl+C を押すことも機能します。これにより bash が中断されるため、 は完全には実行されません。bash は起動に非常に時間がかかるため、これは確実に機能するわけではありませんが、実際には実行できます。 ssh [email protected] cat readme
echo 'cat readme' | ssh [email protected]
.bashrc

答え2

.bashrcシェルを起動したときにのみ実行されます。

Subsystem internal-sftpSSH サーバーは、サーバーのファイルにコマンドを指定することにより、SFTP プロトコルのシェルを起動しないように設定できます sshd_config

推測: への調整ではなく、OverTheWire Bandit ウォーゲームが実際に構成されている方法はこれである可能性が高いです。.bashrcそうでないと、 への同じ制限により、サーバー コマンドsshもブロックされてしまうためですsftp

答え3

sftp は同じ資格情報を使用しますが、リモート マシン上で対話型シェルを実行しません。

管理者は、例えば次のようにして、sftpユーザーがsshを実行できないようにすることができます。SSHではなくSFTPのみにユーザーを制限する方法

関連情報