OpenSSHでSFTPを設定する方法が2つあり、いつ使用するのですか?それらの間に違いはありますか?
最初の1つはOpenSSHからのlibを使用しており、2番目の1つは「内部を使用する」と言っているので、OpenSSHでもありますか?
Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp
_sftp-server
_と_internal-sftp
_はどちらもOpenSSHの一部です。 _sftp-server
_はスタンドアロンバイナリです。 _internal-sftp
_は、別のプロセス(通常は_sftp-server
_)を実行する代わりに、sshd
にsshd
に組み込まれたSFTPサーバーコードを使用するように指示する単なる構成キーワードです。
_internal-sftp
_は、スタンドアロンの_sftp-server
_バイナリよりもずっと後に追加されましたが(2008年のOpenSSH 4.9p1?)、現在ではデフォルトになっています。 _sftp-server
_は冗長になり、下位互換性のために保持されています。
新規インストールに_sftp-server
_を使用する理由はないと思います。
機能の観点からは、_sftp-server
_と_internal-sftp
_はほとんど同じです。それらは同じソースコードから構築されています。
_internal-sftp
_の主な利点は、 ChrootDirectory
ディレクティブ と一緒に使用すると、サポートファイルが不要になることです。
sshd_config(5)
manページ からの引用:
コマンド_
sftp-server
_は、SFTPファイル転送サブシステムを実装します。または、_
internal-sftp
_という名前でインプロセスのSFTPサーバーを実装します。これにより、ChrootDirectory
を使用して構成を簡略化し、クライアントに別のファイルシステムルートを強制できます。
_
internal-sftp
_のコマンドを指定すると、ChrootDirectory
と併用した場合にサポートファイルを必要としないインプロセスSFTPサーバーが強制的に使用されます。
ChrootDirectory
には、ユーザーのセッションをサポートするために必要なファイルとディレクトリが含まれている必要があります。インタラクティブセッションの場合、これには少なくともシェル、通常はsh
、およびnull
、zero
、stdin
、stdout
、stderr
、tty
などの基本的な_/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
_の名前がハードコーディングされています。
OpenSSHと一緒に使用できる代替のSFTP実装があります。
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に簡単にロックする方法はありません。これは、システム管理者の介入なしにユーザーが実行できるようにするのに本当に便利です。