Hvorfor SSH hardening?
Raspberry Pi OS aktiverer SSH som standard siden version November 2016, dog med krav om password ved første login. Standardindstillingen tillader password-baseret login. Det betyder at hvem som helst der kan nå port 22 på din Pi, kan prøve at gætte sig ind.
Det lyder måske abstrakt. Men scanner-trafik på port 22 er konstant. Shodans data viser millioner af SSH-servere der scanner hinanden. Shodan og lignende systemer indekserer dit netværk inden du er færdig med at sætte det op, hvis din IP er eksponeret.
Det er ikke paranoia. Det er statistik. Og det er nemt at gøre noget ved det.
Tjek SSH-status
Bekræft at SSH kører, og at port 22 lytter:
sudo systemctl status ssh
Du bør se active (running). Tjek hvilken port der lytter:
sudo ss -tlnp | grep 22
Output bør vise noget i stil med 0.0.0.0:22 eller :::22. Det bekræfter at SSH accepterer forbindelser på alle interfaces.
Tjek også hvilken OpenSSH-version du kører:
ssh -V
Raspberry Pi OS Bookworm (den aktuelle version) leverer OpenSSH 9.2. Det er relevant fordi navnene på et par direktiver ændrede sig i version 8.7.
Nøglebaseret login
Det her er det vigtigste trin. Nøglebaseret login er sikrere end passwords på alle måder. Et Ed25519-nøglepar er lille, hurtigt og modstandsdygtigt mod brute-force.
Kør dette på din lokale maskine, ikke på Pi'en:
ssh-keygen -t ed25519 -C "pi-homelab-2025"
-C er en kommentar. Skriv noget der giver mening for dig. Du bliver spurgt om en passphrase. Brug en. Det krypterer din private nøgle, så den er ubrugelig selvom nogen kopierer filen.
Standard placering er ~/.ssh/id_ed25519 (privat) og ~/.ssh/id_ed25519.pub (offentlig). Kopier den offentlige nøgle til Pi'en:
ssh-copy-id -i ~/.ssh/id_ed25519.pub pi@[din-pi-ip]
Kommandoen tilføjer din offentlige nøgle til ~/.ssh/authorized_keys på Pi'en. Test at det virker inden du deaktiverer password-login:
ssh -i ~/.ssh/id_ed25519 pi@[din-pi-ip]
Virker det uden password (eller med passphrase), er du klar til næste trin.
Åbn SSH-konfigurationsfilen:
sudo nano /etc/ssh/sshd_config
Find og ændr (eller tilføj) disse linjer:
PasswordAuthentication no
KbdInteractiveAuthentication no
ChallengeResponseAuthentication no i stedet for KbdInteractiveAuthentication no. Begge virker på nyere versioner som et alias, men vær præcis.
Genstart SSH for at aktivere ændringerne:
sudo systemctl restart ssh
Test igen fra din anden terminal. Prøv nu at forbinde uden nøgle. Det bør afvises.
Skift SSH-port (valgfrit)
At flytte SSH fra port 22 til fx 2222 er ikke en sikkerhedsforanstaltning i sig selv. En scanner der kigger grundigt, finder din SSH uanset hvilken port den sidder på. Men det reducerer scan-støjen markant. De fleste automatiserede bots scanner kun port 22 og giver op, hvis der ikke er noget der.
I /etc/ssh/sshd_config:
Port 2222
Opdater din UFW-regel inden du genstarter SSH:
sudo ufw allow 2222/tcp
sudo ufw delete allow 22/tcp # fjern den gamle regel bagefter
Husk at specificere porten når du forbinder:
ssh -p 2222 pi@[din-pi-ip]
Eller tilføj det til ~/.ssh/config på din lokale maskine, så du slipper for at skrive det hver gang:
Host min-pi
HostName [din-pi-ip]
User pi
Port 2222
IdentityFile ~/.ssh/id_ed25519
Derefter er det bare ssh min-pi.
Deaktiver root-login
Root-brugeren eksisterer på alle Linux-systemer og har det samme brugernavn overalt. Det gør den til et oplagt mål. Deaktiver direkte root-login via SSH:
PermitRootLogin no
På Raspberry Pi OS er root-login typisk allerede deaktiveret eller begrænset til prohibit-password. Sæt det eksplicit til no.
Tillad kun specifikke brugere
Begræns hvem der overhovedet kan logge ind via SSH. Direktiver husk brugernavn fra Pi'en, som standard er det pi:
AllowUsers pi
Har du oprettet en anden bruger til dit hjemmelab, brug det navn i stedet. Vil du tillade flere brugere, adskil med mellemrum: AllowUsers pi admin.
Dette direktiv blokerer alle andre brugernavne, selv hvis de eksisterer på systemet. Det er en ekstra barriere oven på nøgleautentifikation.
fail2ban
fail2ban overvåger logfiler og blokerer IP-adresser der laver for mange fejlede loginforsøg. Selv med nøglebaseret login er det en god idé. Det holder logs rene og stopper vedvarende scannere.
Installer:
sudo apt update && sudo apt install -y fail2ban
fail2ban leveres med en standard /etc/fail2ban/jail.conf. Rediger ikke den fil direkte. Opret i stedet en lokal override:
sudo nano /etc/fail2ban/jail.local
Tilføj dette indhold:
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 3
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = %(sshd_log)s
backend = %(sshd_backend)s
port = ssh med port = 2222 (eller din valgte port). ssh som værdi opslås i /etc/services og matcher kun port 22.
Start og aktiver fail2ban:
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
Tjek at SSH-jail er aktiv:
sudo fail2ban-client status sshd
Output viser antal aktive bans og listen over bannede IP-adresser. En ny installation viser typisk nul bans. Det er fint. Det ændrer sig hurtigt, hvis din IP er eksponeret.
Fjern en ban manuelt, hvis du fejlagtigt låser dig selv ude:
sudo fail2ban-client set sshd unbanip [ip-adresse]
UFW integration
Har du UFW aktiveret (se UFW-guiden), tilføj en rate-limiting regel på SSH-porten:
sudo ufw limit ssh
Det blokerer IP-adresser der forsøger mere end 6 forbindelser pr. 30 sekunder. Det er ikke en erstatning for fail2ban, men det filtrerer det grofteste scan-støj ved pakkefiltreringslaget, inden det overhovedet når SSH-daemonen.
Eller begræns SSH til kun dit LAN-subnet:
sudo ufw allow from 192.168.1.0/24 to any port 22
Tilpas subnet til dit netværk. Kør ip route for at finde det. Det er den mest restriktive mulighed, men kun praktisk hvis du aldrig har brug for SSH fra udenfor dit LAN.
Komplet /etc/ssh/sshd_config eksempel
Her er en samlet konfiguration med alle anbefalede indstillinger. Tilpas port og brugernavn til dit setup:
# /etc/ssh/sshd_config
# SSH hardening til Raspberry Pi / Debian-baseret Linux
# Skift port for at reducere scan-støj (valgfrit)
Port 2222
# Adresser
AddressFamily any
ListenAddress 0.0.0.0
ListenAddress ::
# Autentifikation
PermitRootLogin no
MaxAuthTries 3
MaxSessions 3
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
KbdInteractiveAuthentication no
# Gammel alias (OpenSSH < 8.7): ChallengeResponseAuthentication no
UsePAM yes
# Begræns adgang til specifikke brugere
AllowUsers pi
# Timeouts
LoginGraceTime 20
ClientAliveInterval 300
ClientAliveCountMax 2
# Deaktiver unødvendige funktioner
X11Forwarding no
PrintMotd no
AcceptEnv LANG LC_*
# SFTP subsystem (fjern linjen hvis du ikke bruger det)
Subsystem sftp /usr/lib/openssh/sftp-server
sudo systemctl restart ssh. Har du en aktiv SSH-session, afbrydes den ikke af genstarten. Men test altid fra en ny forbindelse, inden du lukker din eksisterende session.
Verificér
Tjek din SSH-konfiguration for svage algoritmer og forældet opsætning med ssh-audit:
# Installer ssh-audit (Python-baseret)
pip3 install ssh-audit
# Kør mod din Pi
ssh-audit [din-pi-ip]
Alternativt via pipx for at undgå systemwide Python-konflikter:
pipx install ssh-audit
ssh-audit [din-pi-ip]
ssh-audit rapporterer om svage krypteringsalgoritmer, forældet key exchange og potentielle konfigurationsproblemer. Du behøver ikke grøn på alt, men kritiske fund bør lukkes.
Tjek også udefra med nmap fra en anden maskine på LAN:
nmap -p 22 [din-pi-ip]
# Eller på ny port:
nmap -p 2222 [din-pi-ip]
En korrekt konfigureret Pi med UFW aktiv viser open på den tilladte port og filtered på port 22, hvis du har skiftet port.
Test eksplicit at password-login er deaktiveret:
ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no pi@[din-pi-ip]
Du bør få Permission denied (publickey) eller lignende. Får du en password-prompt, er PasswordAuthentication no ikke slået til.
Hvad SSH hardening ikke gør
SSH hardening beskytter selve loginlaget. Det erstatter ikke netværkssegmentering. En angriber der allerede er på dit LAN, kan stadig nå port 22 med dine UFW LAN-regler åbne.
Det erstatter ikke en VPN til fjernadgang. Vil du have SSH tilgængeligt udefra på en sikker måde, er WireGuard det rigtige valg. Ikke portforwarding.
fail2ban og UFW rate limiting beskytter mod brute-force. De beskytter ikke mod en angriber der har din private nøgle. Hold din private nøgle på den maskine den hører hjemme på. Brug passphrase.
Hold din Pi opdateret. SSH hardening er meningsløst hvis der sidder et upatchet system bag ved. Kør regelmæssigt:
sudo apt update && sudo apt upgrade -y
Ofte stillede spørgsmål
Hvad sker der hvis jeg låser mig selv ude?
Hold altid en aktiv SSH-session åben mens du tester nye regler. En igangværende session afbrydes ikke af en genstart af SSH-tjenesten. Alternativt tilslut et tastatur og en skærm direkte til Pi'en og log ind lokalt.
Skal jeg skifte SSH-porten fra 22?
Portskiftet fjerner ikke angrebsfladen, men eliminerer 99% af automatisk scan-støj fra bots der kører mod port 22. Det er en hurtig gevinst med minimal risiko. Kombiner det med nøglebaseret login, og porten er næsten ligegyldig.
Er Fail2ban nødvendigt hvis jeg allerede bruger SSH-nøgler?
Strengt taget nej. En angriber uden din private nøgle kommer ikke ind uanset antal forsøg. Fail2ban reducerer logstøjen og beskytter andre services som Nginx og Nextcloud der kører på samme server. Det er et billigt ekstralag.
Kilder
- sshd_config(5) – OpenBSD manual pages: autoritativ reference for alle sshd_config-direktiver og standardværdier
- CIS Benchmark for Debian Linux – Center for Internet Security: konkrete SSH-hærdenanbefalinger med rationale bag hver indstilling
- fail2ban dokumentation – konfigurationsreference: komplet reference for jail.local, filtre og banaction-konfiguration