Ich habe nach einer brauchbaren Antwort auf diese Frage gesucht, und die meisten Antworten enthalten Ratschläge, warum ich es nicht tun soll. Hier ist jedoch das Szenario und was es erforderlich macht:
Ich habe eine Konsolen-App, und in jedem Benutzerprofil gibt es einen Startbefehl für die App, und direkt nach dem Befehl, der sie startet, gibt es einen "exit" -Befehl, mit dem sie vom System abgemeldet werden. Ich möchte nur, dass sie über die von ihr bereitgestellte Oberfläche auf diese Konsolen-App zugreifen können. Beim Start zeigt die App dem Benutzer eine Liste von Clients an, auf die über die App zugegriffen werden kann, wobei jeder Client über ein eigenes Datenverzeichnis verfügt. Benutzern wird nur der Zugriff auf die Clients gewährt, auf die sie Zugriff benötigen.
Hier ist das Problem: Wenn ich den Benutzern SSH-Zugriff gewähre, können sie sich auch mit einem SFTP-Client anmelden, wodurch sie direkten Zugriff auf die Datenverzeichnisse für die App erhalten, was SEHR unerwünscht ist, da dies ebenfalls zur Folge hat Sie greifen auf die Datenverzeichnisse zu, auf die sie keinen Zugriff haben sollten.
Dies war so einfach, wenn eine Telnet / FTP-Kombination verwendet wurde, aber da ich den Benutzern nun Zugriff von überall im Internet gewähren möchte, war es mir nicht möglich, sie von SFTP auszuschließen Sie können weiterhin auf die Shell zugreifen, in der sie die App ausführen können.
.profile
für das klingt nach der falschen Lösung. Ich glaube, dass es viel sinnvoller wäre, den Benutzer mit einer alternativen Shell einzurichten..profile
Trick zu verwenden, um den Zugriff einzuschränken, da das Umgehen trivial ist. (Siehe meine Antwort für Details)Antworten:
Bearbeiten:
Falls dies nicht offensichtlich ist, ist die folgende Antwort nicht als sichere Methode gedacht, um zu verhindern, dass SFTP von Personen mit Shell-Zugriff auf den Server verwendet wird. Es ist nur eine Antwort, die erklärt, wie Sie die externe Sichtbarkeit deaktivieren können. Weitere Informationen zur Sicherheit auf Benutzerebene finden Sie in den Antworten von @cpast und @Aleksi Torhamo. Wenn Sicherheit im Mittelpunkt steht, ist diese Antwort nicht die richtige. Wenn einfache Service-Sichtbarkeit Ihr Fokus ist, dann ist dies Ihre Antwort.
Wir fahren nun mit der ursprünglichen Antwort fort:
Kommentieren Sie die SFTP-Unterstützung in sshd_config aus (und starten Sie sie natürlich neu
sshd
):#Subsystem sftp /usr/lib/openssh/sftp-server
quelle
Subsystem sftp internal-sftp
Subsystem sftp /usr/libexec/sftp-server
Aber das hat den Trick getan. Vielen Dankssh user@host command
, da er.profile
in diesem Fall überhaupt nicht ausgeführt wird und Ihre App daher überhaupt nicht startet. Sie können vollen Shellzugriff erhalten, indem sie einfach sagenssh -t user@host bash
. Probieren Sie es einfach aus und Sie werden sehen. Das Subsystem ist nur ein Befehlsalias. Wenn sie zuvor sftp verwenden konnten, können sie es weiterhin verwenden - und jeden anderen gewünschten Befehl. Lies meine Antwort unten..profile
da es nicht für die Sicherheit gedacht ist und leicht umgangen werden kann. In meiner Antwort habe ich drei verschiedene Methoden aufgelistet, um dies mit ssh zu tun. Kurz gesagt, verschieben Sie einfach den Aufruf Ihrer App von.profile
in ein Shell-Skript und entweder 1) legen Sie das Shell-Skript als Shell des Benutzers fest 2) legen Sie das Shell-Skript als (richtig zugeordnet) festForceCommand
insshd_config
3) wechseln Sie zur Authentifizierung mit öffentlichem Schlüssel und legen Sie das fest Shell-Skript wiecommand
in.ssh/authorized_keys
. (Außerdem sollten Sie @name verwenden, damit die Leute über die Kommentare informiert werden.)Wie bereits erwähnt, reicht die Deaktivierung
sftp
bei weitem nicht aus. Ein Benutzer mit uneingeschränktemssh
Zugriff kann alle Dateien anzeigen, für die sein Konto Berechtigungen besitzt, und alle Änderungen vornehmen, die er ändern darf. Außerdem kann er problemlos alles herunterladen, was er lesen kann Maschine. Die einzige Möglichkeit, dies zu verhindern, besteht darin, den Zugriff tatsächlich einzuschränken. Es ist auch nicht ideal, sich darauf zu verlassen.profile
, um Benutzer einzuschränken, da dies nicht der Grund ist (Bearbeiten: Wie Aleksi in seiner Antwort erwähnt, ist es in der Tat trivial, zu umgehen.profile
; das Problem.profile
ist, dass es der Bequemlichkeit und nicht der Sicherheit dient, also nicht Verwenden Sie Dinge, die der Sicherheit dienen, wie die folgenden, um die Sicherheit zu gewährleisten.Hierfür gibt es zwei grundlegende Möglichkeiten: Sie können sie über Dateiberechtigungen einschränken oder sie zwingen, nur Ihre Konsolen-App auszuführen. Der zweite Weg ist besser: Ordnen Sie Benutzer, die auf die Konsolen-App beschränkt sein sollen, einer Gruppe zu (z. B.
customers
).sshd_config
Fügen Sie dann in die folgenden Zeilen ein:Dies bewirkt, dass alle Verbindungen von Benutzern in dieser Gruppe die Konsolen-App öffnen. Sie können nichts anderes starten, einschließlich des
sftp
Server-Tools. Dies hindert sie auch daran, mit dem System etwas anderes zu tun , und verwendet im Gegensatz.profile
dazu den SSH-Server selbst (.profile
schränkt sie an der Shell ein undForceCommand
verhindert auch, dass andere Dinge ausgeführt werden, bei denen keine Shell gestartet wird). Auch im Gegensatz zu.profile
dieser ist konzipiert als Sicherheits Sache; Es wurde speziell entwickelt, um einem böswilligen Benutzer das Ausweichen zu verwehren.Die (wahrscheinlich minderwertige) Alternative wäre das Erstellen eines neuen Benutzers zum Ausführen der Konsolen-App. Sie würden dann die Datenverzeichnisse auf diesen Benutzer beschränken, die Konsolen-App festlegen, die diesem Benutzer gehört, und
u+s
im Programm festlegen . Das ist dassetuid
bisschen; Dies bedeutet, dass jemand, der das Konsolenprogramm ausführt, dies mit den Berechtigungen des Programmbesitzers tut. Auf diese Weise hat der Benutzer selbst keinen Zugriff auf die Verzeichnisse, sondern nur über das Programm. Sie sollten jedoch wahrscheinlich nur verwendenForceCommand
, da dies den gesamten Zugriff auf "Nur dieses Programm ausführen" einschränkt .quelle
ForceCommand
dass SSH-Port-Weiterleitung nicht verhindert..profile
ist eigentlich mehr als "nicht ideal"; Es kann leicht umgangen werden (siehe meine Antwort für Details) und bietet daher keinerlei Schutz, sondern nur ein falsches Sicherheitsgefühl.Versuchen Sie nicht, dies zu tun,
.profile
da dies keinerlei Sicherheit bietet und genau nichts einschränkt!Es spielt keine Rolle , was Sie setzen in
.profile
, da Sie Bypass kann es einfach durch einen Befehl geben auf der SSH - Befehlszeile auszuführen, wie folgt aus :ssh user@host command
. Sie können weiterhin normalen Shell-Zugriff erhalten, indem Sie tunssh -t user@host bash
.Das Deaktivieren des SFTP-Subsystems, wie in einer anderen Antwort erwähnt, hilft überhaupt nicht. Subsysteme sind im Wesentlichen nur Aliase zu Befehlen, und Sie können sftp weiterhin normal verwenden, indem Sie dies tun
sftp -s /path/to/sftp-executable user@host
.Wie in cpast und einigen Kommentaren bereits erwähnt, sollten Sie die richtigen Mechanismen zur Einschränkung des Zugriffs verwenden. Das ist,
ForceCommand
insshd_config
command="..."
in.ssh/authorized_keys
Anmerkungen:
command="..."
Gilt nur für einen Schlüssel. Dadurch wird die SSH-Anmeldung für den Benutzer, der ein Kennwort oder einen anderen Schlüssel verwendet, nicht eingeschränktAllowTcpForwarding
usw. insshd_config
no-port-forwarding
usw. in.ssh/authorized_keys
script -c 'command-the-user-wanted-to-run'
ForceCommand
undcommand="..."
führen den Befehl über die Shell des Benutzers aus, sodass sie nicht funktionieren, wenn die Shell des Benutzers auf z./bin/false
oder/sbin/nologin
Haftungsausschluss: Ich bin auf keinen Fall ein Experte in dieser Angelegenheit. Obwohl ich sagen kann, dass die
.profile
Sache nicht sicher ist, kann ich nicht versprechen, dass es bei den anderen Methoden, die ich nicht kenne, kein "gotcha" gibt Über. Soweit ich weiß, sind sie sicher, aber ich wäre nicht die erste Person, die sich im Internet irrt.quelle
ForceCommand
und erzwungene kennwortlose Anmeldung mitcommand=
inauthorized_keys
, obwohl dies zuvor umgangen wurde, ein Fehler auf dem Server vorliegt: Es soll vor einem böswilligen Benutzer sicher sein, und ein Benutzer, der es umgeht, gilt als ernsthafte Sicherheitsanfälligkeit im SSH-Server (und ist damit ein Prioritätsfix). Wie Sie bereits.profile
betont haben, ist dies vom Design her umgangen: Da es sich nicht um ein Sicherheitsmerkmal handelt, ist es aus Sicht des Shell-Entwicklers vollkommen in Ordnung, wenn ein Benutzer es umgeht.ForceCommand
, den Zugriff einzuschränken, und einen Daemon hatte, der nur lokale Verbindungen überwacht und keine Authentifizierung durchführt, könnte der ssh-Benutzer trotzdem auf den Daemon zugreifen. Die von mir aufgelisteten Funktionen sind diejenigen, z. Git-Hosting-Lösungen werden normalerweise deaktiviert, und ich habe keine zusätzlichen "böse aussehenden" in den Hilfeseiten gesehen, aber ich habe noch kein offizielles "So verwenden SieForceCommand
sicher" -Dokument gefunden.~/.profile
ist der Benutzer bearbeitbar und für die Sicherheit nicht hilfreich, aber könnten Sie die Technik von cpast sinnvoll machen, indem Sie sie in das Programm einfügen/etc/profile
? Sie können die UID überprüfen, um sie auf die richtigen Benutzer zu beschränken.ssh user@host
, aber wenn Sie ssh anweisen, einen Befehl auszuführen - dh.ssh user@host command
- Sie erhalten keine Login-Shell mehr und die Dateien werden überhaupt nicht berührt. Sie können also alle Einschränkungen, die jemand versucht hat, mit den Dateien zu umgehen, indem Sie einfach ein zusätzliches Argument an ssh übergeben..profile
, sie verwendetsshd_config
und sollte sicher sein. Er erwähnt nur.profile
als eine Methode, die Sie nicht verwenden sollten, um dies zu tun.Es ist möglich, SSH global und pro Benutzer / Gruppe zu aktivieren und SFTP zu deaktivieren.
Ich persönlich benötige dies, weil ich über SSH Zugriff auf einige Git-Repositorys gewähren möchte und ich nicht benötigte Systeme gerne deaktiviere. In diesem Fall wird SFTP nicht benötigt.
Global
Sie können SFTP auf verschiedene Arten für alle Benutzer deaktivieren.
Das fehlende Subsystem
Der von SSH verwendete SFTP-Dämon kann über das
Subsystem
Schlüsselwort konfiguriert werden . Aus demsshd_config(5)
Handbuch:Die letzte Zeile schlägt vor, dass es ausreichen sollte, kein Subsystem für "sftp" zu definieren.
Eine falsche Lüge
Sie können SFTP auch deaktivieren, indem Sie den von SSH verwendeten SFTP-Dämon auf einen nicht verwendbaren Wert einstellen. Konfigurieren Sie das Subsystem "sftp" beispielsweise so, dass
/bin/false
:Wenn etwas versucht, sich über SFTP anzumelden, versucht der SSH-Dämon, den "sftp-Dämon" zu erzeugen
/bin/false
. Das/bin/false
Programm macht nur eine Sache, nämlich einen Fehlercode zurückzugeben. Der SFTP-Verbindungsversuch wird effektiv abgelehnt.Pro Benutzer / Gruppe
Es ist auch möglich, SFTP pro Benutzer, Gruppe oder einige andere Kriterien zu deaktivieren.
Dies funktioniert nicht, wenn Ihr Benutzer eine reguläre Shell-Eingabeaufforderung erhalten soll. Es macht auch keinen Sinn, da Sie die meisten Dinge umgehen könnten, wenn Sie Shell-Zugriff haben. Dies funktioniert nur, wenn Sie nur Zugriff auf ein bestimmtes Programm gewähren möchten.
Passend
Um eine Gruppe von Benutzern abzugleichen, können Sie SSH mit dem
Match
Schlüsselwort konfigurieren . Aus demsshd_config(5)
Handbuch:Einige Beispiele:
Match User eva
Entspricht dem Benutzer "eva"Match User stephen,maria
Entspricht den Benutzern "stephen" und "maria"Match Group wheel,adams,simpsons
Entspricht den Gruppen "Wheel", "Adams", "Simpsons"Wenn Sie weitere Informationen wünschen, enthält das
sshd_config(5)
Handbuch zahlreiche Informationen .Befehl erzwungen
Normalerweise erhalten Sie die Anmeldeshell des Benutzers, wenn Sie eine Verbindung über SSH herstellen. SSH kann jedoch so konfiguriert werden, dass ein bestimmter Befehl erzwungen wird. Der Befehl wird für jede SSH-Verbindung, einschließlich SFTP, erzwungen, sodass Sie möglicherweise die Option haben, den gewünschten Befehl zu erzwingen.
Der zu erzwingende Befehl kann mit dem
ForceCommand
Schlüsselwort konfiguriert werden . Aus demsshd_config(5)
Handbuch:So können Sie den eingeschränkten Befehl erzwingen, den Sie verwenden möchten
ForceCommand <your command>
. Beispielsweise:Beispiel
In meinem Fall, in dem ich Git-Zugriff gewähren möchte, muss der Benutzer nur Zugriff auf haben
git-shell
. In diesem Abschnitt wird SFTP für meine Git-Benutzer zusammen mit einigen Sicherheitsoptionen deaktiviert:quelle