Module 2 · 2.3
SSH slim gebruiken
Module 2: SSH en sleutels · Leestijd: 10 minuten
Leerdoel: Na deze les kun je SSH dagelijks handig gebruiken met een eigen configuratiebestand, bestanden kopiëren met scp en rsync, en met een tunnel bij een database komen zonder dat de databasepoort open hoeft naar internet.
Kernbegrippen: ~/.ssh/config, Host, HostName, User, IdentityFile, scp, rsync, sftp, port forwarding, -L, tunnel, ProxyJump, ServerAliveInterval, ander poortnummer, sleutel intrekken
Minder typen met ~/.ssh/config
Na een paar weken typ je dit tientallen keren per dag:
anna@laptop:~$ ssh -i ~/.ssh/id_ed25519 anna@192.0.2.10Met een configuratiebestand voor de client wordt dat korter en maak je minder fouten. Het bestand staat op je eigen computer: ~/.ssh/config (Windows: C:\Users\anna\.ssh\config, zonder extensie).
Host web1
HostName 192.0.2.10
User anna
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 60
Host test
HostName test.example.com
User anna
Port 2222Nu is het gewoon:
anna@laptop:~$ ssh web1
anna@web1:~$Wat doen de regels?
- Host is de bijnaam die je zelf kiest. Je typt die achter
ssh,scpenrsync. - HostName is het echte adres: een IP-adres of een naam die in de DNS staat.
- User en Port zijn de gebruikersnaam en de poort, zodat je die niet meer hoeft te onthouden.
- IdentityFile wijst de sleutel aan. Handig als je meerdere sleutels hebt; zonder deze regel probeert ssh je standaardsleutels.
- ServerAliveInterval 60 stuurt elke 60 seconden een klein teken van leven. Veel thuisrouters en wifi-netwerken verbreken een stille verbinding na een paar minuten; hiermee blijft je sessie open.
Ook hier geldt dat de eerste waarde telt, net als bij de server. Zet algemene regels als Host * dus onderaan het bestand.
Bestanden kopiëren: scp, rsync en sftp
scp kopieert een bestand, met dezelfde vorm als cp, maar met host: ervoor:
anna@laptop:~$ scp backup.sql web1:/home/anna/
anna@laptop:~$ scp web1:/var/log/nginx/error.log .rsync is slimmer bij mappen en grote hoeveelheden: het stuurt alleen wat veranderd is, en kan een onderbroken kopie hervatten. Het moet op beide kanten geïnstalleerd zijn (apt install rsync).
anna@laptop:~$ rsync -avz --progress ./site/ web1:/var/www/example.com/Let op de slash achter ./site/: met slash kopieert rsync de inhoud van de map, zonder slash de map zelf (je krijgt dan /var/www/example.com/site/). Probeer bij twijfel eerst met --dry-run, en wees heel voorzichtig met --delete, dat aan de ontvangende kant alles weghaalt wat bij jou niet bestaat.
sftp en grafische programma's als FileZilla of WinSCP gebruiken dezelfde SSH-verbinding en dezelfde sleutel. Er is dus geen aparte FTP-server nodig. Een ouderwetse FTP-server op een VPS is af te raden: gewone FTP stuurt je wachtwoord onversleuteld over het netwerk.
Een tunnel in plaats van een open poort
Dit is misschien het nuttigste wat SSH kan. Stel: op je server draait een PostgreSQL-database. Je wilt er vanaf je laptop met een grafisch programma bij. De verleiding is groot om poort 5432 open te zetten naar internet. Doe dat niet: open databasepoorten zijn een van de grootste oorzaken van datalekken (les 10.2), en de cursus controleert later van buitenaf dat ze dicht zijn (opdracht Z5.1).
Met lokale port forwarding laat je SSH een tunnel maken:
anna@laptop:~$ ssh -L 5432:127.0.0.1:5432 web1Lees dat als: "luister op mijn laptop op poort 5432, en stuur alles wat daar binnenkomt door de SSH-verbinding naar 127.0.0.1:5432, gezien vanaf de server". Zolang deze sessie open is, verbind je je databaseprogramma met localhost poort 5432 op je eigen laptop, en kom je bij de database op de server uit.
Wat maakt dit zo goed?
- De database luistert alleen op
127.0.0.1op de server en is van buiten onbereikbaar. - De verbinding is versleuteld door SSH, ook als de database zelf geen versleuteling heeft.
- Alleen wie kan inloggen met SSH, kan erbij. Je gebruikt dus de sterke beveiliging die je al hebt.
Draait er op je laptop al iets op 5432, kies dan links een ander nummer: -L 15432:127.0.0.1:5432, en verbind met poort 15432. Zet je de tunnel in ~/.ssh/config, dan heb je hem altijd bij de hand:
Host web1-db
HostName 192.0.2.10
User anna
LocalForward 15432 127.0.0.1:5432Met ssh -N web1-db krijg je alleen de tunnel, zonder opdrachtregel.
Via een tussenserver: ProxyJump
Soms kun je een server alleen bereiken via een andere, bijvoorbeeld een databaseserver zonder publiek IP-adres achter je webserver. ProxyJump springt via de eerste server door naar de tweede:
Host db1
HostName 10.0.0.5
User anna
ProxyJump web1Het verschil met agent forwarding (les 2.1): bij ProxyJump loopt de versleuteling van begin tot eind tussen je laptop en db1. De tussenserver geeft alleen de pakketjes door en kan jouw sleutel niet gebruiken.
Een ander poortnummer: wel of niet?
Veel handleidingen raden aan SSH op een andere poort te zetten, bijvoorbeeld 2222. Wat doet dat echt?
- Het vermindert de ruis: de meeste geautomatiseerde raadpogingen proberen alleen poort 22. Je log wordt rustiger.
- Het is geen beveiliging. Een scanner die alle poorten afloopt, vindt SSH binnen seconden aan zijn versiebanner.
Met sleutels en wachtwoordlogin uit (les 2.2) maakt de poort voor de veiligheid weinig uit. Wil je toch wisselen, doe het dan in de goede volgorde: nieuwe poort openzetten in de firewall, SSH laten luisteren op beide poorten, testen in een tweede venster, pas dan de oude poort dicht. Op Ubuntu 24.04 en later horen daar systemctl daemon-reload en systemctl restart ssh.socket bij (les 2.2). Vergeet niet dat je aanbieder misschien ook een firewall heeft.
Toegang intrekken
Een oud-collega of een webbouwer had een sleutel op je server en werkt niet meer voor je? Toegang intrekken is eenvoudig, als je het bijhoudt:
- Bekijk alle sleutels:
ssh-keygen -lf ~/.ssh/authorized_keys, en doe dat voor elke gebruiker (ook/root/.ssh/authorized_keys). - Haal de regel van die persoon weg.
- Gebruikte hij een eigen gebruikersaccount, vergrendel dat dan (les 3.1) en kijk of hij in de groep
sudozat (les 3.2). - Heeft hij wachtwoorden gezien, zoals een databasewachtwoord in een configuratiebestand, vervang die dan ook.
Een gewone sleutel heeft geen vervaldatum. Wat je niet weghaalt, blijft werken, jaren later nog. Geef je iemand tijdelijk toegang, dan kun je vóór zijn regel in authorized_keys de optie expiry-time="20261231" zetten; na die datum weigert de server de sleutel.
Samenvatting
~/.ssh/configop je eigen computer bewaart per server de naam, gebruiker, poort en sleutel;Host *hoort onderaan.- scp voor losse bestanden, rsync voor mappen (let op de slash en op
--delete), sftp in plaats van FTP. - Met
ssh -Lbereik je een database via een versleutelde tunnel, terwijl de databasepoort van buiten dicht blijft. - ProxyJump springt veilig via een tussenserver; beter dan agent forwarding.
- Een ander poortnummer vermindert ruis, maar beveiligt niet. Sleutels die je niet weghaalt, blijven werken.
Quiz
Opdracht
Opdracht O2.3: Een SSH-config en een tunnel. Maak op je eigen computer een ~/.ssh/config met een bijnaam voor je server, log in met alleen ssh <bijnaam>, kopieer een bestand met scp of rsync, en maak een tunnel met -L naar een dienst die op je server alleen op 127.0.0.1 luistert (heb je nog geen database, gebruik dan poort 22 van de server zelf: ssh -L 2200:127.0.0.1:22 <bijnaam> en daarna ssh -p 2200 anna@localhost). Beantwoord de vragen over wat de tunnel doet en waarom de poort niet open hoeft.
Opdracht O2.3: Een SSH-config en een tunnel
Deze opdracht doe je zelf; niemand kijkt hem na. Vink af wat je gedaan hebt en markeer de opdracht als gedaan.
Je laptop luistert op de linkerpoort, het verkeer gaat versleuteld door SSH en komt op de server uit bij 127.0.0.1:<poort>. De dienst blijft van buiten onbereikbaar. Een andere SSH-poort geeft minder ruis in je log, maar is geen beveiliging; sleutels en wachtwoordlogin uit wel.
Je vinkjes en aantekeningen blijven alleen in deze browser; we sturen ze nergens heen. Ben je aangemeld, dan bewaren we in Mijn cursussen alleen dat je de opdracht gedaan hebt.
Verder lezen
De stappen in deze artikelen gelden voor de VPS'en en panelen van WebOké; bij andere aanbieders werkt het vergelijkbaar.
- Inloggen op je VPS met SSH (en een SSH-sleutel maken)
- Handleiding ssh_config (clientinstellingen): https://man.openbsd.org/ssh_config
- Handleiding ssh (opties
-L,-J,-N): https://man.openbsd.org/ssh
