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

StackOverflow https://stackoverflow.com/questions/8021

  •  08-06-2019
  •  | 
  •  

Frage

Ich möchte einem Benutzer erlauben, einen SSH-Tunnel zu einer bestimmten Maschine 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 entsprechende Datei ~/.ssh/authorized_keys bearbeiten muss, bin mir aber nicht sicher, welchen Inhalt ich genau dort einfügen soll (außer dem öffentlichen Schlüssel).

War es hilfreich?

Lösung

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

Konkret 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 über eine Schlüsseldatei verfügen und sich per SSH einloggen mit:

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

Dadurch wird der Redis-Server, „localhost“-Port 6379 auf „somehost“, lokal auf dem Host angezeigt, der den SSH-Befehl ausführt, und dem „localhost“-Port 16379 neu zugeordnet.

Auf dem entfernten „somehost“ habe ich Folgendes für „authorized_keys“ 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 blockiert die meisten SSH-Versuche, die ein Terminal öffnen wollen.

Das Permitopen 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 do-not-send-commands“ gibt „do-not-send-commands“ zurück, wenn es jemandem oder etwas gelingt, Befehle über ssh -T oder auf andere Weise an den Host zu senden.

Von einem aktuellen Ubuntu man sshd, Der Befehl „authorized_keys/“ wird wie folgt beschrieben:

Befehl = "Befehl" gibt an, dass der Befehl ausgeführt wird, wenn dieser Schlüssel zur Authentifizierung verwendet wird.Der vom Benutzer gelieferte Befehl (falls vorhanden) wird ignoriert.

Versuche, das sichere Kopieren von SCP-Dateien zu verwenden, schlagen ebenfalls mit einem Echo von „Do-not-send-commands“ fehl. Ich habe festgestellt, dass SFTP mit dieser Konfiguration ebenfalls fehlschlägt.

Ich denke, dass der in einigen früheren Antworten gemachte Vorschlag zur eingeschränkten Shell ebenfalls eine gute Idee ist.Außerdem stimme ich zu, dass alles, was hier detailliert beschrieben wird, durch das Lesen von „man sshd“ und die darin enthaltene Suche nach „authorized_keys“ ermittelt werden kann.

Andere Tipps

Sie möchten wahrscheinlich die Shell des Benutzers auf einstellen die eingeschränkte Hülle.Deaktivieren Sie die PATH-Variable im ~/.bashrc oder ~/.bash_profile des Benutzers, und dieser kann keine Befehle mehr ausführen.Wenn Sie später entscheiden, dass Sie den Benutzern erlauben möchten, eine begrenzte Anzahl von Befehlen auszuführen, z less oder tail Dann können Sie beispielsweise die erlaubten Befehle in ein separates Verzeichnis kopieren (z. B /home/restricted-commands) und aktualisieren Sie den PATH so, dass er auf dieses Verzeichnis verweist.

Neben der Option „authorized_keys“ wie „no-X11-forwarding“ gibt es tatsächlich genau eine, nach der Sie fragen:permitopen="host:port".Mit dieser Option darf der Benutzer nur einen Tunnel zum angegebenen Host und Port einrichten.

Einzelheiten zum Dateiformat AUTHORIZED_KEYS finden Sie unter man sshd.

Meine Lösung besteht darin, dem Benutzer, der nur tunneln darf, Folgendes bereitzustellen: ohne interaktive Shell, um diese Shell einzusetzen /etc/passwd Zu /usr/bin/tunnel_shell.

Erstellen Sie einfach die ausführbare Datei /usr/bin/tunnel_shell mit einem 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

Hier ausführlich erklärt: http://blog.flowl.info/2011/ssh-tunnel-group-only-and-no-shell-please/

Ich kann die Datei autorized_keys mit dem öffentlichen Schlüssel einrichten, um mich anzumelden.Ich bin mir nicht sicher, ob ich die zusätzlichen Informationen einschränken muss, um das zu beschränken, was dieses Konto tun darf.Zum Beispiel weiß ich, dass ich Befehle wie:

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

Sie möchten in Ihrer Datei „authorized_keys“ eine Zeile haben, 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 

Wenn Sie den Zugriff nur für einen bestimmten Befehl – ​​wie svn – zulassen möchten, 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]

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

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

Die Idee ist:(mit dem neuen eingeschränkten Benutzernamen „sshtunnel“)

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

Beachten Sie, dass wir rbash (restricted-bash) verwenden, um einzuschränken, was der Benutzer tun kann:Der Benutzer kann nicht cd (Verzeichnis wechseln) und keine Umgebungsvariablen festlegen.

Dann bearbeiten wir die PATH-Umgebungsvariable des Benutzers /home/sshtunnel/.profile zu nichts – ein Trick, der dazu führt, dass Bash keine auszuführenden Befehle findet:

PATH=""

Schließlich verbieten wir dem Benutzer das Bearbeiten von Dateien, indem wir die folgenden Berechtigungen festlegen:

chmod 555 /home/sshtunnel/
cd /home/sshtunnel/
chmod 444 .bash_logout .bashrc .profile

Ich habe ein C-Programm erstellt, 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 er es tut ssh server command, da die Befehle über die Shell ausgeführt werden und diese Shell nichts ausführt.

Sehen In diesem Beitrag geht es um die Authentifizierung öffentlicher Schlüssel.

Die beiden wichtigsten Dinge, die Sie beachten müssen, sind:

  1. Stell sicher, dass du chmod 700 ~/.ssh
  2. Hängen Sie den öffentlichen Schlüsselblock an „authorized-keys“ an

Sie generieren einen Schlüssel auf dem Computer des Benutzers über den von ihm verwendeten SSH-Client.putty zum Beispiel verfügt über ein Dienstprogramm, das genau diese Aufgabe erfüllt.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, unterscheidet sich jedoch je nach verwendetem Client geringfügig.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top