Quanto è sicuro SSH ForceCommand su un host di salto?


8

Ho la seguente configurazione nella mia rete:

Internet <--> Bastion <--> Local Network

Ho diversi utenti e ogni utente è assegnato a una macchina specifica. O in altre parole: ogni utente deve avere accesso solo a uno di quei server. Ad esempio: Utente1 -> Macchina1, Utente2 -> Macchina2 e così via.

Quegli utenti si collegheranno dall'esterno della mia rete e ho considerato molte opzioni su come inoltrare le loro connessioni tramite il mio host bastion alla mia rete.

Alla fine ho optato per Match Blocks e forcecommand.

Quindi, il mio / etc / ssh / sshd_config sul bastione è simile al seguente:

Match User User1
        ForceCommand ssh User1@Machine1 $SSH_ORIGINAL_COMMAND

Utente1 si collega all'host del bastione che stabilisce automaticamente una connessione con Machine1.

Per quanto ho capito ForceCommand, User1 non avrà alcun reale accesso all'host del bastione, perché tutte le sue operazioni saranno gestite per prime dal blocco delle partite, quindi dirottate su Machine1. Tuttavia è davvero vero? È già abbastanza per essere una configurazione sicura? L'utente è comunque imprigionato su Machine1, quindi non avrà molte possibilità lì.


2
Ricorda di ottenere IPv6, quindi non avrai più bisogno di jump box.
Michael Hampton,

Risposte:


6

Il modo in cui uso un host bastion sta usando ProxyCommande il -Wflag come in questo esempio:

ssh -o ProxyCommand='ssh -W %h:%p user@bastion' user@machine

Uso questo approccio per motivi di sicurezza. La comunicazione tra client e macchina di destinazione è crittografata e autenticata end-to-end, il che significa che rimane protetta anche se il bastione è compromesso. Un host bastion compromesso fornirebbe non meno sicurezza rispetto all'utilizzo di ssh end-to-end senza un bastione.

Elimina inoltre la necessità di utilizzare qualsiasi inoltro agente. Il client può utilizzare prima l'autenticazione basata su chiave per accedere al bastione e poi di nuovo per accedere all'host di destinazione senza che a nessuno di questi venga fornita una connessione agente che potrebbe essere utilizzata per abusare della chiave privata presente sul client.

Limita anche il codice da cui dipendo dall'host del bastione. Non ho bisogno di eseguire alcun comando sul bastione. -Wimplica il flag no command e un unico port forwarding, questo port forwarding è tutto ciò che l'host del bastione deve consentire.

Con questo approccio in mente, la mia raccomandazione sarebbe quella di bloccare il più possibile l'host del bastione consentendo l'utilizzo solo dei comandi della struttura sopra.

Il ~/.ssh/authorized_keysfile sul bastione potrebbe essere di proprietà di root (così come tutte le directory sul percorso dalla radice del file system ad esso), questo riduce il rischio che potrebbe essere modificato anche se qualcuno è riuscito a entrare come utente non privilegiato sul host bastione.

Nel authorized_keysprivilegi del cliente può essere limitato utilizzando le opzioni command, no-agent-forwarding, no-pty, no-user-rc, no-X11-forwarding, così come usando permitopenper l'inoltro delle porte limite per consentire solo l'accesso alla porta 22 dell'host che questo utente è consentito l'accesso a.

In linea di principio questo approccio sarebbe sicuro anche se più utenti condividessero il singolo nome utente sul bastione. Ma ottieni un po 'più di separazione usando nomi utente separati sul bastione.


Sembra che tu stia invocando binario ssh sul bastione stesso. In questo caso, se il bastione è compromesso, l'attaccante può sostituire questo binario ssh con uno che scarica le tue comunicazioni. Dal momento che non stai usando il percorso nella tua riga di comando (come / usr / bin / ssh), l'attaccante potrebbe farlo anche senza avere accesso root sul bastione, inserendolo nella tua home directory e cambiando PATH (o usando alias ssh). Solo i miei 2 centesimi.
George Y.

1
@GeorgeY. Tui hai torto. Entrambi i sshcomandi sono in esecuzione sul client. E questo è esattamente il punto di farlo nel modo che suggerisco. L'approccio menzionato nella domanda verrebbe eseguito sshsul bastione, che apre una vasta gamma di possibili vettori di attacco.
Kasperd,

2

Puoi aggirare facilmente ForceCommand dal momento che si avvia all'avvio della shell. Ciò significa essenzialmente che il tuo file rc della shell viene elaborato prima e poi ForceCommand se gli consenti di arrivarci. Semplice exec shnel tuo file rc della shell genererà un'altra shell e manterrà ForceCommand in attesa di uscire da questa shell.

Quindi linea di fondo; se l'utente può in qualche modo modificare la sua shell rc (diciamo .bashrc) tramite ftp, sftp, scp o in qualche altro modo, ForceCommand non è davvero qualcosa su cui fare affidamento.


Ok ci proverò. Nessuno di quegli utenti ha accesso all'host del bastione per apportare modifiche ai file. Hanno accesso solo all'host di destinazione dove possono modificare il .bashrc. Ma spero di averti capito bene, che ti relazioni con l'host del bastione?
Dr.Elch,

1
Questo è solo un problema se l'utente è in grado di accedere al sistema per modificare il file bashrc. Se questi account non sono destinati all'uso normale, possono essere di proprietà di root, con la directory e quasi tutti i file di proprietà di root. Controlla le regole sulla proprietà dei file .ssh, ma certamente cose come .bashrc non devono essere scrivibili.
MC0e,

Sì @ Dr.Elch in effetti, mi riferivo alla sicurezza sull'host bastion. Puoi anche considerare; chattr + i per impostare shell rc come immutabile e disabilitare gli utenti a cambiare shell per sé stessi come opzione.
Hrvoje Špoljar,

1

Immagino che vada bene per la maggior parte del tempo, ma il problema con la sicurezza è che le cose a cui nessuno è ancora riuscito a pensare. Non ci sono garanzie

Come per esempio per molto tempo nessuno aveva pensato troppo al modo in cui le funzioni potevano essere create da variabili d'ambiente in bash, ma recentemente le persone hanno capito che potevano essere sovvertite e uno degli effetti di ciò era che ForceCommand poteva essere aggirato (at almeno come implementato nel file authorized_keys) se la shell degli utenti era bash. Bash è stato risolto e, si spera, la tua versione è aggiornata, ma succede cose del genere.

Non sono del tutto sicuro se la definizione di ForceCommand sia effettivamente uguale alla definizione di quei comandi nei file authorized_keys. Non l'ho guardato da vicino.


0

Rendi il .bashrcproprietario di root:usergrpma ancora leggibile dall'sshd in esecuzione come utente che accede. Imposta permessi / proprietario su $ HOME, impedendo la creazione di nuovi file da parte dell'utente. In questo modo il root controlla i contenuti di .bashrc, permettendogli di fare ciò di cui ha bisogno, ma l'utente stesso non può modificare tali impostazioni o autorizzazioni su file / directory che consentirebbero indirettamente loro di modificare i contenuti di .bashrc.


che ne dici di non assegnare alcuna home directory a quell'utente sul server bastion?
Dr.Elch,

Dove hai intenzione di memorizzare i .bashrccomandi con cui vuoi che vengano eseguiti?
Marcin,

Sul server bastion il forcecommand che inoltra la connessione all'host reale è definito in sshd_config. Quindi, non ho bisogno di specificare altri comandi su quell'host bastione, giusto?
Dr.Elch,

0

Ho un'altra idea Per ogni utente sul server bastion puoi definire la loro shell in / etc / passwd in modo che sia uno script bash che esegue semplicemente ssh user1 @ machine1, user2 @ machine2, ecc. In questo modo ti assicurerai che non abbiano alcun valido shell sul server stesso e che si collegano semplicemente alla macchina alla quale dovrebbero connettersi.


Hai provato questo? Questa idea mi è venuta in mente e mi chiedo quanto funzioni bene.
William Pietri,
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.