blog_hero_Werken met OpenSSH

Werken met OpenSSH

Jul 21 2023

Waar beginnen we?

Bij het begin uiteraard! OpenSSH is een fantastische software om op een veilige manier te verbinden met servers. Deze software is vaak beschikbaar op client met Linux, MacOS en zelfs Windows!

Iedereen die nog Putty gebruikt, let goed op!

Onder Services.msc kan je de service OpenSSH openen en aanpassen naar Automatisch. Standaard staat deze service uit waardoor het lijkt alsof OpenSSH niet standaard in Windows zit. Als die op automatisch staat, kan je het toestel herstarten en start OpenSSH vanzelf op maar het is logischer om hier gewoon even op Start te drukken.

De configuratie

OpenSSH gaat altijd configuratie volgen in ~/.ssh/config. Dat werkt grotendeels hetzelfde voor Linux, MacOS en Windows. Voordat we hier servers in gaan definiëren, kunnen we even stilstaan met naar welke toestellen we gaan verbinden. SSH maakt namelijk ook nog steeds gebruik van DNS. We kunnen dus bijvoorbeeld naar zn1.winderickx.me verbinden door simpelweg ssh zn1 uit te voeren. Hiervoor moet je wel met een lokale DNS kunnen praten die de vertaling voor jou kan maken. Dat spaart ook weer lijnen uit in onze configuratie. Ofwel kan je in Linux en MacOS een entry aanmaken in /etc/hosts. Dit overruled DNS-servers die jouw toestel kent. Ga hier dus voorzichtig mee om!

In Windows vindt je een /etc/hosts achtig bestand onder C:\Windows\System32\drivers\etc.

De basis

Het is heel simpel om configuratie op te bouwen. Onderstaand voorbeeld verbindt zo naar een server met een bepaalde gebruiker. Het aanmelden specifiek gebeurt met een SSH-key die we hier meegeven.

De private key wordt dankzij ForwardAgent ook doorgegeven aan de server. Als je dan naar een nieuwe server verbindt, zal je gebruik kunnen maken van jouw private key zonder dat die op de server komt te staan.

De AddKeysToAgent zorgt er verder voor dat je de key niet apart moet toevoegen met ssh-add en gaat de key voor een standaard termijn in de agent houden.

Een laatste handige tip is RemoteForward. Hiermee kan je bijvoorbeeld ook jouw GPG-key doorsluizen over jouw SSH verbinding. Je gaat dan eerst de remote socket meegeven en vervolgens de local socket. Voor GPG vind je die configuratie met: gpgconf --list-dirs agent-socket

Host zn1
  Hostname zn1.winderickx.me
  User ew
  AddKeysToAgent yes
  ForwardAgent yes
  IdentityFile ~/.ssh/id_personal
  RemoteForward /run/user/1001/gnupg/S.gpg-agent /run/user/1001/gnupg/S.gpg-agent

Nu wordt het interessant!

Het is een heel werk als je meer dan 100 servers moet beheren. Je gaat die niet één voor één willen toevoegen aan je SSH configuratie. De meeste van die servers gaan wel een aantal configuratie hebben die overeen zal komen met andere servers. Probeer daar de grootste gemene deler te vinden en maar daar een aparte entry van. Nu gaan we een wildcard gebruiken om een aantal zaken automatisch te laten invullen voor ons. Met onderstaande configuratie kan ik zowel naar zn1.winderickx.me verbinden alsook naar R4nd0ms3rvrr.amazon.com.

Host *
  User ew
  AddKeysToAgent yes
  ForwardAgent yes
  IdentityFile ~/.ssh/id_personal

Dat werkt goed tot je in meerder omgevingen komt en dus meerdere soorten servers moet verbinden. Het kan zijn dat je per omgeving een andere gebruiker hebt of een andere SSH-key. Zoek opnieuw naar de grootste gemene deler! Hieronder gebruiken we ook de ProxyJump configuratie. We gebruiken srv-jump als stepping stone voor servers beginnend met srv-.

Host *
  AddKeysToAgent yes
  ForwardAgent yes
Host jumpserver
  Hostname srv-jmp-001
  User JumpUser
  IdentityFile ~/.ssh/id_jump
Host srv-*
  User admin
  IdentityFile ~/.ssh/id_admin
  ProxyJump jumpserver
Host *.winderickx.me
  User ew
  IdentityFile ~/.ssh/id_personal

Expert tip!

Zoals met vele zaken kan je die wildcard in de configuratie heel ver gebruiken. Om het dan leesbaar te houden, kunnen we best ook met negaties werken. Zo komen de wildcards pas echt tot hun recht!

Host *
  AddKeysToAgent yes
  ForwardAgent yes
Host !srv-jmp srv*
  User admin
  IdentityFile ~/.ssh/id_admin
  ProxyJump srv-jmp-001
Host srv-jmp-001
  user JumpUser
Host *.winderickx.me
  User ew
  IdentityFile ~/.ssh/id_personal

Controleer zeker ook man ssh_config voor nog meer SSH configuratie goodness!