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
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.
UFW tűzfal kikapcsolása (opcionális)
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 [...]
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
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
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
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>
(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"
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 $-'
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.
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
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'
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/
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'
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
Ezután kapcsoljuk be az UFW tűzfalat:
ufw enable
Itt válasszunk "y"-t, majd ellenőrizzük az állapotot:
ufw status
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>
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.
- A hozzászóláshoz regisztráció és bejelentkezés szükséges
- 224 megtekintés