SSH bastion hosts: één beveiligde toegang tot je privéservers
Kort antwoord
Een bastion host, ook wel jump host genoemd, is één zorgvuldig gehardende server die SSH-toegang tot een privénetwerk beheert. Je verbindt eerst met die server en springt vandaaruit door naar de server die je echt nodig hebt, zodat de losse servers in het privénetwerk nooit hun eigen publieke SSH-blootstelling nodig hebben. Zo hoef je maar het SSH-oppervlak van één server af te sluiten, in de gaten te houden en te patchen, in plaats van dat elke server op het netwerk apart blootgesteld staat.
Het probleem dat het oplost
Als elke server in een privénetwerk ook SSH open heeft staan naar het publieke internet, is elke server een eigen, op zichzelf staand doelwit: eigen inlogpogingen om in de gaten te houden, een eigen sshd-versie om te patchen, een eigen configuratie die geleidelijk kan afwijken van de rest. Vermenigvuldig dat met het aantal servers dat je draait, en je hebt het aanvalsoppervlak met datzelfde aantal vermenigvuldigd, ook al heeft in de praktijk steeds dezelfde kleine groep mensen toegang tot al die servers nodig.
Een bastion host draait dit om. In plaats van dat elke server bereikbaar is vanaf het internet, is alleen de bastion dat. Elke andere server in het privénetwerk houdt SSH alleen open voor intern verkeer: bereikbaar vanaf de bastion, maar niet van buitenaf. Er is nog steeds precies één deur met een slot, maar nu is er ook maar één deur.
Hoe de hop werkt
Je verbindt met de bastion via je gebruikelijke SSH-client en inloggegevens. Vanuit een sessie op de bastion verbind je vervolgens verder naar de daadwerkelijke doelserver, die alleen bereikbaar is vanuit het privénetwerk waar de bastion aan de rand van staat. Er lopen twee losse SSH-verbindingen: één naar de bastion en één van de bastion naar de doelserver. Maar de doelserver ziet altijd alleen een verbinding die binnenkomt vanaf het privéadres van de bastion, nooit rechtstreeks vanaf het internet.
Omdat de bastion de enige server is met enige publieke blootstelling, is het de moeite waard om hem anders te behandelen dan de servers erachter: minimale software geïnstalleerd, agressief patchen, alleen inloggen met sleutels, en nauwlettend toezicht op de logs, zoals ook beschreven staat in Je SSH-beveiliging verbeteren. Een bastion die verwaarloosd wordt, ondermijnt zijn eigen doel, want dan wordt hij juist het ene zwakke punt dat toegang geeft tot alles erachter.
Twee hops laten aanvoelen als één
Handmatig inloggen op de bastion via SSH, en vandaaruit opnieuw SSHen naar de doelserver, werkt, maar wordt al snel omslachtig. Bovendien betekent het dat je private key (of in elk geval een agent die deze kan gebruiken) ook bruikbaar moet zijn vanaf de bastion. Twee gangbare configuratiepatronen voorkomen dat:
ProxyJump
De -J-vlag van OpenSSH, of een ProxyJump-regel in je SSH-configuratie, zorgt ervoor dat je eigen client de verbinding automatisch via de bastion routeert:
ssh -J user@bastion-ip user@target-private-ipOf stel het één keer in ~/.ssh/config in, zodat een simpel ssh target hetzelfde doet zonder dat je het elke keer hoeft uit te typen:
Host target
HostName target-private-ip
User user
ProxyJump user@bastion-ipMet ProxyJump opent je client de verbinding naar de doelserver via de bastion, maar de bastion zelf krijgt je private key nooit onder ogen. Van jouw kant blijft het één enkel commando, ook al zijn het technisch gezien twee hops.
SSH agent forwarding
Agent forwarding is de oudere aanpak: hiermee kan een sessie op de bastion gebruikmaken van de SSH-sleutel die wordt beheerd door de agent op je eigen machine, zonder dat de private key zelf ooit naar de bastion wordt gekopieerd. Het werkt, maar het is goed om te begrijpen wat het toestaat: zolang je forwarded sessie openstaat, kan in principe alles wat op de bastion onder jouw account draait, je agent vragen om een aanvraag voor een andere bestemming te ondertekenen. ProxyJump vermijdt die blootstelling volledig, omdat de bastion daarbij nooit betrokken wordt bij het beheer van sleutels. Daarom is het tegenwoordig doorgaans het voorkeurspatroon voor een bastion-opzet.
Waar de bastion staat
Een bastion staat doorgaans aan de rand van een privénetwerksegment: de ene kant is bereikbaar vanaf het internet, de andere kant is bereikbaar via, of gekoppeld aan, het privénetwerk met de servers die hij beschermt. Zie Servers verbinden via een private VLAN voor hoe dat privésegment zelf is opgebouwd; de bastion maakt het praktisch mogelijk om servers erop daadwerkelijk te beheren zonder het hele segment open te zetten naar het internet.