Deze blogpost is het laatste deel van een 3-delige serie over SSH (Secure Shell) verbindingen met OpenSSH. In dit laatste deel van de serie zal ik het hebben over jump/bastion hosts, het gebruik van 'screen' en het overdragen van bestanden. Het doel van deze serie blogposts is om je meer te leren over SSH. In deze blogposts ga ik ervan uit dat je een UNIX-achtig besturingssysteem met OpenSSH gebruikt.
Laten we beginnen met te praten over jump/bastion hosts en waarom ze zo handig zijn. Het komt steeds vaker voor dat de externe server die je wilt benaderen niet directbereikbaar is. In plaats daarvan moet je langs een jump of bastion host.En dat is een goede zaak, want:
Het passeren van een jump host kan vervelend zijn omdat je door meerdere servers moet SSH-en. Gelukkig zijn er meerdere manieren om dit te doen. Ik heb hieronder 4 methoden opgesomd!
Eén methode om een jump host te passeren is om te SSH-en naar de jump host en dan vanaf de jump host te SSH-en naar je server.
Je zult al snel tot de conclusie komen dat het verbinden met je remote server vanaf de jump host een SSH sleutel op de jump host vereist. Een oplossing zou kunnen zijn om een SSH-sleutel aan te maken op de jump host, maar dit is geen optie voor jump hosts die regelmatig worden vervangen. Dit is waarschijnlijk geen geschikte methode voor de meesten van ons, dus laten we verder gaan met de volgende methode. Oh, en tussen haakjes: kopieer nooit je lokale SSH sleutel naar een andere host zoals een jump host!
Ik heb het ssh-agent concept al uitgelegd in de eerste blogpost van deze serie. Met agent forwarding kun je je lokale ssh-agent blootstellen aan een externe server, zoals een jump host. Je kunt ofwel de commandoregeloptie-A of de configuratiebestandoptieForwardAgent gebruiken.
Door dit te doen heb je geen intermediaire sleutel meer nodig. Je account op de jump-host en de remote server zouden alleen het publieke deel van je lokale SSH sleutel moeten bevatten. Makkelijk genoeg, toch?
Echter, omdat je je lokale ssh-agent blootstelt aan de jump host, kan de jump host je SSH sleutel gebruiken zonder de passphrase nodig te hebben. Als jij de enige bent die deze jump host gebruikt (en onderhoudt), dan zit je waarschijnlijk goed. Als dat niet het geval is (waarschijnlijk meestal), kan iemand jouw sleutel gebruiken terwijl deze wordt doorgestuurd naar de jump host.
Bij het starten van een SSH verbinding met agent doorsturen ingeschakeld, zal de SSH server een socket aanmaken om je ssh-agent bloot te stellen. Alleen jouw gebruiker op de jump host zal permissies hebben op deze socket, maar deze beperkingen gelden niet voor de root gebruiker of een gebruiker die voldoende permissies heeft via sudo.
Met de ProxyCommand optie kun je een commando specificeren dat moet worden gebruikt om verbinding te maken met de remote server. Deze optie kan gebruikt worden om SSH verbindingen te 'chainen'. Door "ssh -W" als ProxyCommand te gebruiken, vragen we dat standaard invoer en uitvoer op de client wordt doorgestuurd naar Hostname over het beveiligde kanaal naar my-jump-host.
Zoals je kunt zien, vereist dit enige configuratie, maar dat hoeft maar één keer gedaan te worden.
Als deze configuratie eenmaal staat, kun je 'direct' naar je remote server ssh-en. Het passeren van de bastionhost wordt verzorgd door het ProxyCommando.
Sinds OpenSSH 7.3 is er een eenvoudiger te configureren alternatief voor ProxyCommand genaamd ProxyJump.
Zoals je kunt zien is de configuratie van deze optie een stuk eenvoudiger.
Verbinden met je remote server is niet anders dan de ProxyCommand methode. Als je verbinding wilt maken met een remote server zonder deze toe te voegen aan je config bestand via een jump host (die je hebt toegevoegd aan je config bestand), dan is ProxyJump ook erg eenvoudig.
Wanneer je een SSH config bestand deelt met je team, kun je ook de bovenstaande configuratie toevoegen. Ze zullen het zeker waarderen dat ze de configuratie niet zelf hoeven te maken of toe te voegen!
Ik raad deze methode aan in plaats van de andere omdat
Met methode 3 en 4 heb je ook het voordeel dat je bestanden direct kunt overzetten naar je externe server met scp of sftp zonder dat je ze eerst hoeft te kopiëren naar de jump host. Maar hoe begin je dan precies met het overzetten van bestanden? We zullen in de details van bestandsoverdracht duiken, maar laat me je eerst vertellen over het gebruik van 'screen'.
Aangezien elke jump host een extra foutpunt introduceert, is dit het perfecte moment om 'screen' te gaan gebruiken. Heb je wel eens gehad dat je SSH sessie verbroken werd tijdens het uitvoeren van een langdurig en/of delicaat proces op een externe server? Als je SSH-sessie wordt verbroken, worden alle processen die in de sessie zijn gestart en op de voorgrond draaien beëindigd. Hierdoor moet je helemaal opnieuw beginnen of, afhankelijk van het proces, met een puinhoop achterblijven die je handmatig moet opruimen. Gelukkig kun je voorkomen dat dit een probleem wordt door 'screen' te gebruiken. Van de man pagina:
Screen is een schermvullende window manager die een fysieke terminal vermenigvuldigt tussen verschillende processen (typisch interactieve shells).
Enkele voordelen van het gebruik van screen
Allereerst moet screen geïnstalleerd zijn op je externe server. Als screen nog niet geïnstalleerd is, kun je de package manager van je systeem gebruiken om het te installeren.
Een screen starten is heel eenvoudig:
Screen zal een nieuwe shell aanmaken, net zoals SSH'en naar een server zou doen.
Het verschil met een 'standaard' shell is dat je de verbinding kunt verbreken zonder alle subprocessen te doden. Eerst moet je het escape commando invoeren, watCTRL+a is, gevolgd doorCTRL+d
Screen zal je vertellen dat het je heeft losgekoppeld van een schermsessie. In dit geval heet de sessie 4389.pts-0.my-remote-server. Als je de shell wilt verlaten in plaats van de verbinding te verbreken voor de schermsessie, kun je dat doen alsof het iedere andere shell is. Enter:
Met de optie-ls kun je een lijst maken van alle actieve schermsessies.
Elke regel bestaat uit de proces-id en de sessienaam, gescheiden door een punt.
Zoals je kunt zien in de uitvoer hierboven, kunnen schermsessies moeilijk te identificeren zijn. Daarom kan het verstandig zijn om je schermsessie een naam te geven als je hem start:
Als je opnieuw wilt koppelen aan een schermsessie, kun je dat doen met de-r optie. Deze optie neemt ofwel het proces id of de sessienaam als parameter.
Elk van de volgende subsecties gaat ervan uit dat je verbonden bent met een schermsessie.
DoorCTRL+a gevolgd doorCTRL+c uit te voeren, maak je een nieuw venster.
MetCTRL+a gevolgd doorCTRL+w krijg je een lijst met geopende vensters.
Zoals je kunt zien in de bovenstaande uitvoer, heb ik 3 open vensters, geïdentificeerd door een nummer gevolgd door de titel.
Er zijn 4 (5) manieren om tussen vensters te schakelen:
Er zijn verschillende toetscombinaties die kunnen worden gebruikt in een schermsessie, na het geven van de besturingsopdracht(CTRL+a). Je kunt een overzicht krijgen van de beschikbare toetscombinaties door op de toets? te drukken. Druk eerst opCTRL+a en dan op de toets?
Een van mijn favorieten iscopy. Zoals de naam al verraadt, kun je hiermee tekst van het ene venster naar het andere kopiëren. Kijk voor een compleet overzicht en uitleg van de beschikbare commandoregelopties en toetscombinaties op de manpage.
Zoals hierboven beloofd, gaan we het hebben over het overzetten van bestanden. Er zijn een aantal methoden om bestanden over te zetten van, naar en tussen hosts op afstand. In deze sectie zal ik het hebben over bestandsoverdracht via SCP, SFTP en SSH 'streaming'. Alle drie deze methoden werken ook als je een jump host gebruikt wanneer je de ProxyCommand of ProxyJump richtlijn gebruikt zoals hierboven beschreven.
Met scp of secure copy kun je veilig bestanden kopiëren van, naar of tussen hosts op afstand.
Bekijk voor meer informatie over het gebruik van scp de man page.
sftp of secure file transfer protocol is een interactief programma voor bestandsoverdracht, vergelijkbaar met ftp, waarmee bestanden veilig van en naar een server op afstand gekopieerd kunnen worden. Door het commando "?" in te voeren krijg je een lijst met mogelijke commando's.
Voor meer informatie over het gebruik van sftp, bekijk de man page.
Stel dat je een archief nodig hebt van de logbestanden op je externe server, maar je hebt niet genoeg ruimte op die server om het archief aan te maken. In plaats van het archief aan te maken op de externe server en het dan te kopiëren, kun je het ook 'streamen' naar je lokale machine. Net als scp kan deze methode worden gebruikt om bestanden van, naar of tussen externe servers te kopiëren.