OpenSSH: Unterschied zwischen internem SFTP und SFTP-Server

81

Warum gibt es zwei Möglichkeiten, SFTP mit OpenSSH einzurichten und wann welche? Gibt es einen Unterschied zwischen ihnen?

Ich meine, der erste benutzt eine lib von OpenSSH und der zweite sagt "benutze die interne", also ist es auch OpenSSH?

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

Antworten:

94

Beide sftp-serverund internal-sftpsind Teil von OpenSSH. sftp-serverist eine eigenständige Binärdatei. Dies internal-sftpist nur ein Konfigurationsschlüsselwort, das angibt, dass sshdSFTP-Servercode verwendet werden soll sshd, anstatt einen anderen Prozess (normalerweise den sftp-server) auszuführen .


Aus funktionaler Sicht sftp-serverund internal-sftpsind fast identisch. Sie werden aus demselben Quellcode erstellt.

Der Hauptvorteil von internal-sftpist, dass es keine Unterstützungsdateien benötigt, wenn es mit ChrootDirectoryDirektiven verwendet wird .

Zitate aus der sshd_config(5)Manpage :

  • Für Subsystemrichtlinie :

    Der Befehl sftp-serverimplementiert das SFTP-Subsystem für die Dateiübertragung.

    Alternativ internal-sftpimplementiert der Name einen in Bearbeitung befindlichen SFTP-Server. Dies kann die Konfiguration vereinfachen, indem ChrootDirectoryClients einen anderen Dateisystemstamm zugewiesen werden.

  • Für ForceCommandrichtlinie :

    Wenn Sie den Befehl of angeben, internal-sftpwird die Verwendung eines SFTP-Servers erzwungen, für den keine Unterstützungsdateien erforderlich sind ChrootDirectory.

  • Für ChrootDirectoryrichtlinie :

    Das ChrootDirectorymuss die erforderlichen Dateien und Verzeichnisse enthalten, um die Sitzung des Benutzers zu unterstützen. Für eine interaktive Sitzung erfordert dies zumindest eine Schale, in der Regel sh, und /devBasisknoten wie null, zero, stdin, stdout, stderr, und ttyGeräte. Für Dateiübertragungssitzungen mit SFTP ist keine zusätzliche Konfiguration der Umgebung erforderlich, wenn der SFTP-Server im Prozess verwendet wird. Bei /dev/logeinigen Betriebssystemen kann es jedoch erforderlich sein, dass Sitzungen mit Protokollierung im chroot-Verzeichnis ausgeführt werden (siehe sftp-serverDetails).

Ein weiterer Vorteil von internal-sftpist die Leistung, da kein neuer Unterprozess dafür ausgeführt werden muss.


Die internal-sftpwurde viel später hinzugefügt (OpenSSH 4.9p1 in 2008?) Als die eigenständige sftp-serverBinärdatei, ist aber mittlerweile die Standardeinstellung.

Ich glaube, es gibt keinen Grund, die sftp-serverfür Neuinstallationen zu verwenden.


Es mag den Anschein haben, als sshdkönnte dies automatisch genutzt werden internal-sftp, wenn es darauf trifft sftp-server, da die Funktionalität identisch ist und internal-sftpsogar die oben genannten Vorteile hat. Es gibt jedoch Randfälle, in denen es Unterschiede gibt.

Einige Beispiele:

  • Der Administrator kann sich auf eine Login-Shell-Konfiguration verlassen, um zu verhindern, dass sich bestimmte Benutzer anmelden. Wenn Sie zu internal-sftpwechseln, wird die Einschränkung umgangen, da die Login-Shell nicht mehr beteiligt ist.

  • Mit Hilfe von sftp-serverBinary (als eigenständiger Prozess) können Sie einige Hacks verwenden, z. B. das Ausführen von SFTP untersudo .

  • Bei SSH-1 (falls es noch von jemandem verwendet wird) ist die SubsystemDirektive überhaupt nicht beteiligt. Ein SFTP-Client, der SSH-1 verwendet, teilt dem Server ausdrücklich mit, welche Binärdatei der Server ausführen soll. Die Namen älterer SSH-1-SFTP-Clients sind also sftp-serverfest codiert.

Martin Prikryl
quelle
6

Sie können einen authorized_key für den externen SFTP-Server sperren.

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

Wenn Sie dies tun, kann Ihr Benutzer sftp, aber nicht scp oder ssh:

$ sftp host: / etc / group / tmp
Verbindung zum Host wird hergestellt ...
Abrufen von / etc / group nach / tmp / group
/ etc / group 100% 870 0.9KB / s 00:00

Der Versuch, etwas anderes zu tun, hängt nur:

$ scp Host: / etc / group / tmp
Durch Signal 2 getötet.

Verfügbarkeit des $ ssh-Hosts
Durch Signal 2 getötet.

Leider gibt es keine einfache Möglichkeit, einen Schlüssel für eine Chroot zu sperren, es sei denn, die sshd_config wird geändert. Dies wäre wirklich cool, wenn ein Benutzer auf das Eingreifen des Systemmanagers verzichten könnte.

Charles Fisher
quelle
3
ForceCommand internal-sftpsollte das gleiche erreichen
ptman
Praktisch ist, dass Sie ohne chroot sshfs host:/home/user/.ssh ~/hackmeall diese Einstellungen wieder bearbeiten können, um den Zugang zu öffnen, wenn Sie später Ihre Meinung ändern.
sh1