web-dev-qa-db-ja.com

OpenSSH:internal-sftpとsftp-serverの違い

OpenSSHでSFTPを設定する方法が2つあり、いつ使用するのですか?それらの間に違いはありますか?

最初の1つはOpenSSHからのlibを使用しており、2番目の1つは「内部を使用する」と言っているので、OpenSSHでもありますか?

Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp
89
Denny Crane

_sftp-server_と_internal-sftp_はどちらもOpenSSHの一部です。 _sftp-server_はスタンドアロンバイナリです。 _internal-sftp_は、別のプロセス(通常は_sftp-server_)を実行する代わりに、sshdsshdに組み込まれたSFTPサーバーコードを使用するように指示する単なる構成キーワードです。

_internal-sftp_は、スタンドアロンの_sftp-server_バイナリよりもずっと後に追加されましたが(2008年のOpenSSH 4.9p1?)、現在ではデフォルトになっています。 _sftp-server_は冗長になり、下位互換性のために保持されています。

新規インストールに_sftp-server_を使用する理由はないと思います。


機能の観点からは、_sftp-server_と_internal-sftp_はほとんど同じです。それらは同じソースコードから構築されています。

_internal-sftp_の主な利点は、 ChrootDirectoryディレクティブ と一緒に使用すると、サポートファイルが不要になることです。

sshd_config(5) manページ からの引用:

  • Subsystemディレクティブの場合

    コマンド_sftp-server_は、SFTPファイル転送サブシステムを実装します。

    または、_internal-sftp_という名前でインプロセスのSFTPサーバーを実装します。これにより、ChrootDirectoryを使用して構成を簡略化し、クライアントに別のファイルシステムルートを強制できます。

  • ForceCommandディレクティブの場合

    _internal-sftp_のコマンドを指定すると、ChrootDirectoryと併用した場合にサポートファイルを必要としないインプロセスSFTPサーバーが強制的に使用されます。

  • ChrootDirectoryディレクティブの場合

    ChrootDirectoryには、ユーザーのセッションをサポートするために必要なファイルとディレクトリが含まれている必要があります。インタラクティブセッションの場合、これには少なくともシェル、通常はsh、およびnullzerostdinstdoutstderrttyなどの基本的な_/dev_ノードが必要です。 SFTPを使用するファイル転送セッションでは、インプロセスのsftp-serverを使用する場合、環境の追加構成は不要ですが、ロギングを使用するセッションでは、一部のオペレーティングシステムのchrootディレクトリ内に_/dev/log_が必要になる場合があります(_sftp-server_ 詳細については)。

_internal-sftp_のもう1つの利点は、新しいサブプロセスを実行する必要がないため、パフォーマンスです。


sshdは、機能が同じで_internal-sftp_にも上記の利点があるため、_sftp-server_を検出すると自動的に_internal-sftp_を使用できるように見える場合があります。ただし、相違点があるEdgeケースもあります。

いくつかの例:

  • 管理者は、特定のユーザーがログインできないようにログインシェル構成に依存する場合があります。_internal-sftp_に切り替えると、ログインシェルが不要になるため、制限が回避されます。

  • _sftp-server_バイナリ(スタンドアロンプ​​ロセス)を使用すると、 Sudo でSFTPを実行するなどのハックを使用できます。

  • SSH-1の場合(まだ誰かが使用している場合)、Subsystemディレクティブはまったく含まれていません。 SSH-1を使用するSFTPクライアントは、サーバーが実行するバイナリをサーバーに明示的に通知します。そのため、レガシーSSH-1 SFTPクライアントには_sftp-server_の名前がハードコーディングされています。

104
Martin Prikryl

OpenSSHと一緒に使用できる代替のSFTP実装があります。

8
ptman

Authorized_keyを外部のsftpサーバーにロックできます。

command = "/ usr/libexec/openssh/sftp-server" ssh-rsa AAAA…== [email protected]

その場合、ユーザーはsftpを実行できますが、scpまたはsshは実行できません。

$ sftp Host:/ etc/group /tmp
Connecting to Host ... 
/etc/group to /tmp/group
/etc/group 100%870 0.9KB/s 00:00

他のことを行おうとするとハングします:

$ scp Host:/ etc/group /tmp
Killed by signal 2。
 
 $ ssh Host uptime 
 Killed by signal 2.

悲しいかな、sshd_configが変更されない限り、キーをchrootに簡単にロックする方法はありません。これは、システム管理者の介入なしにユーザーが実行できるようにするのに本当に便利です。

6
Charles Fisher