La differenza in una tabella
| Jump host | Bastion host | |
|---|---|---|
| Cosa descrive il termine | Un ruolo: un server da cui passi | Una macchina costruita solo per quel ruolo |
| Dove si trova | Ovunque: una macchina di sviluppo, una VM di amministrazione, un altro server | Al bordo, raggiungibile da internet o dall'ufficio |
| Cos'altro ci gira | Spesso altri servizi | Nient'altro che SSH |
| Chi può entrare | Chiunque abbia un account | Utenti con nome, spesso solo con inoltro e senza shell |
| Server privati | Di solito raggiungibili anche in altri modi | Accettano SSH solo dal bastion |
| Log | Quello che il server conserva | Ogni connessione registrata, con i log tenuti fuori dalla macchina |
Quindi la domanda non è quale dei due scegliere. Un bastion è un jump host trasformato nell'unica porta d'ingresso, e protetto di conseguenza. Altri nomi per le stesse cose sono jump server, jump box e gateway SSH.
Come SSH passa attraverso l'uno o l'altro
Dal tuo lato la connessione è identica in entrambi i casi. Ci sono due modi buoni e uno da evitare:
# ProxyJump, OpenSSH 7.3 and later
ssh -J user@bastion user@10.0.0.5
# ProxyCommand with -W, the older equivalent
ssh -o ProxyCommand="ssh -W %h:%p user@bastion" user@10.0.0.5
# Two separate logins: avoid
ssh -A user@bastion
ssh user@10.0.0.5
Con i primi due, il jump host apre solo una connessione TCP verso la destinazione e inoltra i byte. La tua sessione SSH verso 10.0.0.5 è cifrata a partire dal tuo computer, e la chiave viene usata dal tuo computer. Con il terzo ottieni una shell sul jump host e da lì avvii un nuovo ssh, quindi o la tua chiave privata sta su quella macchina o il tuo agent viene inoltrato fin lì. Chiunque abbia root su quella macchina può allora usarla.
Le forme per il file di configurazione, i salti multipli e le opzioni che non arrivano al jump host sono nella guida ProxyJump e jump host con esempi.
ProxyJump o ProxyCommand?
Usa ProxyJump quando il salto è un server SSH. È più corto, si concatena con le virgole e ogni salto è un normale Host con utente, porta e chiave propri:
ssh -J bastion-eu,admin-gw db-internal
Usa ProxyCommand quando l'ingresso non è SSH puro: un proxy HTTP o SOCKS attraverso nc, oppure lo strumento a riga di comando di un provider cloud che apre la sessione al posto tuo. ssh esegue il comando e parla con il suo input e output standard.
Le due opzioni sono in concorrenza: vince quella impostata per prima, e un -o sulla riga di comando viene prima del file di configurazione. Per sapere quale vale per un host, chiedilo a ssh:
ssh -G db-internal | grep -i '^proxy'
proxyjump bastion-eu,admin-gw
Cosa trasforma un jump host in un bastion
- Un solo compito. Un server piccolo con SSH e nient'altro: niente database, niente sito web, niente strumenti di build.
- L'unica porta. I server privati accettano la porta 22 solo dall'indirizzo del bastion, nel firewall o nel security group.
- Nessuna chiave sopra, niente agent forwarding. Gli utenti ci passano attraverso con
ProxyJump. - Solo inoltro. Alla maggior parte degli utenti lì non serve una shell. Un blocco
Match GroupconPermitOpenlimita dove possono andare. - Accesso forte. Solo chiavi, e se vuoi un secondo fattore con TOTP.
- Log conservati altrove. I log delle connessioni escono dalla macchina, così un intruso non può cancellarli.
- Aggiornato spesso. È esposto a internet, quindi gli aggiornamenti di sicurezza si installano da soli.
La configurazione completa di sshd, con i comandi per provare cosa viene rifiutato, è nella guida come configurare un bastion host SSH.
Serve ancora un bastion?
Un bastion risolve un solo problema: far arrivare le persone ai server privati da un unico punto d'ingresso sorvegliato. Altri strumenti risolvono lo stesso problema in altri modi:
- Una VPN o una rete privata sovrapposta mette il tuo computer nella rete privata, così ti colleghi ai server direttamente.
- Il servizio di sessione di un provider cloud apre una shell o un tunnel attraverso le API del provider, senza alcuna porta SSH aperta.
- Un proxy di accesso basato sull'identità verifica chi sei a ogni connessione e registra le sessioni in un unico posto.
Ognuno sposta l'unica porta da un'altra parte. Il bastion resta l'opzione più semplice quando vuoi OpenSSH puro, senza agent sui server e senza un servizio in più da gestire.
Domande
Jump server e bastion host sono la stessa cosa?
Nell'uso comune quasi sempre sì, e jump box vuol dire lo stesso. In senso stretto, jump server o jump host descrive il ruolo, cioè farti passare, mentre bastion indica una macchina protetta al bordo della rete che ha solo quel compito.
Il bastion può leggere la mia sessione SSH?
Non con ProxyJump o ProxyCommand ssh -W. Inoltra soltanto il flusso cifrato, quindi vede chi si è collegato, quando e verso quale indirizzo e porta. Può leggere tutto solo se apri una shell sul bastion e da lì lanci di nuovo ssh.
Conviene usare l'agent forwarding attraverso un bastion?
No. Usa ProxyJump. Con ssh -A verso il bastion, chiunque abbia root lì può usare le tue chiavi finché sei collegato. Vedi i rischi dell'agent forwarding.
Serve ancora un bastion se ho una VPN?
Non sempre. Una VPN o una rete privata sovrapposta può sostituirlo come porta d'ingresso. Molti team tengono comunque un bastion come unico punto d'accesso SSH, perché una sola macchina è facile da controllare, registrare e chiudere.
Fonti
- ssh(1), -J e -W, manuale OpenBSD
- ssh_config(5), ProxyJump e ProxyCommand, manuale OpenBSD
- sshd_config(5), inoltro e Match, manuale OpenBSD
- Note di rilascio di OpenSSH 7.3, ProxyJump