Pierwsze 30 minut: lista kontrolna hartowania VPS
Świeży VPS dostaje pierwszy skan SSH w ciągu kilku minut od otrzymania IP. Oto dokładna sekwencja, którą uruchamiam na każdej nowej maszynie — gotowa do skopiowania dla Debiana 13, z tabelą kontrolną na końcu.
Założenia: świeży obraz Debian 13 z Twojego wdrożenia VPSRento, jesteś zalogowany jako root przez SSH, a przykładowy adres IP to 185.220.101.14 — podstaw swój. Całkowity czas: około pół godziny. Wykonuj kroki po kolei; krok 2 może Cię zablokować, jeśli się pospieszysz.
1. Utwórz użytkownika sudo
Praca jako root to sposób, w jaki literówki stają się incydentami. Utwórz prawdziwego użytkownika, daj mu sudo i rób wszystko z jego poziomu:
# create the user (you'll set a password — still useful for sudo)
adduser ops
# grant sudo
usermod -aG sudo ops
Wszystko poniżej tego punktu działa jako ops , chyba że zaznaczono inaczej.
2. Tylko klucze SSH — bez haseł, bez logowania root
Uwierzytelnianie hasłem to największa dziura w maszynie wystawionej na internet. Boty bombardują port 22 listami poświadczeń cały dzień, każdego dnia. Klucze eliminują całą tę klasę ataków. Na Twojej lokalnej maszynie:
# generate a keypair if you don't have one (ed25519, no passphrase tradeoff is yours)
ssh-keygen -t ed25519 -C "ops@atlas"
# push the public key to the server
ssh-copy-id [email protected]
Zweryfikuj, że możesz zalogować się kluczem w nowym terminal — ssh [email protected] — przed dotknięciem konfiguracji. Trzymaj istniejącą sesję root otwartą jako awaryjne wyjście. Następnie edytuj /etc/ssh/sshd_config:
# /etc/ssh/sshd_config — the three lines that matter
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-password
# validate the config, then reload (Debian 13 uses ssh.service)
sshd -t && systemctl reload ssh
prohibit-password zamiast płaskiego no dla roota celowo: root nadal może uwierzytelnić się kluczem z Twojej stacji roboczej, co bywa przydatne przy odzyskiwaniu przez konsolę dostawcy — ale żadne hasło nigdy nie zadziała, dla nikogo, skądkolwiek. Potwierdź za pomocą sshd -T | grep -E 'passwordauthentication|permitrootlogin'.
3. Zapora: domyślnie odmawiaj, zezwalaj tylko na to, co uruchamiasz
ufw w Debianie to cienka, sensowna warstwa nad nftables. Polityka to bezpieczeństwo; reguły to tylko wyjątki od niej:
apt update && apt install -y ufw
ufw default deny incoming
ufw default allow outgoing
# SSH stays open — add this BEFORE enabling
ufw allow 22/tcp comment 'SSH'
# whatever your box actually serves, e.g.:
ufw allow 80/tcp comment 'HTTP'
ufw allow 443/tcp comment 'HTTPS'
ufw enable
ufw status verbose
Każdy otwarty port powinien mieć nazwę i powód. Jeśli nie potrafisz nazwać, do czego służy port, nie dostaje reguły.
4. fail2ban: spowolnij boty do pełzania
Przy wyłączonym uwierzytelnianiu hasłem brute force już nie działa — ale fail2ban utrzymuje czytelne logi i banuje skanery, które szturchają wszystko inne:
apt install -y fail2ban
# /etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
maxretry = 5
findtime = 10m
bantime = 1h
systemctl enable --now fail2ban
# watch it work
fail2ban-client status sshd
5. Automatyczne aktualizacje bezpieczeństwa
Niezałatana luka CVE to większe ryzyko niż restart. unattended-upgrades w Debianie instaluje aktualizacje bezpieczeństwa samodzielnie:
apt install -y unattended-upgrades
# answer Yes to auto-install updates
dpkg-reconfigure -plow unattended-upgrades
Domyślna konfiguracja w /etc/apt/apt.conf.d/50unattended-upgrades pobiera tylko z repozytorium security — czyli dokładnie to, czego chcesz na serwerze: poprawki bezpieczeństwa automatycznie, wszystko inne, kiedy wybierzesz.
6. Wyłącz to, czego nie uruchamiasz
Każda działająca usługa to powierzchnia ataku, którą musisz łatać. Zobacz, co faktycznie nasłuchuje:
# who is listening, on what, as which process
ss -tulpn
# everything enabled at boot
systemctl list-unit-files --state=enabled
# example: you don't run a print server — nobody does
systemctl disable --now cups
Zasada: jeśli nie potrafisz powiedzieć, co robi nasłuch, dowiedz się, zanim pozwolisz mu żyć. Na minimalnym obrazie VPSRento powinno być bardzo niewiele poza sshd i Twoją własną aplikacją.
7. Opcjonalnie, ale zalecane: płaszczyzna zarządzania WireGuard
Najmocniejsza wersja bezpieczeństwa SSH to SSH, które w ogóle nie wystawia się na internet. Uruchom WireGuard na maszynie, zezwól na SSH tylko w tunelu, a port 22 zniknie z każdego skanera na ziemi:
apt install -y wireguard
# /etc/wireguard/wg0.conf — minimal management tunnel
# [Interface] Address = 10.8.0.1/24, ListenPort = 51820
# open the tunnel, not the shell
ufw allow 51820/udp comment 'WireGuard'
ufw allow in on wg0 to any port 22 proto tcp comment 'SSH via WG'
ufw delete allow 22/tcp
systemctl enable --now wg-quick@wg0
Po tym ssh [email protected] przez tunel, a publiczny adres IP odpowiada na dokładnie jednym porcie UDP. Pełny przewodnik po WireGuard — klucze, peerzy, konfiguracje klientów, kody QR na telefon — znajduje się w przewodniku towarzyszącym.
Lista kontrolna 10 punktów
Przejdź przez tę tabelę po każdym nowym wdrożeniu i ponownie po każdej dodanej usłudze:
| # | Element | Gdzie się znajduje | Zweryfikuj przez |
|---|---|---|---|
| 1 | Użytkownik sudo bez roota | /etc/passwd | id ops |
| 2 | Uwierzytelnianie SSH tylko kluczem | sshd_config | sshd -T | grep passwordauth |
| 3 | Logowanie roota hasłem wyłączone | sshd_config | sshd -T | grep permitrootlogin |
| 4 | Zapora sieciowa domyślnie odrzuca przychodzące | ufw | ufw status verbose |
| 5 | Tylko nazwane porty otwarte | ufw | ufw status numbered |
| 6 | fail2ban sshd jail aktywny | jail.local | fail2ban-client status sshd |
| 7 | Automatyczne aktualizacje bezpieczeństwa | apt | systemctl status unattended-upgrades |
| 8 | Brak niewyjaśnionych nasłuchów | — | ss -tulpn |
| 9 | Zarządzanie przez WireGuard (opcjonalnie) | wg0.conf | wg show |
| 10 | Snapshot po utwardzeniu | Dodatek w panelu klienta, $1.99/mies. | Usługi → Twój VPS → snapshoty |
Punkt 10 zasługuje na jedno zdanie: najpierw utwardź, potem snapshot, w tej kolejności — snapshot czystej, utwardzonej maszyny to Twój rollback na każdy przyszły błąd. Codzienne offsite snapshoty to dodatek za $1.99/mies. w panelu klienta. Trzydzieści minut prewencji, jeden klik ubezpieczenia.