Hogyan változtathatjuk meg SSH kiszolgálónk alapértelmezett 22-es tcp portját Debian vagy Ubuntu Linux szerverünkön a nagyobb biztonság érdekében?

botond küldte be 2022. 10. 23., v – 08:10 időpontban

Tartalom

 

Bevezető

Többféle módja van a webszerverek és egyéb kiszolgálók távoli menedzselésének, amik közül az SSH a legelterjedtebb a parancssori megoldások közül. Az SSH  protokoll egy titkosított csatornán kommunikál a kiszolgáló és a kliens között. Mint minden hasonló kommunikáció, az SSH is egy adott porton keresztül továbbítja az adatokat, ami alapértelmezetten a közismert 22-es tcp port. Mivel ennek a portnak a funkcióját nagyon sokan ismerik, emiatt a kiszolgálók rendszeres támadásnak vannak kitéve. Szerverünk ennek ellenére biztonságban van, mivel ez egy erősen titkosított csatorna. Azonban ha sok támadási kísérlet / próbálkozás éri kiszolgálónkat, akkor feleslegesen növelik a hálózati forgalmat, valamint használják szerverünk erőforrásait. Ezt úgy szokták elkerülni - vagy legalábbis csökkenteni -, hogy ezt az ismert portot átállítják egy másik, ismeretlen portszámra, amit csak port letapogatással (port scanning) lehet felderíteni, ami időigényesebb feladat, mivel akár töb tízezer portot kell ilyenkor végigjárni és lekérdezgetni. A támadási kísérleteket, illetve a felderítéseket többnyire robotok végzik, amik általában csak a különféle szolgáltatások ismert, alapértelmezett portjain keresztül próbálkoznak, és sok esetben nem indítanak port scannelést, hanem mennek a következő kiszolgálóra, mint célpontra, amennyiben nem találnak nyitott portokat. Ezért tehát az egyedi portok használata hatékony védelmet nyújthat a támadások zömével szemben.

Természetesen ennél nagyobb védelmet biztosít az SSH kiszolgálónk számára ha nyilvános kulcsos belépést használunk és letiltjuk a jelszó alapú belépési lehetőséget, azonban ha ez nem megoldható a saját szituációnkban, akkor az egyedi portszám használata is jó megoldást jelenthet.

Ebben a rövid leírásban megnézzük, hogyan állíthatjuk át az SSH ismert 22-es TCP portját egy egyedi portszámra, hogy minimalizáljuk az SSH-n keresztül történő támadási kísérletek számát.

 

 

Portok áttekintése

Még mielőtt bármit is csinálnánk, fontos betekintenünk egy kicsit a portok világába, hogy ne okozzunk rendszerünkben véletlenül galibát. Ezért célszerű átnézni az alábbi, a témához szorosan kapcsolódó (új ablakban nyíló) leírást:

Vegyük tehát figyelembe, hogy egy Linux operációs rendszerben több szolgáltatás is működhet, pláne egy összetettebb webszerver telepítésen. Ezért a megfelelő port megválasztásánál legyünk körültekintők, hogy nem ütközik-e más szolgáltatások portszámával.

Egyedi port beállításához célszerű minél magasabb portszámot választani, mert a portletapogatások (port scanning) általában 0-tól indulva felfelé haladnak, így egy magasabb értékre beállított portot több ideig tart megtalálnia a támadónak. Persze ez nem jelenti azt, hogy nem találnak rá a portra, hanem csak ezzel is lassíthatjuk egy kicsit a támadások ütemét. Így tehát a harmadik, legfelső tartományból (49152-65535) érdemes egyedi portszámot választanunk.
Ebben a leírásban én az 57345-ös portszámot választottam ki, tehát én ezzel a példával haladok tovább. Természetesen ahol meg kell adni a portot, ehelyett a saját portszámunkat használjuk!

 

UFW tűzfal kikapcsolása (opcionális)

Amennyiben - az iptables-en kívül még külön - tűzfalat használunk, például az UFW tűzfalat, az SSH portszám átállítása előtt mindenképpen kapcsoljuk azt ki. Ellenkező esetben kitiltjuk magunkat a rendszerből, ha csak távolról SSH-n keresztül férünk a számítógéphez vagy szerverhez. Konzolról természetesen ezután is be tudunk lépni.

Ha viszont csak az alapértelmezett iptables tűzfal működik a rendszerünkben, akkor itt nincs további teendő.

Az UFW tűzfalat az alábbi ufw paranccsal kapcsolhatjuk ki:

sudo ufw disable

A tűzfalban történő új portszám engedélyezésre és a tűzfal visszakapcsolására később térünk ki. Az SSH kiszolgáló portszámának beállítása idejére hagyjuk is kikapcsolva.

 

Egyedi SSH port beállítása

Konfigurációs fájl megnyitása

Debian / Ubuntu rendszereken az SSHD konfigurációs fájlja a /etc/ssh/sshd_config útvonalon található. Nyissuk meg root-ként szerkesztésre:

nano /etc/ssh/sshd_config

Aminek az eleje így néz ki például egy Debian 11 (Bullseye) minimális szerver telepítésen:

#       $OpenBSD: sshd_config,v 1.103 2018/04/09 20:41:22 tj Exp $

# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options override the
# default value.

Include /etc/ssh/sshd_config.d/*.conf

#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_ecdsa_key
#HostKey /etc/ssh/ssh_host_ed25519_key

# Ciphers and keying
#RekeyLimit default none

# Logging
#SyslogFacility AUTH
#LogLevel INFO

[...]
Természetesen más disztribúciókban is hasonló tartalmat láthatunk, amennyiben az OpenSSH szoftver segítségével bonyolítjuk le az SSH kiszolgálóhoz történő csatlakozásokat.

Itt láthatunk egy kommentezett sort:

#Port 22

Portszám módosítása

Miután átnéztük a portokkal kapcsolatos információkat, és megbizonyosodtunk róla, hogy a kinézett portszámunk szabad, akkor vegyük ki a kommentet a sor elől, és állítsunk be az általunk kiválasztott portszámot Például:

Port 57345

Egyedi portszám beállítása az sshd_config fájlban

Konfigurációs fájl mentése és az SSHD újraindítása

Ezután mentsük le a fájlt (CTRL+O -val nano-ban), majd indítsuk újra az SSH szolgáltatást:

systemctl restart sshd

A szolgáltatás újraindításától kezdődően az új kapcsolódások már mind az újonnan beállított portszámmal működnek, de a jelenlegi kapcsolatunkat nem bontja szét. Ennek megfelelően lépjünk ki, majd újra próbáljunk visszalépni a megszokott módon. Nálam például a virtuális gépre:

ssh linuxportal@debian11

És most már nem enged vissza, hanem az alábbi hibaüzenetet kapjuk:

ssh: connect to host debian11 port 22: Connection refused

Az SSH nem enged vissza a megváltoztatott portszám miatt

Persze a hibaüzenet függ attól is, hogy például használunk-e tűzfalat, az milyen módon tiltja a portokat, stb. Az UFW tűzfal esetén például ha "deny" házirend van érvényben, akkor nem kapunk semmilyen választ, hanem időtúllépés miatt megszakad a kapcsolat, míg a "reject" házirend esetén hibaüzenetet ad vissza.

Hogy hogyan léphetünk be az új portszám megadásával, erről a következő részben tájékozódhatunk.

 

 

SSH protokollt használó parancsok használata egyedi portszámokkal

Sok olyan parancsot használhatunk Linux rendszereken, amelyek az SSH protokollt használják. Ezek a parancsok alapértelmezetten a 22-es TCP porton kommunikálnak, de ha megváltoztattuk az SSH kiszolgálónk alapértelmezett 22-es portszámát, akkor meg kell nekik adni külön paraméterben. Lássunk néhány példát ezekre. Az alábbi parancsokat természetesen a kliens oldalról kell indítani:

ssh

Az első, és legfontosabb maga az ssh parancs. Ennek helyes használatával tudunk ismét belépni távolról rendszerünk parancssorába. Az ssh parancsnak a -p (kicsi p) opcióval adhatjuk meg az egyedi portszámot, amennyiben nem az alapértelmezett 22-es portot használjuk:

ssh <felhasználó>@<kiszolgáló> -p <egyedi portszám>

Ennek megfelelően, a saját példámnál maradva az alábbi paranccsal léphetek vissza a virtuális gépre:

ssh linuxportal@debian11 -p 57345

Az ssh parancs használata egyedi portszám megadásával

ssh-copy-id

Az ssh-copy-id parancs segítségével másolhatunk fel nyilvános kulcsot a kiszolgálóra, melynek segítségével jelszó használata helyett nyilvános kulcs segítségével tudunk belépni. A parancsnak szintén a -p (kicsi p) paraméterrel adhatjuk meg az egyedi portszámot. Példa:

ssh-copy-id -i /home/user/.ssh/id_rsa.pub user@remotehost -p <portszám>

Az ssh-copy-id parancs használata egyedi portszám megadásával

(A felmásolt nyilvános kulcs természetesen itt már korábban létre volt hozva, itt most csak az ssh-copy-id parancs egyedi portszámmal történő használata látható.)

scp

Az scp parancs segítségével kényelmesen és biztonságosan másolgathatunk fájlokat két távoli számítógép között az SSH protokollon keresztül. A parancsnak a -P (nagy P) paraméterrel lehet egyedi portszámot megadni:

scp -P <egyedi portszám> <forrás fájl> <célfájl>

Itt a -p (kis p) kapcsolónak más funkciója van (Preserves modification times), így ne keverjük össze!

Itt is a saját példámnál maradva először létrehozok egy szöveges fájlt, majd felmásolom azt az scp parancs segítségével a virtuális gépre:

scp -P 57345 testfile linuxportal@debian11:~/

Majd az eredmény tesztelése:

ssh linuxportal@debian11 -p 57345 "cat ~/testfile"

Az scp parancs használata egyedi portszám megadásával

Csak érdekességképpen, az iménti példában egy nem interaktív login shellben futtatja le a távoli kiszolgálón az idézőjelek közötti parancsot, és visszatér annak kimenetével. Hasznos megoldás ez, ha nem kívánunk interaktív shellben dolgozni, hanem csak például automatizáltan parancsokat futtatni, vagy feldolgozni azok kimenetét. Azonban vegyük figyelembe, hogy az interaktív és a nem interaktív shell-ek másképpen viselkednek, így tehát eltérők lehetnek a parancsok kimenetei egy interaktív és egy nem interaktív shell esetén. Ennek lekérdezése például a helyi Bash shellben, illetve a távoli kiszolgálón:

[[ $- == *i* ]] && echo "Interaktív shell" || echo "Nem interaktív shell"
echo $-
ssh linuxportal@debian11 -p 57345 '[[ $- == *i* ]] && echo "Interaktív shell" || echo "Nem interaktív shell"'
ssh linuxportal@debian11 -p 57345 'echo $-'

Interaktív és nem interaktív shell

Persze ez itt most nem kapcsolódik szorosan a témához, csak mint érdekességet említettem meg, valamint hogy gyakoroljuk az ssh parancs -p kapcsolójának használatát. :)

 

 

rsync

Az rsync parancs rendkívül hatékony fájl másoló illetve szinkronizáló program, ami nem csak a helyi fájlrendszerekben, hanem SSH kapcsolatokon keresztül távoli gépeken is képes fájlokat másolni illetve fájlstruktúrát szinkronizálni. Az rsync programot futtathatjuk daemon-ként is, illetve sima parancsként is. Az egyedi portszámon kommunikáló rsync parancs szintaktikája az alábbi:

rsync -e 'ssh -p <egyedi portszám>' <forrás> <cél>

Itt a -e paraméternek adunk át egy aposztrófok közé zárt részt, ami ilyenkor egy paraméternek számít. Ebben adjuk meg az ssh-t és az egyedi portszámot a benne lévő -p belső paraméterrel.

A forrás és a cél lehet egy helyi könyvtár, vagy egy távoli kiszolgáló is az elérési útjával együtt. A forrás és cél felcserélésével értelemszerűen a másolás/szinkronizáció irányát változtathatjuk meg.

Az rsync SSH-n keresztül történő használatához a programcsomagnak telepítve kell lennie mind a két gépen!

Nézzünk egy példát a helyi fájlrendszerből SSH-n keresztül történő felszinkronizálásra:

Első körben létrehozunk egy egyszerű könyvtárstruktúrát automatikusan a helyi gépen:

mkdir testdir
mkdir -p testdir/{a,b}/{a,b}/{a,b}

Majd megnézzük a tree parancs segítségével hogyan néz ki:

tree -d testdir

Helyi könyvtárstruktúra automatikus létrehozása

Ezután ellenőrizzük a távoli fájlstruktúrát is, hogy ilyenkor véletlenül ne egy meglévő könyvtárba másoljunk fel dolgokat. Itt a már ismert módon kérdezzük le egy lépésben egy nem interaktív shell-el:

ssh linuxportal@debian11 -p 57345 'tree -a'

Távoli könyvtárstruktúra ellenőrzése ssh-n keresztül

Ezután jöhet az SSH-n keresztül történő fájlstruktúra szinkronizáció az egyedi SSH portszámmal:

rsync -vr -e 'ssh -p 57345' --progress ~/testdir/ linuxportal@debian11:~/testdir/

Fájlstruktúra szinkronizálása SSH kapcsolaton keresztül egyedi SSH portszám megadásával

Itt még bekerült néhány kapcsoló, hogy életre is keljen a szinkronizáció:

  • -v: Verbose. Bőbeszédű mód. Így minden részletet látunk a műveletről
  • -r: Rekurzív mód. Ezzel kerülnek átmásolásra az alkönyvtárak is.
  • --progress: Folyamat kijelzése. A képernyő alján mutatja a folyamatjelzőt a fájlok másolása közben. Nem kötelező, de nagyobb méretű fájlok másolása/szinkronizálása esetén hasznos.

Ha ez megvan, akkor újra ellenőrizhetjük a távoli könyvtárstruktúrát is:

ssh linuxportal@debian11 -p 57345 'tree -a'

Távoli könyvtárstruktúra újbóli ellenőrzése

Itt láthatjuk, hogy felmásolta a teljes testdir könyvtárstruktúránkat. Természetesen ha fájlok is lettek volna a könyvtárakban, akkor azokat is felmásolta volna.

Az rsync program még rengeteg funkcióval rendelkezik, erről majd egy külön leírásban értekezünk.

 

 

Scriptjeink átfésülése és módosítása a megváltozott portszámok használatához

Sokáig lehetne még folytatni az SSH protokollt használó parancsok sorát, de itt most csak ezt a néhányat írtam le, amiket gyakran használ az ember.

Ha scriptekben használjuk ezeket a parancsokat, akkor a port megváltoztatása után ne felejtsük el módosítani a szükséges részeket. Ha összetettebb script struktúránk van, amikkel például a szerverünket és a rajta lévő weboldalakat menedzseljük, akkor célszerű a különböző szolgáltatások egyedi portszámait külön konfigurációs fájlokban tárolni, és onnan beolvasni. Így ha később újból módosításra kerül a sor, akkor csak egy helyen kell majd átírni.

Ha sok script fájlunk van, az alábbi grep paranccsal könnyen megkereshetjük a fenti parancsokat tartalmazó scriptjeinket:

grep -rnwi "ssh\|ssh-copy-id\|scp\|rsync" ~/bin/

vagy ha nem akarunk escape-elgetni, akkor használhatjuk a grep -E kapcsolóját, ami a bővített reguláris kifejezéseket (extended regexp) támogatja:

grep -rnwi -E "ssh|ssh-copy-id|scp|rsync" ~/bin/

Nálam például a ~/bin könyvtárban vannak a saját script fájljaim, de bármelyik könyvtár megadható, valamint a keresett parancsok felsorolása is bővíthető.

A grep parancs kapcsolói itt az alábbiak:

  • -r: Rekurzív keresés, tehát minden alkönyvtárat végignéz.
  • -n: A kimenetben megjeleníti a találatok sorainak a számait is. Így könnyebben odagörgethetünk a szerkesztőben a keresett parancsra.
  • w: A keresési minta csak egész szavakra illeszkedik. Így csak a különálló parancs kifejezéseket keressük, és nem kerülnek bele olyan találatok, amik például a paranccsal megegyező karakterlánccal kezdődnek.
  • i: Kis- és nagybetűk figyelmen kívül hagyása

 

UFW tűzfal beállítása és bekapcsolása (opcionális)

Amennyiben UFW tűzfalat használunk és az egyedi SSH portszám beállítása előtt kikapcsoltuk, akkor az újonnan beállított portszámunkat engedélyezni kell a tűzfalban, ezután bekapcsolhatjuk azt.

Engedélyezzük az UFW tűzfalban a beállított egyedi SSH portszámunkat root-ként:

ufw allow 57345/tcp
Itt is természetesen a saját kiválasztott portszámunkat használjuk!

Ezután kapcsoljuk be az UFW tűzfalat:

ufw enable

Itt válasszunk "y"-t, majd ellenőrizzük az állapotot:

ufw status

UFW tűzfal beállítása és bekapcsolása

Ha korábbról voltak OpenSSH alkalmazásprofillal létrehozott, vagy az alapértelmezett 22-es TCP porthoz kapcsolódó tűzfalszabályok, amik ebben a listában előkerülnek, akkor azokat törölhetjük azokat. Ehhez listázzuk sorszámozással az alábbi paranccsal:

ufw status numbered

majd töröljük a következő paranccsal a nem szükséges szűrőket:

ufw delete <tűzfalszabály sorszáma>
Az UFW tűzfal részletesebb használatáról itt olvashatunk:

 

 

Konklúzió

Az SSH kiszolgáló alapértelmezett 22-es TCP portjának átállítása roppant egyszerű feladat, csak ne feledkezzünk meg előtte ellenőrizni a szabad portokat, valamint hogy kikapcsoljuk a tűzfalat. Ha sikeresen megváltoztattuk a portszámot, ezzel már egy fokkal biztonságosabbá tettük rendszerünket, mert kevesebb támadás fogja érni SSH kiszolgálónkat.