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.

⚠️ Test nøglelogin FØR du deaktiverer passwords. Åbn en anden SSH-session i et separat terminalvindue inden du redigerer sshd_config. Så har du altid en aktiv session at falde tilbage på, hvis noget går galt.

Åbn SSH-konfigurationsfilen:

sudo nano /etc/ssh/sshd_config

Find og ændr (eller tilføj) disse linjer:

PasswordAuthentication no
KbdInteractiveAuthentication no
📝 OpenSSH version under 8.7: Hvis du bruger Raspberry Pi OS Bullseye eller ældre, hedder direktivet 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
💡 Brug port-variablen: Hvis du har skiftet SSH-port, erstat 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
⚠️ Genstart altid SSH efter ændringer. Kør 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