Det här sätter du upp
En ny server hittas inom några timmar. Vår testserver loggade sin första lösenordsgissning mindre än tre timmar efter att den kom online, och 1 636 under sitt första dygn, från 11 adresser. De flesta försökte logga in som root.
Stegen tar omkring 15 minuter, och alla andra guider här bygger på en server som är uppsatt så här:
- du loggar in med en nyckel i stället för ett lösenord,
- servern slutar ta emot lösenord över SSH, så att ingen kommer in genom att gissa ett,
- säkerhetsuppdateringar installeras automatiskt varje dag, och
- en brandvägg, ufw, håller alla portar som du inte har öppnat stängda.
Varje steg nedan har körts på en nyinstallerad server hos Melonslab med Debian 13, och kontrollerats igen efter en omstart.
Innan du börjar
Du behöver en server med Debian 13 och dess root-lösenord. Har du inte loggat in på den än visar anslutningsguiden hur. Exemplen använder 203.0.113.10 som din servers IPv4-adress. Byt ut den mot din egen genomgående.
Om något går fel kommer du alltid in via konsolen: öppna din server i kundportalen och välj Open console på fliken Server. Den visar serverns skärm som om du stod vid den, och fungerar utan SSH och nätverk.
1. Logga in med en nyckel
Skapa en nyckel på din egen dator, i en terminal (på Windows i PowerShell):
ssh-keygen -t ed25519
Tryck på Enter för att behålla den föreslagna filen, och välj en lösenfras: den skyddar nyckeln om någon kopierar den från din dator. Det skapar två filer: id_ed25519 är den privata nyckeln, som aldrig lämnar din dator, och id_ed25519.pub är den publika nyckeln, som hamnar på servern.
Kopiera den publika nyckeln till servern. Det är sista gången du skriver serverns root-lösenord:
ssh-copy-id root@203.0.113.10
Windows har inget ssh-copy-id. Kör det här i PowerShell i stället:
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh root@203.0.113.10 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
Logga nu in:
ssh root@203.0.113.10
Frågar den efter nyckelns lösenfras och inte efter serverns lösenord, så fungerar nyckeln.
2. Stäng av inloggning med lösenord
Håll den här sessionen öppen till slutet av steget. Om en ändring går fel kan du fortfarande ångra den här.
Skapa /etc/ssh/sshd_config.d/10-keys-only.conf:
# Log in with keys only. Named 10- so it is read before 50-cloud-init.conf,
# whose PasswordAuthentication yes would otherwise win.
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-password
Katalogen har redan en fil, 50-cloud-init.conf, som slår på inloggning med lösenord. SSH läser filerna i namnordning och använder det första värdet den hittar för varje inställning, så en fil vars namn börjar med 10 läses först och får företräde. PermitRootLogin prohibit-password släpper fortfarande in root med en nyckel.
Kontrollera konfigurationen och tillämpa den:
sshd -t && systemctl reload ssh
sshd -t skriver bara ut något om det finns ett fel, och SSH laddas bara om när det inte finns några fel. Så här ser du vilka inställningar SSH nu använder:
sshd -T | grep -E '^(passwordauthentication|kbdinteractiveauthentication|permitrootlogin) '
permitrootlogin without-password
passwordauthentication no
kbdinteractiveauthentication no
without-password är ett äldre namn för prohibit-password. Öppna nu en andra terminal och logga in igen med ssh root@203.0.113.10. När det fungerar kan du stänga den första sessionen.
För att kontrollera att lösenord nekas ber du SSH att inte använda din nyckel:
ssh -o PubkeyAuthentication=no root@203.0.113.10
SSH svarar Permission denied (publickey). utan att fråga efter något lösenord.
Du behöver inte Fail2ban för SSH nu. Gissningar kan inte längre lyckas, de fyller bara loggen.
3. Installera säkerhetsuppdateringar automatiskt
apt update
apt install -y unattended-upgrades curl
Kommandot installerar också curl, som många av våra guider använder för att hämta filer och testa webbservrar: det finns inte på en nyinstallerad server. Att installera unattended-upgrades slår inte på det. Skapa /etc/apt/apt.conf.d/20auto-upgrades:
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
Servern hämtar nu paketlistorna och installerar uppdateringar från Debian och Debians säkerhetsteam en gång om dagen, på morgonen. Så här ser du vad den skulle göra, utan att installera något:
unattended-upgrade --dry-run --debug 2>&1 | grep -E 'Allowed origins|No packages'
Den första raden har label=Debian-Security bland källorna den installerar från. systemctl list-timers apt-daily-upgrade.timer visar när den körs nästa gång.
En ny kärna används först efter en omstart. Vill du att servern ska starta om av sig själv klockan 04:00 när en uppdatering kräver det, skapar du /etc/apt/apt.conf.d/52unattended-upgrades-local:
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "04:00";
Appar som är uppsatta som i våra andra guider startar igen av sig själva efter en omstart. Vill du hellre starta om själv, hoppa över den här filen: filen /run/reboot-required dyker upp när en uppdatering väntar på en omstart.
4. Öppna bara portarna du använder
Debian har ingen brandvägg från början, så varje program som lyssnar på en port kan nås från internet. ufw, förkortning för "uncomplicated firewall", blockerar allt som kommer in utom det du tillåter, för både IPv4 och IPv6.
Installera den, och tillåt SSH innan du slår på den, annars låser du ute dig själv:
apt install -y ufw
ufw allow 22/tcp
Om servern ska köra webbplatser, tillåt också HTTP och HTTPS. HTTPS använder UDP utöver TCP för HTTP/3:
ufw allow 80,443/tcp
ufw allow 443/udp
Slå sedan på den. Den varnar för att SSH-anslutningar kan avbrytas: svara y. Regeln för port 22 håller din öppen.
ufw enable
ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
80,443/tcp ALLOW IN Anywhere
443/udp ALLOW IN Anywhere
22/tcp (v6) ALLOW IN Anywhere (v6)
80,443/tcp (v6) ALLOW IN Anywhere (v6)
443/udp (v6) ALLOW IN Anywhere (v6)
ufw startar igen efter en omstart med samma regler. För att ta bort en regel skriver du samma regel efter ufw delete, till exempel ufw delete allow 443/udp.
Regler för våra andra guider
| Guide | Kör |
|---|---|
| WireGuard-VPN | ufw allow 51820/udp och ufw route allow in on wg0 out on eth0 |
| DNS med Unbound, för VPN-enheter | ufw allow in on wg0 |
| Matrix-samtal | ufw allow 7881/tcp och ufw allow 7882/udp, och för coturn ufw allow 3478 och ufw allow 49152:65535/udp |
| Stalwart-mailserver | ufw allow 25,465,993,995/tcp |
| Git-server med Forgejo | ufw allow 2222/tcp |
| Headscale | ufw allow 3478/udp |
| Zabbix | ufw allow from 198.51.100.30 to any port 10051 proto tcp, en gång för varje server du övervakar |
| FreeRADIUS | ufw allow from 198.51.100.20 to any port 1812:1813 proto udp, med kontorets adress |
| Postfix-mailserver | ufw allow 25,80,587,993/tcp, med 80 för förnyelse av certifikatet |
| Minecraft-server | ufw allow 25565/tcp |
| Asterisk | ufw allow 5061/tcp och ufw allow 10000:20000/udp |
| Pelican och Pterodactyl | ufw allow 8080,2022/tcp, för Wings |
| Jitsi Meet | ufw allow 10000/udp, ufw allow 3478/udp och ufw allow 5349/tcp |
| AdGuard Home | ufw allow 853/tcp och ufw allow in on wg0 |
WireGuard behöver två regler: en låter enheterna ansluta, och route-regeln låter deras trafik passera via servern ut på internet, vilket ufw blockerar som standard.
Rootless Podman-containrar, som i Podman-guiden, följer samma regler som alla andra program: en port de publicerar mot internet förblir stängd tills du tillåter den. Portar som bara publiceras på 127.0.0.1, som i våra appguider bakom Caddy, kan aldrig nås utifrån.
5. Kontrollera vad som lyssnar
ss -tulpn
Det listar varje program som lyssnar på en port. En lokal adress som 0.0.0.0, [::] eller * betyder alla adresser, som ufw håller stängda om du inte har tillåtit porten. 127.0.0.1 och [::1] kan bara nås från själva servern. Hittar du något du inte använder, ta bort det hellre än att lämna det åt brandväggen.
Felsökning
Du är utelåst. Välj Open console i kundportalen och logga in som root med lösenordet. Därifrån stänger ufw disable av brandväggen, och om du tar bort /etc/ssh/sshd_config.d/10-keys-only.conf och kör systemctl reload ssh slås inloggning med lösenord på igen. Har du också tappat bort root-lösenordet kan du sätta ett nytt under Root password på samma flik.
Permission denied (publickey) från din egen dator. Servern godtog inte din nyckel. Kontrollera att du loggar in som root från datorn där du skapade nyckeln i steg 1. Använder du en annan dator, lägg till dess publika nyckel i /root/.ssh/authorized_keys från en session som fungerar, eller från konsolen.
Enheter på VPN:en tappar internet efter ufw enable. route-regeln för WireGuard saknas. Tappar de DNS men inte internet är det regeln för Unbound som saknas. Båda finns i tabellen ovan.
En webbplats eller app slutar svara. Dess port är inte tillåten. ss -tulpn visar vilken port den lyssnar på.