Erlauben Sie dem Benutzer, einen SSH-Tunnel einzurichten, aber sonst nichts

97

Ich möchte einem Benutzer erlauben, einen SSH-Tunnel zu einem bestimmten Computer an einem bestimmten Port (z. B. 5000) einzurichten, aber ich möchte diesen Benutzer so weit wie möglich einschränken. (Die Authentifizierung erfolgt mit einem öffentlichen / privaten Schlüsselpaar).

Ich weiß, dass ich die relevante Datei ~ / .ssh / authorized_keys bearbeiten muss, bin mir aber nicht sicher, welchen Inhalt ich dort einfügen soll (außer dem öffentlichen Schlüssel).

Lorin Hochstein
quelle

Antworten:

91

Unter Ubuntu 11.10 konnte ich SSH-Befehle blockieren, die mit und ohne -T gesendet wurden, und das Kopieren von SCP blockieren, während die Portweiterleitung durchlaufen wurde.

Insbesondere habe ich einen Redis-Server auf "somehost", der an localhost: 6379 gebunden ist und den ich sicher über ssh-Tunnel an andere Hosts weitergeben möchte, die eine Schlüsseldatei haben und mit ssh zusammenarbeiten:

$ ssh -i keyfile.rsa -T -N -L 16379:localhost:6379 someuser@somehost

Dies führt dazu, dass der Redis-Server "localhost" -Port 6379 auf "somehost" lokal auf dem Host angezeigt wird, der den Befehl ssh ausführt, der dem "localhost" -Port 16379 neu zugeordnet ist.

Auf der Fernbedienung "somehost" Folgendes habe ich für autorisierte Schlüssel verwendet:

cat .ssh/authorized_keys   (portions redacted)

no-pty,no-X11-forwarding,permitopen="localhost:6379",command="/bin/echo do-not-send-commands" ssh-rsa rsa-public-key-code-goes-here keyuser@keyhost

Das No-Pty löst die meisten SSH-Versuche aus, die ein Terminal öffnen möchten.

Das allowopen erklärt, welche Ports weitergeleitet werden dürfen, in diesem Fall Port 6379 der Redis-Server-Port, den ich weiterleiten wollte.

Der Befehl = "/ bin / echo Befehle nicht senden" gibt "Befehle nicht senden" zurück, wenn es jemandem oder etwas gelingt, Befehle über ssh -T oder auf andere Weise an den Host zu senden.

In einem aktuellen Ubuntu-Modus man sshdwird authorized_keys / command wie folgt beschrieben:

command = "command" Gibt an, dass der Befehl immer dann ausgeführt wird, wenn dieser Schlüssel zur Authentifizierung verwendet wird. Der vom Benutzer angegebene Befehl (falls vorhanden) wird ignoriert.

Versuche, das Kopieren sicherer scp-Dateien zu verwenden, schlagen ebenfalls mit einem Echo von "Nicht senden-Befehlen" fehl. Ich habe festgestellt, dass SFTP auch bei dieser Konfiguration fehlschlägt.

Ich denke, der eingeschränkte Shell-Vorschlag, der in einigen früheren Antworten gemacht wurde, ist auch eine gute Idee. Ich würde auch zustimmen, dass alles, was hier detailliert beschrieben wird, durch Lesen von "man sshd" und Suchen darin nach "autorisierten_ Schlüsseln" bestimmt werden kann.

Paul
quelle
1
Das no-ptyÖffnen der interaktiven Ansicht ist zwar nicht möglich, verhindert jedoch nicht die Ausführung des Befehls, sodass der Benutzer die authorized_keysDatei bearbeiten kann, wenn er Zugriff auf etwas wie hat ssh server 'sed -i -e s/no-pty// ~/.ssh/authorized_keys'.
Synapse
4
@synapse command = "/ bin / echo do-not-send-command", ebenfalls oben aufgeführt, soll Befehle blockieren. und geben Sie eine Nachricht. Wollten Sie mit Ihrem Beispiel die gesamten obigen Einstellungen umgehen oder kommentieren Sie nur no-pty?
Paul
Es ist zu erwähnen, dass Administratoren nicht verpflichtet sind, Benutzern das Eigentum an einer Datei "authorized_keys" oder einem Verzeichnis zu erteilen, noch dass sie sogar im Home-Verzeichnis eines Benutzers vorhanden ist (vorausgesetzt, der SSH-Server ist für seinen Speicherort ordnungsgemäß konfiguriert)
Daniel Farrell,
?? @DanFarrell Würden die .ssh / autorisierten_Tasten Root oder Wheel gehören oder wem?
Andrew Wolfe
@AndrewWolfe gehört normalerweise den autorisierten Schlüsseln, die für den Zugriff auf das Konto verwendet ~user/.ssh/authorized_keyswerden user, und userverwaltet diese. SSH ist wählerisch in Bezug auf Berechtigungen und kann Erwartungen ~/.ssh/und deren Inhalt auferlegen . Ich habe eine gemacht sudo chown root: .ssh/authorized_keysund es scheint mich daran gehindert zu haben, mich anzumelden, aber ich weiß aus früheren Erfahrungen, dass der Benutzer diese Datei nicht besitzen muss - rootkann sie verwalten, wenn Sie es vorziehen.
Daniel Farrell
18

Möglicherweise möchten Sie die Shell des Benutzers auf die eingeschränkte Shell setzen . Deaktivieren Sie die PATH-Variable im ~ / .bashrc oder ~ / .bash_profile des Benutzers, und er kann keine Befehle ausführen. Wenn Sie später entscheiden, dass Sie den Benutzern erlauben möchten, einen begrenzten Satz von Befehlen auszuführen, wie lessoder tailzum Beispiel, können Sie die zulässigen Befehle in ein separates Verzeichnis (z. B. /home/restricted-commands) kopieren und den Pfad aktualisieren, auf den sie zeigen dieses Verzeichnis.

Jason Day
quelle
1
Dies hindert den Benutzer jedoch nicht daran, einen anderen Befehl in der ssh-Befehlszeile anzugeben ssh use@host "/bin/bash".
Fritz
Ja, vorausgesetzt, das user@hosthat rbash als Shell. Siehe The Restricted Shell
Jason Day
Okay, ich habe es versucht und du hast recht. Da der angegebene Befehl von der Anmeldeshell ausgeführt wird, /bin/bashschlägt die Ausführung fehl, da er Schrägstriche enthält.
Fritz
3
Obwohl gesagt werden sollte, dass das Zulassen lesswahrscheinlich eine schlechte Idee ist, weil man von dort aus zu einer uneingeschränkten Shell mit entkommen kann !/bin/bash. Weitere Beispiele finden Sie unter pen-testing.sans.org/blog/2012/06/06/… . Das Zulassen einzelner Befehle sollte daher, wenn überhaupt, sehr, sehr sorgfältig erfolgen.
Fritz
17

Neben der Option "authorized_keys" wie "no-X11-forwarding" gibt es genau eine, nach der Sie fragen: allowopen = "host: port". Mit dieser Option kann der Benutzer nur einen Tunnel zum angegebenen Host und Port einrichten.

Einzelheiten zum Dateiformat AUTHORIZED_KEYS finden Sie unter man sshd.

Marbu
quelle
13
Sie müssen außerdem "no-pty" als Teil des Optionssatzes angeben. Wenn Sie nur "allowopen" verwenden, beschränken Sie die Tunnel auf den angegebenen Host / Port ... Sie lassen jedoch weiterhin interaktive Shells zu.
John Hart
Sperrt das Einschränken der Portweiterleitung mit allowopen auch die Art der Tunnelgeräteweiterleitung, die ssh -w verlangt?
Flabdablet
5
@JohnHart: Der no-ptyShell-Zugriff wird auch nicht eingeschränkt. Sie gelangen trotzdem zur Shell. Die Eingabeaufforderung wird nur nicht angezeigt. Sie können weiterhin Befehle erteilen und die Ausgabe gut sehen. Sie benötigen die command="..."Option, wenn Sie den Shell-Zugriff von einschränken möchten .ssh/authorized_keys.
Aleksi Torhamo
9

Meine Lösung besteht darin, dem Benutzer, der möglicherweise nur ohne interaktive Shell tunnelt, die Möglichkeit zu geben, diese Shell in / etc / passwd auf / usr / bin / tunnel_shell zu setzen .

Erstellen Sie einfach die ausführbare Datei / usr / bin / tunnel_shell mit einer Endlosschleife .

#!/bin/bash
trap '' 2 20 24
clear
echo -e "\r\n\033[32mSSH tunnel started, shell disabled by the system administrator\r\n"
while [ true ] ; do
sleep 1000
done
exit 0

Vollständig erklärt hier: http://blog.flowl.info/2011/ssh-tunnel-group-only-and-no-shell-please/

Daniel W.
quelle
9
STRG + Z wird aus dem Skript entfernt, sodass Sie vollen Zugriff auf Bash haben ... Versuchen Sie, "Trap '' 20" (ohne Anführungszeichen) ganz am Anfang des Skripts
hinzuzufügen
1
Vielen Dank für den Hinweis, ich habe das Einfangen einiger Interrupt-Signale hinzugefügt
Daniel W.
1
Ich benutze nur / bin / cat für eine "Shell". Scheint gut zu funktionieren. Sie sind sich keiner Exploits gegen cat bewusst, und selbst wenn Sie ein Eingabemuster gefunden hätten, das es zum Absturz bringt, würde Ihre SSH-Sitzung einfach beendet.
Flabdablet
4
@ BigPapoo: Hast du es tatsächlich getestet? Ich kann nicht sehen, wohin es entkommen würde. Wenn Sie in einer Schale, und Sie laufen tunnel_shell, haben Sie shell -> /bin/bash tunnel_shellso können Sie natürlich an die Shell entkommen zurück, aber wenn Sie festgelegt haben , tunnel_shell wie die Shell des Benutzers, werden Sie nur haben /bin/bash tunnel_shelllaufen, ohne Schale , um zu entkommen , soweit ich das beurteilen kann. Ich habe es getestet und konnte mit Strg-Z nicht entkommen. Wenn Sie es versucht haben und entkommen könnten, könnten Sie das Setup veröffentlichen? Wenn Sie eine Dokumentation kennen, die besagt, dass es so funktionieren sollte, können Sie das auch posten?
Aleksi Torhamo
3

Ich kann die Datei "authorized_keys" mit dem öffentlichen Schlüssel zum Anmelden einrichten. Ich bin mir nicht sicher, welche zusätzlichen Informationen ich benötige, um die Berechtigung dieses Kontos einzuschränken. Ich weiß zum Beispiel, dass ich Befehle wie die folgenden eingeben kann:

no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding

Sie möchten eine Zeile in Ihrer Datei "authorized_keys", die so aussieht.

permitopen="host.domain.tld:443",no-pty,no-agent-forwarding,no-X11-forwardi
ng,command="/bin/noshell.sh" ssh-rsa AAAAB3NzaC.......wCUw== zoredache 
Zoredache
quelle
3

Wenn Sie den Zugriff nur für einen bestimmten Befehl zulassen möchten - wie z. B. svn - können Sie diesen Befehl auch in der Datei mit den autorisierten Schlüsseln angeben:

command="svnserve -t",no-port-forwarding,no-pty,no-agent-forwarding,no-X11-forwarding [KEY TYPE] [KEY] [KEY COMMENT]

Von http://svn.apache.org/repos/asf/subversion/trunk/notes/ssh-tricks

joseph_morris
quelle
3

Hier haben Sie einen schönen Beitrag, den ich nützlich fand: http://www.ab-weblog.com/de/creating-a-restricted-ssh-user-for-ssh-tunneling-only/

Die Idee ist: (mit dem neuen eingeschränkten Benutzernamen als "sshtunnel")

useradd sshtunnel -m -d /home/sshtunnel -s /bin/rbash
passwd sshtunnel

Beachten Sie, dass wir rbash (eingeschränkte Bash) verwenden, um die Möglichkeiten des Benutzers einzuschränken: Der Benutzer kann keine CD (Verzeichnis ändern) und keine Umgebungsvariablen festlegen.

Dann bearbeiten wir die PATH env-Variable des Benutzers in /home/sshtunnel/.profilenichts - ein Trick, mit dem bash keine auszuführenden Befehle findet:

PATH=""

Schließlich verbieten wir dem Benutzer, Dateien zu bearbeiten, indem wir die folgenden Berechtigungen festlegen:

chmod 555 /home/sshtunnel/
cd /home/sshtunnel/
chmod 444 .bash_logout .bashrc .profile
juanmf
quelle
0

Ich habe ein C-Programm gemacht, das so aussieht:

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
void sig_handler(int signo)
{
    if (signo == SIGHUP)
        exit(0);
}

int main()
{
    signal(SIGINT, &sig_handler);
    signal(SIGTSTP, &sig_handler);

    printf("OK\n");
    while(1)
        sleep(1);
    exit(0);
}

Ich habe die Shell des eingeschränkten Benutzers auf dieses Programm eingestellt.

Ich glaube nicht, dass der eingeschränkte Benutzer irgendetwas ausführen kann, selbst wenn ssh server commanddies der Fall ist, da die Befehle mit der Shell ausgeführt werden und diese Shell nichts ausführt.

Fangfufu
quelle
-3

Sie generieren einen Schlüssel auf dem Computer des Benutzers über den von ihm verwendeten SSH-Client. pUTTY hat zum Beispiel ein Dienstprogramm, um genau das zu tun. Es wird sowohl ein privater als auch ein öffentlicher Schlüssel generiert.

Der Inhalt der generierten öffentlichen Schlüsseldatei wird in der Datei authorized_keys abgelegt.

Als Nächstes müssen Sie sicherstellen, dass der SSH-Client für die Verwendung des privaten Schlüssels konfiguriert ist, der den öffentlichen Schlüssel generiert hat. Es ist ziemlich einfach, aber je nach verwendetem Client etwas anders.

Palehorse
quelle