🔍

Keményítés — a tzlab-szerver megerősítése

A szerver már működik, mindhárom eszközödről belépsz kulccsal. Most bezárjuk az összes felesleges ajtót: root-tiltás, tűzfal, fail2ban, automata frissítések, mentés. Ugyanaz az álszerver: tzlab-szerver · 203.0.113.45 — minden adat kitalált.

  1. A helyes sorrend — előbb a mentőöv
  2. Root SSH-belépés tiltása
  3. Csak-kulcs belépés véglegesítése
  4. ufw tűzfal — a kizárás-csapdával
  5. fail2ban — a próbálkozók kitiltása
  6. Automata biztonsági frissítések
  7. SSH-port csere — kell egyáltalán?
  8. Snapshot és mentés
  9. Monitorozás — ki próbálkozott?
  10. Záró checklist + sorrend

0.A helyes sorrend — előbb a mentőöv, aztán a lakat

A keményítés aranyszabálya Minden lépés, amit itt megteszel, ajtókat zár be — köztük olyat is, amin te magad járnál be, ha valami félremegy. Ezért a sorrend nem ízlés kérdése: előbb győződj meg róla, hogy minden mentőöved működik (kulcsos belépés mindhárom eszközről tesztelve, root break-glass jelszó él, DO recovery konzol kipróbálva), és csak utána kezdj zárni. Plusz a régi szabály: minden SSH-módosításnál nyitva hagyott második terminál + sudo sshd -t.

Az ajánlott sorrend — a doksi is ebben halad:

#LépésMiért ez a helye
0Mentőövek ellenőrzéseMinden további lépés erre támaszkodik
1Root SSH-tiltásElőfeltétele a működő sudo-user
2Csak-kulcs belépésElőfeltétele a tesztelt kulcs minden eszközön
3ufw tűzfalSSH-szabály ELŐBB, csak utána bekapcsolás!
4fail2banA tűzfalra épül, azt használja tiltásra
5Automata frissítésekFüggetlen, bármikor mehet
6SnapshotA kész, keményített állapotot mented el

1.Root SSH-belépés tiltása

Miért: a robotok 99%-a a root nevet próbálgatja, mert az minden Linuxon létezik. Ha a root egyáltalán nem léphet be SSH-n, a támadónak már a felhasználónevet is találgatnia kell, nem csak a titkot. Te a zoltan userrel dolgozol, és ha root kell, sudo-zol.

Előfeltétel-ellenőrzés (tényleg megy a sudo-user?):

zoltan@tzlab-szerver:~$ sudo whoami
root   # ha ezt látod, a zoltan user teljes értékű admin — jöhet a tiltás

Beállítás — saját drop-in fájlba tesszük, ami a cloud-init fájl UTÁN töltődik be (a fájlok név szerinti sorrendben olvasódnak, és azonos direktívánál az első nyer — ezért ellenőrizd, hogy a cloud-init drop-in nem mondja-e felül; ha igen, abban állítsd):

zoltan@tzlab-szerver:~$ sudo nano /etc/ssh/sshd_config.d/60-hardening.conf
PermitRootLogin no        # root SSH-n egyáltalán nem léphet be
zoltan@tzlab-szerver:~$ sudo sshd -t && sudo systemctl restart ssh
# új ablakból teszt: zoltan mehet, root már nem
Fokozatok, ha kellene még a rootPermitRootLogin prohibit-password = root csak kulccsal (jelszóval nem) — ez a DO-image-ek gyakori alapértelmezése. A no a szigorúbb és az ajánlott végállapot. A DO webes/recovery konzolt a tiltás NEM érinti — az nem SSH.

2.Csak-kulcs belépés véglegesítése

Ezt a Gyakorlat 6. pontjában már felépítetted — itt csak véglegesítjük és ellenőrizzük. A cél-állapot a drop-inban:

PasswordAuthentication no
PubkeyAuthentication yes
KbdInteractiveAuthentication no    # a jelszókérés „interaktív" kiskapuja is zárva

Ellenőrzés, hogy a ténylegesen ÉRVÉNYES beállítás mi (drop-inok összefésülve):

zoltan@tzlab-szerver:~$ sudo sshd -T | grep -Ei 'passwordauth|permitroot|pubkey'
permitrootlogin no
pubkeyauthentication yes
passwordauthentication no
Az sshd -T a barátodNem azt mutatja, mit írtál a fájlokba, hanem amit az sshd ténylegesen alkalmaz az összes config összefésülése után. Drop-in-zavarnál ez a leggyorsabb diagnózis.

3.ufw tűzfal — és a klasszikus kizárás-csapda

Az ufw (Uncomplicated Firewall) elve: alapból minden bejövő tilos, és csak azt engeded, amire tényleg szükség van. Egy webszervernél ez tipikusan három dolog: SSH (22), HTTP (80), HTTPS (443).

A csapda: ufw enable az SSH-szabály ELŐTTHa úgy kapcsolod be a tűzfalat, hogy az SSH-t még nem engedted, a következő pillanatban minden élő és jövőbeli SSH-kapcsolat elhal — magadat zártad ki. A sorrend szent: először allow SSH, utána enable. (Ha mégis megtörténne: DO recovery konzol + root jelszó, és onnan ufw disable.)
# 1) alapszabályok: bejövő tilos, kimenő szabad
zoltan@tzlab-szerver:~$ sudo ufw default deny incoming
zoltan@tzlab-szerver:~$ sudo ufw default allow outgoing

# 2) ELŐSZÖR az SSH — e nélkül ne menj tovább!
zoltan@tzlab-szerver:~$ sudo ufw allow OpenSSH        # = 22/tcp

# 3) web, ha van rajta weboldal (Caddy):
zoltan@tzlab-szerver:~$ sudo ufw allow 80/tcp
zoltan@tzlab-szerver:~$ sudo ufw allow 443/tcp

# 4) és csak MOST a bekapcsolás:
zoltan@tzlab-szerver:~$ sudo ufw enable
Firewall is active and enabled on system startup

# 5) ellenőrzés:
zoltan@tzlab-szerver:~$ sudo ufw status verbose
To             Action   From
--             ------   ----
OpenSSH        ALLOW IN Anywhere
80/tcp         ALLOW IN Anywhere
443/tcp        ALLOW IN Anywhere

Ha egy szolgáltatást (pl. PostgreSQL, 5432) csak a szerveren belülről használsz, azt ne engedd kifelé — a „nem nyitott port" a legjobb tűzfalszabály.

4.fail2ban — a próbálkozók automatikus kitiltása

Mit csinál: figyeli a naplókat (pl. az SSH sikertelen belépéseit), és aki rövid időn belül sokszor hibázik, annak az IP-jét automatikusan kitiltja a tűzfalon, adott időre. A jelszó-próbálgató robotok ellen ez a második védvonal (az első a csak-kulcs belépés — kulcsnál eleve esélyük sincs, de a zaj így is csökken).

zoltan@tzlab-szerver:~$ sudo apt update && sudo apt install fail2ban

# a beállítást SOSE a jail.conf-ban módosítsd (frissítéskor felülíródik),
# hanem saját jail.local fájlban:
zoltan@tzlab-szerver:~$ sudo nano /etc/fail2ban/jail.local
[sshd]
enabled = true
maxretry = 5        # ennyi hiba után tilt
findtime = 10m      # ennyi időn belül számolja a hibákat
bantime = 1h        # ennyi időre tilt (lehet 1d, 1w is)
zoltan@tzlab-szerver:~$ sudo systemctl restart fail2ban

# státusz — hány IP van épp kitiltva:
zoltan@tzlab-szerver:~$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Currently failed: 2
`- Currently banned: 14

# ha véletlenül SAJÁT magad tiltottad ki (pl. elgépelt passphrase sokszor):
zoltan@tzlab-szerver:~$ sudo fail2ban-client set sshd unbanip 198.51.100.7
Magadat is kitilthatodHa egy eszközödről ötször elrontod a belépést, a fail2ban téged is bannol — ilyenkor másik hálózatról (pl. telefon mobilnet) lépsz be és unbanip, vagy DO konzol. Megelőzés: a saját fix IP-d felveheted az ignoreip listára a jail.local-ban.

5.Automata biztonsági frissítések

A legtöbb betörés nem zseniális hack, hanem ismert, javított hiba kihasználása olyan gépen, ahol nem telepítették a javítást. Az unattended-upgrades a biztonsági frissítéseket magától felteszi:

zoltan@tzlab-szerver:~$ sudo apt install unattended-upgrades
zoltan@tzlab-szerver:~$ sudo dpkg-reconfigure -plow unattended-upgrades
# a megjelenő kérdésre: Yes

# ellenőrzés, hogy fut-e:
zoltan@tzlab-szerver:~$ systemctl status unattended-upgrades
Mit NEM csinálCsak a biztonsági csomagfrissítéseket teszi fel — a nagy verzióugrásokat (pl. PostgreSQL 16→17, Ubuntu-upgrade) nem, azok maradnak a te döntésed. Kernel-frissítés után néha újraindítás kell: a /var/run/reboot-required fájl jelzi.

6.SSH-port csere — kell egyáltalán?

Népszerű tanács a 22-es port lecserélése (pl. 2222-re). Őszintén a mérleg:

A mi értékelésünk: csak-kulcs belépés + fail2ban mellett a portcsere opcionális kényelmi lépés, nem biztonsági alap. Ha mégis:

# 1) ELŐBB a tűzfalon engedd az új portot (különben kizárod magad!):
zoltan@tzlab-szerver:~$ sudo ufw allow 2222/tcp
# 2) a drop-inba:  Port 2222   →  sshd -t  →  restart
# 3) teszt ÚJ ablakból:
zoltan@notebook:~$ ssh -p 2222 zoltan@203.0.113.45
# 4) ha megy, a 22-es szabályt törölheted:  sudo ufw delete allow OpenSSH

7.Snapshot és mentés — a keményítés is ér valamit csak visszaállíthatóan

Két külön dolog, ne keverd:

7/a. Droplet snapshot (teljes gép-pillanatkép)

A DO panelen: Droplet → Snapshots → Take snapshot. A teljes lemez állapotát menti — ebből egy kattintással új, ugyanilyen szervert tudsz indítani. Konzisztensebb, ha a mentés idejére leállítod a gépet (sudo poweroff, snapshot, majd panelről Power On), de élő gépről is működik. Mikor: a most elkészült, keményített alapállapotról egyet mindenképp; utána nagyobb változtatások előtt.

7/b. Adat-mentés (ami tényleg pótolhatatlan)

A snapshot a DO-fiókodon belül él — ha a fiókod sérül, az is. A pótolhatatlan adatnak (adatbázis-dump, feltöltött fájlok) legyen fiókon kívüli másolata is, például naponta:

# PostgreSQL-dump (a TZlab-stackben ez az érték):
zoltan@tzlab-szerver:~$ pg_dump -U projekt_user projekt_db | gzip > /home/zoltan/backup/projekt_$(date +%F).sql.gz
# és ezt letöltöd/elszinkronizálod egy másik helyre (scp, rclone, object storage)
ÖkölszabálySnapshot = a gép visszaállítására. Dump/fájlmentés = az adat túlélésére, a fiókodtól függetlenül. A kettő együtt ér mentést.

8.Monitorozás — ki próbálkozott, mi történt?

# sikertelen belépési kísérletek (látni fogod, mennyi robot dörömböl):
zoltan@tzlab-szerver:~$ sudo lastb | head -20

# sikeres belépések — a TE eszközeid, időpontokkal:
zoltan@tzlab-szerver:~$ last | head -10

# az SSH-szolgáltatás naplója élőben:
zoltan@tzlab-szerver:~$ sudo journalctl -u ssh -f

# fail2ban éppen kiket tilt:
zoltan@tzlab-szerver:~$ sudo fail2ban-client status sshd

Havonta egy pillantás elég: a lastb tele lesz robotokkal (ez normális, ezért a fail2ban), a last-ban viszont csak a saját belépéseidet szabad látnod. Ismeretlen sikeres belépés = azonnali kulcs-audit.

9.Záró checklist — a keményített tzlab-szerver

Ha ez megvan: → Teszt 3 — Keményítés, majd → Edzőpálya 3, ahol be is gépeled az egészet.