« Vissza

SSH kulcsos hitelesítés Linux szerveren

Tartalomjegyzék

  1. Bevezetés
  2. Hogyan működnek az SSH kulcsok?
  3. SSH kulcsok létrehozása
  4. Nyilvános kulcs másolása a szerverre
  5. Szerver hitelesítése SSH kulcsok használatával
  6. A jelszó hitelesítés feloldása a szerveren
  7. Összefoglalás

Bevezetés

Az SSH (secure shell= biztonságos távoli bejelentkezés egy nem biztonságos hálózaton) egy titkosított protokoll, amelyet szerverek igazgatásához és kommunikációjához használnak. Amennyiben Linux szerverrel dolgozunk, úgy nagy eséllyel az időnk tetemes részét egy SSH-n keresztül, a szerverhez kötött terminálnál fogjuk tölteni.

Miközben létezik néhány különböző módja az SSH szerverre való bejelentkezésnek, ebben a cikkben az SSH kulcsok felállításával fogunk foglalkozni. Az SSH kulcsok egy könnyű, ám rendkívül biztonságos módját nyújtják a szerverre való bejelentkezésnek. Ezért javasoljuk ezt a módszert minden felhasználónak.

Hogyan működnek az SSH kulcsok?

Egy SSH szerver több különböző módszerrel is hitelesítheti a felhasználókat. A legalapvetőbb módszer ezek közül a jelszavas hitelesítés, amit könnyű használni, viszont nem a legbiztonságosabb. Habár a jelszavakat a szerver biztonságos módon küldi el, általában nem elég bonyolultak és hosszúak ahhoz, hogy ellenálljanak az ismételt támadásoknak.

A modern feldolgozási technikák és automatizált scriptek rendkívül egyszerűvé teszik a nyers erőn alapuló támadásokat a jelszóval védett fiókokkal szemben. Habár léteznek olyan módszerek, amelyek plusz védelmet nyújtanak (pl. fail2ban), mégis az SSH kulcsok bizonyulnak a legmegbízhatóbb és legbiztonságosabb alternatívának.
Az SSH kulcs egy kriptografikusan biztosított kulcspár, amelyet a felhasználó SSH szerverhez való hitelesítéséhez használunk. Mindegyik kulcspár egy nyilvános és egy privát kulcspárból áll. A magánkulcsot a felhasználónak adjuk, amelyet ő teljesen bizalmasan kell, hogy kezeljen. Ennek bármiféle kompromittálása lehetővé teszi a támadó számára, hogy bejelentkezzen a szerver olyan részeire, amely hitelesítéséhez nem szükséges további kulcsok megadása.

Egy plusz réteg védelmet jelenthet, ha a kulcsot a meghajtón egy jelmondattal (azaz egy összetett jelszóval) védjük le. A hozzá tartozó nyilvános kulcsot bármilyen negatív következmény nélkül szabadon megoszthatjuk. A nyilvános kulcs segítségével titkosíthatunk üzeneteket, amelyeket csak a magánkulccsal tudunk feloldani. Ez a tulajdonság felhasználható úgy, mint a kulcspárral való hitelesítés egyik módja.

A nyilvános kulcsot fel kell töltenünk arra a távoli szerverre, amelyre az SSH-val akarunk bejelentkezni. A kulcs egy meghatározott fájlban lesz a felhasználói fiókon belül: ~/.ssh/authorized_keys. Amikor a felhasználó megpróbál az SSH kulccsal hitelesíteni, a szerver megvizsgálja, hogy rendelkeznek-e a megfelelő magánkulccsal. Amennyiben igen, úgy a parancsvezérlő megtöbbszöröződik, vagy a kívánt parancs végrehajtódik.

SSH kulcsok létrehozása

Az első lépés az SSH kulcspár létrehozása lesz a helyi számítógépen. Ahhoz, hogy ezt megtegyük, használhatunk egy ssh-keygen nevezetű eszközt, amely része az alapértelmezett OpenSSH eszközöknek. Alapértelmezettként ez egy 2048 bites RSA kulcspárt hoz létre, amely a legtöbb felhasználó számára megfelelőnek bizonyul. A helyi számítógépünkön gépeljük be a következőt az SSH kulcs létrehozásához:

ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa): 

Az eszköz ezt követően megkérdezi, hogy hol szeretnénk a generált kulcsokat tárolni. Alapértelmezettként a ~/.ssh könyvtárba helyezi el a felhasználó saját könyvtárában. A magánkulcs id_rsa néven fut, és a hozzá tartozó nyilvános kulcs pedig az id_rsa.pub nevet fogja kapni.

Az elején még célszerű az alapértelmezett mappát kiválasztani. Ebben az esetben az SSH kliens lehetővé teszi, hogy automatikusan megtaláljuk az SSH kulcsokat, amikor hitelesítéssel próbálkozunk. Ha egy nem standard elérési utat szeretnénk, akkor azt most kell beírnunk, ha nem, akkor az ENTER megnyomásával elfogadjuk az alapértelmezett beállítást. Amennyiben korábban már készítettünk SSH kulcspárt, akkor lehet, hogy felugrik egy parancsjel a következő szöveggel:

/home/username/.ssh/id_rsa already exists.
Overwrite (y/n)? 

Amennyiben felülírjuk a kulcsot, nem fogunk tudni hitelesíteni az előző kulccsal, így legyünk nagyon körültekintőek a válasszal, mert a rossz válasz visszafordíthatatlan következményekkel járhat.

Created directory '/home/username/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again: 

A következő lépésben megadhatunk egy jelmondatot is a kulcshoz. Ez egy opcionális lépés, amivel a magánkulcsot tartalmazó mappát védhetjük le. Felmerülhet a kérdés, hogy milyen előnyei vannak az SSH kulcsnak, hogyha be kell írnunk a jelmondatot.

Néhány előny:

  • A magán SSH kulcs (a jeligével védhető rész) sosincs kitéve a hálózat veszélyeinek. A jelige csak arra használatos, hogy a gépen megnyithassuk a kulcsot tartalmazó mappát. Ez azt jelenti, hogy a hálózatalapú, nyers erőn alapuló támadások nem hatásosak a jelmondattal szemben.
  • A magánkulcs egy korlátozott könyvtárban van elhelyezve. Az SSH kliens nem fogja felismerni azokat a magánkulcsokat amelyek nem ezekben a könyvtárakban vannak tárolva. A kulcsnak magának is tartalmaznia kell korlátozott hozzáféréseket (olvasás és írás csak a tulajdonos számára). Ez azt jelenti, hogy a rendszer más felhasználói nem tudják megtekinteni a fájlt.
  • Bármilyen támadó, aki a magánkulcsot szeretné feltörni, már előzetesen is hozzá kell, hogy férjen a rendszerhez (felhasználói fiók és gyökérfelhasználó). Ha ebbe a szituációba kerülünk, akkor a jelige megvédhet minket attól, hogy a támadó azonnal hozzáférést kapjon a többi szerverünkhöz. Ez remélhetőleg elegendő időt biztosít számunkra ahhoz, hogy létrehozzunk és beállítsunk egy új SSH kulcspárt, majd eltávolítsuk a feltört kulcshoz tartozó hozzáféréseket.

Mivel a magánkulcs sosincs fenn a hálózaton és védve van, ez a fájl rajtunk (és a gyökérfelhasználón) kívül senki számára nem elérhető. Megváltozott körülmények esetén a jelige egy plusz védelmi rétegként szolgál.

A jelmondat megadása opcionális. Ha beírjuk, akkor a kulcs minden egyes használatakor be kell írnunk (kivéve, ha egy SSH agent szoftvert használunk, amely eltárolja a feloldáshoz szükséges kulcsot).

Véleményünk szerint tanácsos a jelmondat használata, de ha nem szeretnénk beállítani, akkor csak egyszerűen nyomjunk egy ENTER-t ahhoz, hogy a parancssor eltűnjön.

Your identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.ssh/id_rsa.pub.
The key fingerprint is:
a9:49:2e:2a:5e:33:3e:a9:de:4e:77:11:58:b6:90:26 username@remote_host
The key's randomart image is:
+--[ RSA 2048]----+
|     ..o         |
|   E o= .        |
|    o. o         |
|        ..       |
|      ..S        |
|     o o.        |
|   =o.+.         |
|. =++..          |
|o=++.            |
+-----------------+ 

Így már rendelkezünk egy nyilvános és egy magánkulccsal, amit használhatunk hitelesítéshez. A következő lépés a nyilvános kulcs szerveren való elhelyezése, ezt követően már használhatjuk is az SSH hitelesítő kulcsot a belépéshez.

Nyilvános kulcs másolása a szerverre

Amennyiben már van elérhető szerverünk, és a létrehozáskor nem ágyaztunk be kulcsokat, akkor később is feltölthetjük a nyilvános kulcsot és használhatjuk azt a szerverünk hitelesítésére.

Az általunk használt eszközök nagy mértékben függnek a számunkra elérhető eszközöktől, és a jelenlegi konfigurációnktól. A következő módszerek mind egy eredményhez vezetnek. A legegyszerűbb, automatizált módszer az első, az ezt követő módszerek pedig további manuális lépéseket kívánnak. Ezeket akkor használjuk, ha nem tudjuk az első módszert alkalmazni.

Nyilvános kulcs másolása SSH-Copy-ID használatával

A legegyszerűbb módja a nyilvános kulcs létező szerverre másolásának egy ssh-copy-id eszköz segítségével történik. Egyszerűsége miatt ez a módszer a legajánlatosabb (amennyiben elérhető).

Az ssh-copy-id eszköz sok disztribúció esetében az OpenSSH csomagok részét képezi, így valószínűleg a helyi rendszerben is elérhető. Ahhoz, hogy ez működőképes lehessen, rendelkeznünk kell jelszóalapú SSH hozzáféréssel a szerverünkön.

Az eszköz használatához egyszerűen meg kell határoznunk a távoli hosztot, amihez csatlakozni kívánunk, illetve a felhasználói fiókot, amihez jelszavas SSH hozzáférésünk van. Ez az a felhasználó, ahova a nyilvános SSH kulcsok másolva lesznek. A parancs a következő:

ssh-copy-id username@remote_host

Ezt követően felbukkanhat a következő üzenet:

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes 

Ez mindössze annyit jelent, hogy a helyi számítógép nem ismeri fel a távoli hosztot. Ez az új hoszthoz való első csatlakozáskor fog megtörténni. Írjuk be, hogy yes, és a folytatáshoz nyomjunk egy ENTER-t!

A következő lépésben az eszköz átfésüli a helyi felhasználói fiókot az id_rsa.pub kulcsot keresve, amit korábban hoztunk létre. Amikor megtalálja a kulcsot, akkor a távoli felhasználó kulcsát fogja kérni.

/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
username@111.111.11.111's password: 

Írjuk be a jelszót (a gépelésünk biztonsági okokból nem fog látszódni a képernyőn) és nyomjunk ENTER-t ismét! Az eszköz rá fog csatlakozni a távoli fiókra (amely a megadott jelszót használja). Ezt követően átmásolja a ~/.ssh/id_rsa.pub kulcs tartalmát a távoli felhasználó ~/.ssh könyvtárába, egy authorized_keys nevű mappába.

Egy ilyen kimenetet fogunk látni:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'username@111.111.11.111'"
and check to make sure that only the key(s) you wanted were added. 

Ezzel fel is töltöttük az id_rsa.pub kulcsot a távoli felhasználóhoz. Folytathatjuk a következő lépéssel.

Nyilvános kulcs másolása SSH használatával

Amennyiben az ssh-copy-id nem elérhető számunkra, de van jelszóalapú SSH hozzáférésünk egy felhasználóhoz a rendszeren, akkor feltölthetjük a kulcsokat a megszokott SSH módszerrel is. Ezt úgy tehetjük lehetővé, hogy a nyilvános SSH kulcsot a helyi számítógépre helyezzük, és hozzácsatlakoztatjuk egy SSH kapcsolaton keresztül a távoli szerverhez. A másik oldalról megbizonyosodhatunk arról, hogy a ~/.ssh könyvtár létezik a használt felhasználónál, majd ugyanebbe a könyvtárba helyezzük a tartalmat egy authorized_keys nevű fájlba.

A >> (átirányítás) szimbólumot fogjuk használni a hozzáíráshoz, ahelyett hogy felülírnánk azt. Ez lehetővé teszi, hogy a későbbiekben is hozzáadjunk kulcsokat anélkül, hogy az előzőleg hozzáadott kulcsokat kitörölnénk.

A teljes parancs így fog kinézni:

cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

Ezután felbukkanhat egy ilyen üzenet:

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes 

Ez csupán annyit jelent, hogy a helyi számítógép nem ismeri fel a távoli hosztot. Ez csak az új hoszthoz való első csatlakozáskor történik meg. A folytatáshoz írjuk be, hogy yes és nyomjunk egy ENTER-t!

Ezután a be kell írnunk a jelszavát annak a felhasználónak, amelyikre csatlakozni kívánunk:

username@111.111.11.111's password:

A jelszó beírása után az id_rsa.pub kulcs tartalma az authorized_keys fájl végére lesz másolva a távoli felhasználói fiókban. Ha ez sikerült, akkor folytathatjuk a következő lépéssel.

Nyilvános kulcs másolása manuálisan

Amennyiben nem rendelkezünk jelszóalapú SSH hozzáféréssel a szerverünkön, úgy a fenti lépéseket manuálisan kell megcsinálnunk. Az id_rsa.pub fájl tartalmát hozzá kell adnunk a távoli gép ~/.ssh/authorized_keys fájljához valamilyen módon.

Ahhoz, hogy megjelenítsük az id_rsa.pub kulcs tartalmáz, írjuk be a következőt a helyi számítógépbe:

cat ~/.ssh/id_rsa.pub

Ezt követően látni fogjuk a kulcsot, ami ehhez hasonló lesz:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqql6MzstZYh1TmWWv11q5O3pISj2ZFl9HgH1JLknLLx44+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+PnUSGHrSgpBgX7Ks1r7xqFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3K2B+ZVIpSDfki9UVKzT8JUmwW6NNzSgxUfQHGwnW7kj4jp4AT0VZk3ADw497M2G/12N0PPB5CnhHf7ovgy6nL1ikrygTKRFmNZISvAcywB9GVqNAVE+ZHDSCuURNsAInVzgYo9xgJDW8wUw2o8U77+xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUhLuJ0X/vh2xPff6SQ1BL/zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xt/2FWYepz6ZlN70bRly57Q06J+ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ== demo@test 

A következő, hogy valamilyen módszerrel férjünk hozzá a távoli hoszthoz. Amikor ezzel megvagyunk, bizonyosodjunk meg róla, hogy a ~/.ssh könyvtár már létre lett hozva! Ha már megvan, akkor nincs teendőnk, ha nincs akkor pedig a következő paranccsal tehetjük ezt meg:

mkdir -p ~/.ssh

Most már létrehozhatjuk és meg is változtathatjuk az ezen a könyvtáron belüli authorized_keys fájl tartalmát. Hozzáadhatjuk a mi id_rsa.pub fájlunk tartalmát az authorized_keys fájl végéhez. Ha még nincs ilyen nevű mappánk, akkor azt a következő paranccsal tehetjük meg:

echo public_key_string >> ~/.ssh/authorized_keys

A fenti parancsban helyettesítsük a public_key_string -et a cat ~/.ssh/id_rsa.pub parancs kimenetével, amelyet a helyi rendszerünkön futtattunk. Ha minden rendben ment, akkor ssh-rsa AAAA…-val kell kezdődnie. Ha ez működik, akkor továbbléphetünk a jelszó nélküli hitelesítéshez.

Szerver hitelesítése SSH kulcsok használatával

Ha sikeresen végrehajtottuk a fenti módszerek egyikét, akkor elvileg be tudunk lépni a távoli hoszthoz a távoli felhasználó jelszava nélkül. Az alapfolyamat itt sem változik meg:

ssh username@remote_host

Amennyiben most csatlakoztunk első alkalommal ehhez a hoszthoz, úgy egy hasonló üzenet ugorhat fel:

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes 

Ez csupán annyit jelent, hogy a helyi számítógép nem ismeri fel a távoli hosztot. A folytatáshoz írjuk be, hogy yes és nyomjunk egy ENTER-t!

Ha nincs jelmondat megadva, akkor rögtön beléptet minket a rendszer. Amennyiben megadtunk egy jelmondatot a magánkulcshoz, úgy azt most kell beírnunk. Ezt követően egy új parancsvezérlő többszöröződik számunkra a távoli rendszeren.

A jelszó hitelesítés feloldása a szerveren

Ha be tudtunk lépni a felhasználóba SSH-val jelszó nélkül, akkor sikeresen konfiguráltuk az SSH kulcs alapú hitelesítést a felhasználónk számára. Azonban, a jelszóalapú hitelesítésünk még mindig aktív, ami azt jelenti, hogy a szerverünk még mindig nyers erőn alapuló támadásoknak lehet kitéve.

Mielőtt befejezzük ennek a résznek a lépéseit, győződjünk meg róla, hogy vagy SSH kulcs alapú hitelesítés van konfigurálva a szerver gyökérfelhasználója számára, vagy lehetőség szerint SSH kulcs alapú hitelesítés van konfigurálva a szerver valamelyik felhasználója számára, aki rendelkezik sudo hozzáféréssel.

Ez a lépés le fogja zárni a jelszóalapú bejelentkezéseket, úgyhogy alapvető feltétel, hogy adminisztratív hozzáférésünk legyen. Miután a fent említett feltételek adottak, jelentkezzünk be a távoli rendszerbe az SSH kulcsokkal gyökérfelhasználóként, vagy sudo jogosultságokkal rendelkező felhasználóként.

Nyissuk meg az SSH daemon konfigurációs fájlját:

sudo nano /etc/ssh/sshd_config

A fájlon belül keressünk egy PasswordAuthentication nevezetű direktívát. Írjuk át az értéket no-ra! Ez lehetővé teszi számunkra, hogy SSH-n keresztül a felhasználói jelszavakkal való belépést letiltsuk:

PasswordAuthentication no

Mentsük el és zárjuk be a fájlt, amikor befejeztük. A változtatások életbe léptetéséhez újra kell indítanunk a gépet.

  • Ubuntu vagy Debian esetében a következő parancsot kell beírnunk:
sudo service ssh restart
  • CentOS/Fedora esetében a daemon neve sshd:
sudo service sshd restart

Ezen lépés után sikeresen átállítottuk az SSH daemont, hogy az csak az SSH kulcsokra reagáljon.

Összefoglalás

Most már rendelkezünk egy SSH kulcs alapú hitelesítéssel, amit konfiguráltunk a saját szerverünkhöz. Ez lehetővé teszi számunkra a felhasználói jelszó nélküli bejelentkezést. Ezt követően rendkívül széles a skála az SSH-t illetően, amennyiben felkeltette az érdeklődésünket, az interneten számos cikket olvashatunk róluk.

Kapcsolódó cikkek