SFTPログインが機能しなくなり、エラー127が発生した後、SSH接続が/etc/profile.d/にインストールされたスクリプトを介していくつかの出力を生成したことがわかりました。
以前のバージョンのsshdでは、「UseLogin」というオプションがデフォルトで「no」に設定されているため、構成ファイルの内容は実行されませんでした。このオプションはもう存在しなくなり、デフォルトの動作が変更されたようです。
sshd_configで今置き換えられました。
Subsystem sftp /usr/lib/ssh/sftp-server
渡す
Subsystem sftp internal-sftp
これがうまくいくようです(SFTPが動作しています)。
しかし、私たち全員が知っているように、その理由がわからない場合は、まだ解決されていません。
誰かがこれを説明できますか?より良い「修正」を提案しますか?
修正するSLES15.4(openssh-server-8.4p1)
答え1
SFTP は SSH を転送手段として使用します。すべてのSFTPクライアントは、SSHサーバーがSFTPサーバー(例えば)との通信を確立したいと考えていますsftp-server
。
少なくともOpenSSHでは、SSHサーバーが何かを実行するように指示されたら、ターゲットユーザーのシェルを使用してそれを行います。
Subsystem …
サブシステム(カスタムサブシステムでもあります)は、項目を追加することで定義できますsshd_config
。その場合でも、提供されたコマンドはユーザーのシェルで実行されます。標準サブシステムがに指定されている場合、sftp
これが発生します/usr/lib/ssh/sftp-server
。
SFTPクライアントがSFTPサーバーと通信しようとしているときにシェル(または他のもの)がいくつかの「ガベージ」を印刷すると、SFTPプロトコルの範囲外で通信が中断されます。
SSHサーバーがユーザーのシェルを使用している限り、すべてが完全に確実に機能するようにするオプションはありません。このためです一般的に言えば:
- ユーザーのシェルは何でも構いません。
- 通常のシェルでもいくつかのファイルを取得できます。一部のシェルはこれを実行しないように指示できますが、移植可能なオプションがないため、クライアントはシェルを呼び出すときにSSHサーバーにカスタムオプションを使用するように指示できません。
- ソースファイルは何かを印刷することも、何かを印刷することもできます。
ユーザーシェルを回避する唯一の方法は、SSHサーバーによって内部的に処理されるサブシステムを使用することです。 AFAIKsshd
現在OpenSSHの唯一の内部サブシステムはinternal-sftp
。
internal-sftp
シェルに頼らないので問題を解決しました。
もう1つの修正方法は、SFTPサーバー以外のサーバーがSSHサーバーによって提供される標準ストリームを使用していることを確認することです。回避策には、ユーザーのシェルを沈黙させることが含まれます。そしてシェルは実際に要求されたコマンドを実行しています(たとえば/usr/lib/ssh/sftp-server
、サーバーへのrootアクセス権を持つ人やユーザー自身が簡単に破損する可能性があります)。
比較のためのいくつかの興味深いケース:
一つ不運な編集者が
.bashrc
ユーザーをロックしました。。これSSHを介して直接問題を解決する唯一の方法は次のとおりです。internal-sftp
。有効になっていない場合、internal-sftp
ユーザーは問題を解決するためにSSH以外のプロトコルを使用する必要があります(たとえば、管理者に連絡することはそのようなプロトコルの1つです)。ユーザーが望む走る注文する(おそらく愚かな)リモートシェルからの干渉なし。
答え2
それは問題ではありません。
LD_LIBRARY_PATH=/some/path
誰かが古いライブラリ(libcryptoなど)を含む/ some / pathに入り、古代/etc/profile.d/xxx
の仕事をしました。面白くないとだけ申し上げます。これもsftp-serverを壊すことです。
/usr/lib/ssh/sftp-server: symbol lookup error: /usr/lib/ssh/sftp-server: undefined symbol: EVP_KDF_CTX_new_id, version OPENSSL_1_1_1d
修正するprofile.dで生成された出力がまだ存在するため、上記の問題を解決すると、sftp-serverが再び機能するかどうかはわかりません。私はそれを試していませんでした。固定エラー/終了コード127があるかもしれませんが、他のエラーが発生する可能性があります。
内部的には、sftpは間違ったライブラリを使用せず、ログインシェルを作成しません(詳細については@kamil-maciorowskiの回答を参照)、これは唯一のエスケープです。 uid 0以外の場合など、特定のuidに対してのみ実行されるようにprofile.dのスクリプトを調整する場合を除き、場合によっては出力は生成されません。