Host bastion che consente agli utenti della prigione di accedere a SSH ma protegge la chiave privata

6

Fondamentalmente, sto cercando di consentire all'utente di utilizzare una chiave privata senza avere accesso in lettura ad esso.

Caso d'uso: il dipendente ha bisogno di SSH su un server nel data center. C'è una chiave privata per tutti i server, archiviata sul bastione. Come può il dipendente utilizzare il bastione come una casella di salto mentre protegge la chiave privata?

  1. Il dipendente si connette (tramite SSH) al bastione.
  2. L'host del bastion utilizza la shell jail per bloccare l'accesso di quel dipendente.
  3. Dipendente quindi SSH si connette a un server finale (ma non ha toccato la chiave privata nel processo)

Esiste un'applicazione / strumento / script / metodo per il bastione per fornire l'accesso SSH a un altro server senza rivelare la chiave privata al dipendente?

Un pensiero che ho avuto è che potrebbe esserci un modo per un ascoltatore sul bastione di attivare la propria connessione SSH al nodo finale e quindi fornire all'utente in carcere uno 'schermo' condiviso o una shell condivisa per facilitare l'accesso a il nodo finale?

Forse ho finito per complicarlo e c'è una soluzione migliore là fuori. Le chiavi private per utente sembrano un incubo da gestire.

    
posta BastionH0st2 07.07.2014 - 01:13
fonte

5 risposte

7

Una possibilità sarebbe usare 'sudo' (o uno script / alias che si basa su di esso).

Grazie a sudo, puoi consentire agli utenti di utilizzare temporaneamente un altro (non necessariamente root) per eseguire un comando molto specifico:

  1. Crea un nuovo account che sarà proprietario della chiave privata,
  2. Configura sudo in modo che gli utenti possano avviare un client SSH utilizzando questo account e la sua chiave privata.

In questo modo gli utenti saranno in grado di eseguire un client SSH senza privilegi utilizzando una chiave privata, senza poter accedere direttamente alla chiave privata stessa.

    
risposta data 07.07.2014 - 13:49
fonte
4

1: utilizzare i token hardware, come un Yubikey configurato per l'autenticazione basata su challenge-response. O smartcard. Carichi la chiave su tutti loro e li distribuisca. Sono progettati per mantenere segreti i segreti.

2: Interrompere l'uso di una singola chiave, iniziare a utilizzare una coppia di chiavi per utente per responsabilità e revocabilità pratica.

    
risposta data 05.05.2015 - 01:33
fonte
4

ATTENZIONE : creatività in anticipo, che spesso è dannosa per la sicurezza (almeno senza una revisione approfondita).

Questo sembra un caso in cui un agente SSH potrebbe essere utile. Un agente SSH fornisce un'interfaccia socket su cui i client SSH possono chiedere all'agente di eseguire operazioni chiave per loro, il che abilita i seguenti usi comuni:

  • Puoi fare in modo che l'agente con esecuzione prolungata decrittografi la tua chiave privata una volta, invece di fare decrittografare la chiave separatamente.
  • Puoi far inoltrare il tuo client SSH alla connessione dell'agente, permettendoti di usare la tua chiave dall'host remoto senza effettivamente memorizzarla o altrimenti rivelarla.

Questo secondo caso, in particolare, suona molto simile al tuo caso d'uso, tranne che invece di concedere l'accesso su un host diverso, vuoi concedere l'accesso a più utenti sullo stesso host.

Sembrerebbe qualcosa del genere:

sshkeeper@bastion$ eval "$(ssh-agent -a /path/to/socket)"
sshkeeper@bastion$ echo $SSH_AUTH_SOCK
/path/to/socket

sshkeeper@bastion$ ssh-add
Enter passphrase for /home/sshkeeper/.ssh/id_rsa:

sshkeeper@bastion$ chmod 660 /path/to/socket
sshkeeper@bastion$ chgrp ssh-users /path/to/socket

La chiave non ha necessariamente bisogno di una passphrase; Ne ho incluso uno per illustrazione. In ogni caso, ora chiunque abbia il permesso di leggere e scrivere sul socket può usare ...

jander@bastion$ export SSH_AUTH_SOCK=/path/to/socket
jander@bastion$ ssh private_server
Error reading response length from authentication socket.
Permission denied (publickey).

Spiacenti. È un po 'più complicato di così, perché ssh-agent è paranoico e controlla l'ID utente di chiunque si colleghi al socket. Quindi abbiamo bisogno di una soluzione alternativa. Proviamo ad usare socat come proxy:

sshkeeper@bastion$ eval "$(ssh-agent -a /home/sshkeeper/ssh_agent_socket)"
sshkeeper@bastion$ ssh-add
Enter passphrase for /home/sshkeeper/.ssh/id_rsa:
sshkeeper@bastion$ rm /path/to/socket
sshkeeper@bastion$ umask 117
sshkeeper@bastion$ socat UNIX-LISTEN:/path/to/socket,fork,group=ssh-users UNIX-CONNECT:/home/sshkeeper/ssh_agent_socket &

Ora è il processo socat di proprietà di sshkeeper che si connette all'agente e non al client SSH di proprietà jander, quindi l'agente non ha alcun reclamo:

jander@bastion$ export SSH_AUTH_SOCK=/path/to/socket
jander@bastion$ ssh private_server
jander@private_server$ █

Dovrai fare attenzione alle autorizzazioni del filesystem per accedere al socket, poiché è tutto ciò che serve per proteggerlo. Non dare a nessuno tranne sshkeeper accesso in scrittura lungo il percorso del socket. Attenzione anche che alcuni sistemi derivati da BSD ignorano le autorizzazioni sul file socket stesso; testalo accuratamente sul tuo sistema.

Infine, fai attenzione che si tratta di un uso non standard dell'agente SSH: in effetti ho dovuto aggirare una funzionalità di sicurezza per farlo funzionare. Credo che su un sistema Linux con permessi adeguati per il filesystem, possa essere almeno sicuro o più sicuro della soluzione sudo ... ma non dovresti credermi sulla parola. Assicurati di aver capito esattamente cosa sta succedendo qui prima di utilizzarlo.

UPDATE : ho dato un'occhiata a openssh ssh-agent source code per vedere cosa si può fare con un socket dell'agent, e posso vedere un paio di opportunità per un piccolo danno. Vale a dire, i tuoi utenti possono chiedere all'agente di aggiungere o rimuovere le chiavi.

Quindi una persona potrebbe dire all'agente di rilasciare la chiave, bloccando tutti gli altri dai server finché tu (o uno script) non aggiungerai nuovamente la chiave.

Una persona potrebbe anche aggiungere una chiave, dando a tutti gli altri l'accesso a server aggiuntivi. Tuttavia, questa persona potrebbe anche consegnare la chiave ad altre persone (senza utilizzare il server) o utilizzare il proprio agente condiviso, quindi questo punto è relativamente minore.

    
risposta data 05.05.2015 - 11:25
fonte
2

Bene oltre alla risposta sudo (che è davvero intelligente btw), un'altra soluzione è una shell ristretta. In questo caso dovresti scriverne uno. In questo caso gli unici comandi che devi accettare sono "ssh < hostname >" e "esci", quindi non è così difficile.

In realtà sto solo postando questo per completezza, ma la tecnica generale è valida in altri contesti.

    
risposta data 04.05.2015 - 22:46
fonte
1

Usa autenticazione basata su host

Sebbene generalmente sconosciuto, ssh supporta l'autenticazione della macchina remota, in modo simile a rsh (ma più sicuro).

C'è un buon manuale su link

Il server bastion ssh dovrebbe avere una chiave privata a cui si accede tramite il setuid ssh-keysign binary (l'utente non ha accesso a questo), e i server remoti dovrebbero essere configurati per fidarsi semplicemente di chiunque provenga dall'host bastion (decidi se è saggio o meno)

    
risposta data 14.03.2016 - 02:42
fonte