Consenti all'utente di configurare un tunnel SSH, ma nient'altro


97

Vorrei consentire a un utente di impostare un tunnel SSH per una particolare macchina su una particolare porta (diciamo 5000), ma voglio limitare questo utente il più possibile. (L'autenticazione avverrà con una coppia di chiavi pubblica / privata).

So di dover modificare il file ~ / .ssh / authorized_keys pertinente, ma non sono sicuro di quale contenuto inserire (oltre alla chiave pubblica).

Risposte:


91

Su Ubuntu 11.10, ho scoperto che potevo bloccare i comandi ssh, inviati con e senza -T, e bloccare la copia di scp, consentendo il passaggio del port forwarding.

In particolare, ho un server redis su "somehost" associato a localhost: 6379 che desidero condividere in modo sicuro tramite tunnel ssh con altri host che hanno un file di chiavi e ssh con:

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

Questo farà sì che il redis-server, la porta "localhost" 6379 su "somehost" appaia localmente sull'host che esegue il comando ssh, rimappato sulla porta "localhost" 16379.

Sul telecomando "somehost" Ecco cosa ho usato per authorized_keys:

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

Il no-pty fa scattare la maggior parte dei tentativi ssh che vogliono aprire un terminale.

Il permesso di apertura spiega quali porte possono essere inoltrate, in questo caso la porta 6379 è la porta del server redis che volevo inoltrare.

Il comando = "/ bin / echo do-non-inviare-comandi" fa eco a "do-non-inviare-comandi" se qualcuno o qualcosa riesce a inviare comandi all'host tramite ssh -T o altro.

Da un Ubuntu recente man sshd, authorized_keys / command è descritto come segue:

comando = "comando" Specifica che il comando viene eseguito ogni volta che questa chiave viene utilizzata per l'autenticazione. Il comando fornito dall'utente (se presente) viene ignorato.

Anche i tentativi di usare la copia sicura dei file scp falliranno con l'eco di "do-not-send-commands" Ho scoperto che sftp fallisce anche con questa configurazione.

Penso che anche il suggerimento di shell limitato, fornito in alcune risposte precedenti, sia una buona idea. Inoltre, sarei d'accordo sul fatto che tutto ciò che è dettagliato qui potrebbe essere determinato dalla lettura di "man sshd" e dalla ricerca di "authorized_keys"


1
Sebbene no-ptynon consenta di aprire la visualizzazione interattiva, non fa nulla per impedire l'esecuzione del comando, quindi l'utente può modificare il authorized_keysfile se ha accesso con qualcosa di simile ssh server 'sed -i -e s/no-pty// ~/.ssh/authorized_keys'.
sinapsi

4
@synapse command = "/ bin / echo do-not-send-commands", anche elencato sopra, ha lo scopo di bloccare i comandi. e fornire un messaggio. Volevi il tuo esempio per sconfiggere tutte le impostazioni sopra o stai solo commentando no-pty?
Paul

Vale la pena ricordare che gli amministratori non sono obbligati a concedere agli utenti la proprietà di un file authorized_keys o di una directory contenente, né che esiste nemmeno nella directory home di un utente (supponendo che il server ssh sia configurato correttamente per la sua posizione)
Daniel Farrell,

?? @DanFarrell .ssh / authorized_keys sarebbe di proprietà di root, o wheel, o di chi?
Andrew Wolfe

@AndrewWolfe in genere, ~user/.ssh/authorized_keyssarebbe di proprietà di usere usergestirà le chiavi autorizzate utilizzate per accedere all'account. SSH è pignolo riguardo alle autorizzazioni e può imporre aspettative ~/.ssh/e ai suoi contenuti. Ho fatto un sudo chown root: .ssh/authorized_keyse sembra che mi abbia impedito di accedere, ma so per esperienza passata che l'utente non deve possedere quel file - rootpuò gestirlo se preferisci.
Daniel Farrell

18

Probabilmente si vorrà impostare la shell dell'utente per la shell ristretta . Annulla l'impostazione della variabile PATH nel ~ / .bashrc o ~ / .bash_profile dell'utente e non sarà in grado di eseguire alcun comando. In seguito, se decidi di consentire agli utenti di eseguire un insieme limitato di comandi, come lesso tailper esempio, puoi copiare i comandi consentiti in una directory separata (come /home/restricted-commands) e aggiornare il PERCORSO in modo che punti a quella directory.


1
Ma ciò non impedisce all'utente di specificare un comando diverso sulla riga di comando ssh, come ssh use@host "/bin/bash", vero?
Fritz

Sì, supponendo che user@hostabbia rbash come shell. Vedi The Restricted Shell
Jason Day

Va bene, l'ho provato e hai ragione. Poiché il comando specificato viene eseguito dalla shell di login, l'esecuzione /bin/bashfallisce perché contiene barre.
Fritz

3
Anche se va detto che consentire lessè probabilmente una cattiva idea, perché da lì puoi fuggire a una shell senza restrizioni con !/bin/bash. Vedi pen-testing.sans.org/blog/2012/06/06/… per altri esempi. Quindi consentire i singoli comandi dovrebbe essere fatto con molta, molta attenzione, se non del tutto.
Fritz

17

Oltre all'opzione authorized_keys come no-X11-forwarding, in realtà ce n'è esattamente quella che stai chiedendo: allowopen = "host: port". Utilizzando questa opzione, l'utente può solo impostare un tunnel per l'host e la porta specificati.

Per i dettagli sul formato del file AUTHORIZED_KEYS fare riferimento a man sshd.


13
Dovrai anche specificare "no-pty" come parte del set di opzioni. Se usi solo "allowopen", restringerai i tunnel al dato host / porta ... ma consentirai comunque le shell interattive.
John Hart

Limitare il port forwarding con allowopen blocca anche il tipo di inoltro del dispositivo tunnel richiesto da ssh -w?
flabdablet

5
@JohnHart: no-ptynon limita nemmeno l'accesso alla shell, arriverai comunque alla shell, semplicemente non ti mostrerà il prompt; Puoi ancora dare comandi e vedere l'output senza problemi. È necessaria l' command="..."opzione se si desidera limitare l'accesso alla shell da .ssh/authorized_keys.
Aleksi Torhamo

9

La mia soluzione è fornire all'utente che può eseguire il tunneling, senza una shell interattiva , di impostare quella shell in / etc / passwd su / usr / bin / tunnel_shell .

Basta creare il file eseguibile / usr / bin / tunnel_shell con un ciclo infinito .

#!/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

Completamente spiegato qui: http://blog.flowl.info/2011/ssh-tunnel-group-only-and-no-shell-please/


9
CTRL + Z uscirà dallo script dandoti pieno accesso a bash ... Prova ad aggiungere "trap '' 20" (senza virgolette) all'inizio dello script
Big Papoo

1
grazie per il suggerimento, ho aggiunto la cattura di alcuni segnali di interruzione
Daniel W.

1
Uso solo / bin / cat per una "shell". Sembra funzionare bene. Non è a conoscenza di alcun exploit contro cat, e anche se trovassi qualche pattern di input che riesce a bloccarlo, la tua sessione ssh terminerebbe.
flabdablet

4
@ BigPapoo: l'hai effettivamente testato? Non riesco a vedere dove sarebbe fuggito. Se sei in una shell e corri tunnel_shell, lo farai shell -> /bin/bash tunnel_shellquindi puoi ovviamente tornare alla shell, ma se hai impostato tunnel_shell come shell dell'utente, dovrai solo /bin/bash tunnel_shellcorrere, senza shell a cui fuggire , per quanto posso vedere. L'ho provato e non sono riuscito a scappare con ctrl-z. Se fatto provare e potrebbe sfuggire, potrebbe inviare il setup? Allo stesso modo, se sei a conoscenza di documentazione che dice che dovrebbe funzionare così, potresti pubblicarla?
Aleksi Torhamo

3

Sono in grado di impostare il file authorized_keys con la chiave pubblica per accedere. Quello di cui non sono sicuro sono le informazioni aggiuntive di cui ho bisogno per limitare ciò che quell'account è autorizzato a fare. Ad esempio, so di poter inserire comandi come:

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

Vorresti una riga nel tuo file authorized_keys simile a questa.

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


3

Ecco un bel post che ho trovato utile: http://www.ab-weblog.com/en/creating-a-restricted-ssh-user-for-ssh-tunneling-only/

L'idea è: (con il nuovo nome utente limitato come "sshtunnel")

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

Notare che usiamo rbash (limited-bash) per limitare ciò che l'utente può fare: l'utente non può cd (cambiare directory) e non può impostare alcuna variabile d'ambiente.

Quindi modifichiamo la variabile env PATH dell'utente in /home/sshtunnel/.profilenulla - un trucco che farà in modo che bash non trovi alcun comando da eseguire:

PATH=""

Infine impediamo all'utente di modificare qualsiasi file impostando le seguenti autorizzazioni:

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

0

Ho creato un programma in C che assomiglia a questo:

#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);
}

Ho impostato la shell dell'utente con restrizioni su questo programma.

Non penso che l'utente con restrizioni possa eseguire nulla, anche se lo fa ssh server command, perché i comandi vengono eseguiti utilizzando la shell e questa shell non esegue nulla.



-3

Genererai una chiave sulla macchina degli utenti tramite qualsiasi client ssh che stanno utilizzando. PUTTY per esempio ha un'utilità per fare esattamente questa cosa. Genererà sia una chiave privata che una pubblica.

Il contenuto del file di chiave pubblica generato verrà inserito nel file authorized_keys.

Successivamente è necessario assicurarsi che il client ssh sia configurato per utilizzare la chiave privata che ha generato la chiave pubblica. È abbastanza semplice, ma leggermente diverso a seconda del client utilizzato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.