6 Az SSH 66–71. trükkök Miközben a különféle trükköket gyûjtögettem a könyvhöz, hamar világossá vált számomra, hogy az SSH külön fejezetet érdemel. Az SSH olyan rugalmas és biztonságos titkosítási módszert nyújt számunkra, amellyel hálózaton keresztül összekapcsolhatjuk a különféle gépek közötti adatfolyamokat. A parancssor Linux alatt lényegében adatok olvasását (és írását) jelenti fájlokból és csõvezetékekbõl. Az SSH lehetõvé teszi számunkra, hogy az adatot többé-kevésbé úgy dobjuk keresztül a hálózaton, mintha csak egyetlen gépen dolgoznánk. Mindezt gyors, biztonságos és logikus módon tehetjük meg, ráadásul néhány igen érdekes (és hatékony) trükköt is alkalmazhatunk. Linux alatt több SSH-változat között is válogathatunk. E fejezet példáiban feltételezzük majd, hogy az OpenSSH v3.4p1 vagy ennél újabb változatát használjuk. Az OpenSSH az összes nagyobb Linux-terjesztésben megtalálható, illetve a http://www.openssh.com/ címrõl tölthetõ le.
#66
212
Linux bevetés közben
#66 Gyors bejelentkezés SSH-ügyfélkulcsokkal Ha jelszavak helyett SSH-kulcsokat használunk, felgyorsíthatjuk és önmûködõvé tehetjük a bejelentkezést Amikor egynél több gépen látunk el rendszergazdai feladatokat, létfontosságú, hogy képesek legyünk gyorsan elõhívni bármely kiszolgáló héjprogramját. Ha mindig be kell gépelnünk az ssh en.kiszolgalom.hu alakot (majd a jelszót), az nem csak fárasztó, de a figyelmünket is megtöri. Nem egy rendszergazdánál jelentkeztek a korai szenilitás jelei, amikor hirtelen át kellett váltania a „Mi is a probléma?” feladatról a „Hogyan jutok oda?” megoldására, amit a „Hol is tartottam?” követett. Ez a „Miért is jöttem be ebbe a szobába?” digitális változata. (Ráadásul a /usr/games/fortune jelenléte csak fokozza a gondokat!) Akárhogy is vesszük, minél több energiát fektetünk a bejelentkezésbe, annál kevesebb jut a feladat megoldására. Az SSH mostanában megjelent változatai a vég nélküli jelszógépelgetés helyett új lehetõséget kínálnak: a nyílt kulcsok cseréjét. Ha nyílt kulcsokat akarunk használni az SSH-kiszolgálón, elõször is létre kell hoznunk egy nyilvános, illetve saját kulcspárt: $ ssh-keygen -t rsa
Használhatjuk -t dsa kapcsolót is, ha DSA-kulcsokat szeretnénk, vagy a -t rsa1 kapcsolót, ha ragaszkodunk a Protocol v1 rendszerhez. (Bár az ilyesmi szégyen és gyalázat, amint lehet, váltsunk v2-re!) Miután begépeltük a fenti parancsot, valami ilyesmit kell látnunk: Generating public/private rsa key pair. Enter file in which to save the key ¯ (/home/rob/.ssh/id_rsa):
Itt egyszerûen csak nyomjunk ENTERT. Ezután a rendszer egy jelmondatot kér tõlünk; nyugodtan üssünk két ENTERT (természetesen csak miután elolvastuk az alatta megjelenõ biztonsági figyelmeztetést). Az eredmény a következõképpen fog festeni:
Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in ¯ /home/rob/.ssh/id_rsa. Your public key has been saved in ¯ /home/rob/.ssh/id_rsa.pub. The key fingerprint is: a6:5c:c3:eb:18:94:0b:06:a1:a6:29:58:fa:80:0a:bc ¯ rob@localhost
Munkánk gyümölcseként két fájl jön létre ~/.ssh/id_rsa és ~/.ssh/id_rsa.pub néven. Ha valamelyik kiszolgálón ezt a kulcspárt szeretnénk felhasználni, a következõket írjuk be: $ ssh server "mkdir .ssh; chmod 0700 .ssh" $ scp .ssh/id_rsa.pub server:.ssh/authorized_keys2
Természetesen a kiszolgáló helyére a saját kiszolgálónk neve kerül. Mindkét esetben jelszót kell kérnie tõlünk. Ezt követõen egyszerûen próbáljuk ki az ssh kiszolgáló parancsot, és ha minden jól megy, önmûködõen jelszó nélkül léphetünk be a kiszolgálóra. Igen, ezentúl az scp is az új, frissen csillogó nyilvános kulcsunkat fogja használni. Amennyiben valami nem mûködik, ellenõrizzük a ~/.ssh/* és a kiszolgáló:~/.ssh/* könyvtárak jogosultságait. Saját kulcsunk (id_rsa) jogosultsága 0600 legyen (és csak a saját gépünkön szabad léteznie), minden másnak 0655 vagy ennél erõsebb jogosultságokkal kell rendelkeznie. Nagyszerû! Mostantól könnyedén, csekély kínlódással léphetünk be SSH-val a kiszolgálóra. Létezik olyan módszer, amellyel még ennél is gyorsabban léphetünk be a gyakran használt gépekre? Mérget vehetünk rá. Csak bele kell nézni a [#67] „Villámgyors SSH-bejelentkezés” trükkbe.
Biztonsági megfontolások Néhányan úgy vélik a nyilvános kulcsok alkalmazása lehetséges biztonsági rés. Végsõ soron csak a saját kulcsot kell ellopnia valakinek, és máris hozzáférhet kiszolgálóinkhoz. Bár ez kétségtelenül igaz, de ugyanez nyilvánvalóan elmondható a jelszavakról is.
213
#66
6. fejezet • Az SSH
#67
214
Linux bevetés közben
Kérdezzük csak meg magunktól, naponta hányszor gépelünk be jelszavakat, hogy elérjünk egy gépet (vagy scp-vel másoljunk át valamilyen fájlt)? Milyen gyakori, hogy ugyanazt a jelszót használjuk sok (vagy akár az összes) gépen? Használtuk már ezt a jelszót olyan helyen, aminek a biztonsága megkérdõjelezhetõ (weboldalon, saját gépen, mely nem feltétlenül naprakész, esetleg egy olyan gép SSHügyfelén, amelyet nem mi kezelünk)? Ha az elõbbi lehetõségek közül bármelyik is ismerõsen cseng, nyugodtak lehetünk, mert ugyanilyen feltételek mellett az SSH-kulcs használata is lehetetlenné teszi a támadó számára, hogy jogosulatlan elérést szerezzen (feltéve, hogy a saját kulcsunkat titokban tudjuk tartani).
Kapcsolódó anyagok • SSH: The Definitive Guide (O'Reilly) • [#67] Villámgyors SSH-bejelentkezés • [#69] Az SSH-Agent futtatása grafikus felületen
#67 Villámgyors SSH-bejelentkezés Még gyorsabb bejelentkezés parancssorból Aki az elõzõ trükkben leírt módosítást elvégezte, nem árt, ha tudja még csak a megoldás felét látta. Az ügyfélkulcsok használatával még mindig feleslegesen kell begépelnünk az ssh kiszolgálóparancsot valahányszor SSH-val lépünk be valahová. Még a sötét, biztonságot nélkülözõ, megvilágosodás elõtti rsh-s idõkben létezett egy különös képesség, amit nagyon kedveltem, és amit (egyelõre még) nem vittek át SSH alá. Akkoriban ugyanis lehetõség nyílt arra, hogy ha a kiszolgáló nevével azonos elnevezésû közvetett hivatkozásokat hoztunk létre a /usr/bin/rsh fájlra, az rsh elég okos volt és kitalálta, hogy mivel nem rsh néven hívták meg, a nevével azonos kiszolgálóra kell belépnie. Mindezt könnyen utánozhatjuk parancsfájl segítségével. Készítsünk egy parancsfájlt ssh-to néven, amely a következõ két sort tartalmazza: #!/bin/sh ssh `basename $0` $*
(A basename $0 körül található jelek fordított egyszeres idézõjelek – backtick –). Az elõzõ fájlt helyezzük az elérési utunkba (feltéve, hogy a ~/bin nincs már eleve a PATH változónkban) és készítsünk közvetett hivatkozásokat kedvenc kiszolgálóink nevével: $ $ $ $
cd ln ln ln
bin -s ssh-to kiszolgáló1 -s ssh-to kiszolgáló2 -s ssh-to kiszolgáló3
Mostantól fogva, ha ssh-zni szeretnénk kiszolgáló1-re (feltételezve, hogy a korábban leírt módszerrel már átmásoltuk nyilvános kulcsunkat), mindössze a kiszolgáló nevét kell beírnunk, és varázslatos módon máris a nevezett kiszolgáló héjprogramjában találjuk magunkat, mindenféle SSH parancsok és jelszavak megadása nélkül. A sor végén található $* arra szolgál, hogy (a héjprogram elindítása helyett) egyetlen sorban tetszõleges parancsokat adhassunk ki, valahogy így: kiszolgáló1 uptime
(Az elõzõ sor megmutatja kiszolgáló1 futásidejét, felhasználóinak számát és terhelési átlagát, majd kilép. Ha kíváncsiak vagyunk az összes gépünk állapotára, tegyük for ciklusba a parancsot és lépkedjünk végig a kiszolgálók listáján.) Úgy gondolom, ez az SSH használatának lehetõ leggyorsabb módja, eltekintve attól az esettõl, amikor egykarakteres álneveket készítünk (ami egyébként szélsõséges, nehezen karbantartható és szükségtelen tákolás, ugyanakkor néhány embert láthatóan lebilincsel): $ alias a='ssh alice' $ alias b='ssh bob' $ alias e='ssh eve' ...
Az SSH számos olyan képességgel bír, amelyek a különbözõ kiszolgálók közötti navigálás igen rugalmas eszközévé teszik. Sikerült, megtaláltuk a módját miképpen jelentkezzünk be és illesszük a rendszerbe gépeinket a legkönnyebben.
215
#67
6. fejezet • Az SSH
#68
216
Linux bevetés közben
Kapcsolódó anyagok • [#66] Gyors bejelentkezés SSH-ügyfélkulcsokkal • [#68] SSH-Agent, hatékonyan
#68 SSH-Agent, hatékonyan Használjuk az SSH-Agent programot SSH-ügyfélkulcsaink önmûködõ kezeléséhez Az SSH egyik nagyon hasznos összetevõje az SSH-Agent, amely helyettünk kezeli saját kulcsainkat és szükség szerint átadja hitelesítõ adatainkat. Az SSH-Agent súgóoldala a következõket tudatja velünk: „Az SSH-Agent (SSH-ügynök) célja, hogy a nyilvános kulcsú kódolásokban (RSH, DSA) használt saját kulcsokat tárolja. Az alapelképzelés szerint az SSH-Agentet az X-folyamat vagy a bejelentkezés elõtt indítjuk el, így valamennyi ablak és program az SSH-Agent program ügyfeleként indul el. Az ügynök környezeti változókon keresztül érhetõ el és az azonosítási folyamat során önmûködõen felhasználható valahányszor más gépekre jelentkezünk be az SSH(1) segítségével.” A gyakorlatban ez annyit jelent, hogy a háttérben futó ügynökkel (és egy helyesen beállított SSH-ügyféllel) egymás után több gépre is beléphetünk az SSH-val anélkül, hogy valamennyi köztes gépen létezne egy-egy másolat a saját kulcsunkból (vagy mindenhol jelszót kellene begépelnünk). Tételezzük fel, hogy létezik egy hitelesített SSH-kulcsunk (lásd a [#66] „Gyors bejelentkezés SSH-ügyféllel” trükköt) a homer, bart és lisa gépeken. Amíg a saját gépünkrõl ssh-zunk ezekre a gépekre, nem találkozunk semmiféle nehézséggel: rob@caligula:~$ ssh homer rob@homer:~$ exit logout Connection to homer.oreillynet.com closed. rob@caligula:~$ ssh bart
rob@bart:~$ exit logout Connection to bart.oreillynet.com closed. rob@caligula:~$ ssh lisa rob@lisa:~$ exit
De mi történik akkor, ha a homer géprõl közvetlenül ssh-zunk át bart-ra? rob@caligula:~$ ssh homer rob@homer:~$ ssh bart rob@bart's password:
Nos, ilyenkor lép a képbe az SSH-Agent. Ahelyett, hogy felesleges veszélyeknek tennénk ki saját kulcsunkat, és az összes kiszolgálóra egy-egy másolatot helyeznénk el belõle, inkább a saját gépünkön indítsuk el az ügynököt: rob@caligula:~$ eval `ssh-agent` Agent pid 8450
Majd alapértelmezett SSH-kulcsainkat vegyük fel az ssh-add paranccsal: rob@caligula:~$ ssh-add Identity added: /home/rob/.ssh/id_rsa ¯ (/home/rob/.ssh/id_rsa) Identity added: /home/rob/.ssh/id_dsa ¯ (/home/rob/.ssh/id_dsa) Identity added: /home/rob/.ssh/identity ¯ (rob@caligula)
Ellenõrizzük, hogy a homer, bart és lisa gépeken beállítottuk-e az ügynökök kérelmeinek továbbítását. Ez ugyanis általában le van tiltva, de a következõ sor beírásával engedélyezhetõ: ForwardAgent yes
A fenti sort a ~/.ssh/config vagy a /usr/local/etc/ssh_config fájlba be kell jegyezni. Ezenkívül parancssorból is megadhatjuk a -A kapcsoló felhasználásával. Mostantól, ha a homer-rõl közvetlenül lépünk be bart-
217
#68
6. fejezet • Az SSH
#69
218
Linux bevetés közben
ra, a homer elõször az ügynökhöz fordul a szükséges hitelesítõ adatokért. Hasonlóképpen, amikor a bart-ról lépünk tovább a lisára, bart elõbb homer-hez fordul kérésével, ami azután továbbítja a kérést ügynökünkhöz. Ilyen módon könnyûszerrel ugrálhatunk géprõl gépre. rob@caligula:~$ ssh homer rob@homer:~$ ssh bart rob@bart:~$ ssh lisa rob@lisa:~$
Gratulálunk, sikerült létrehoznunk egy nagyon egyszerû hálózati navigációs rendszert, melyben nem kell aggódnunk SSH saját kulcsunk biztonsága miatt. Még a gépek közötti másolás (scp) is gyorsabb és könnyebb lesz, mint azelõtt volt. De mi történik, ha nem áll módunkban a legelején elindítani az ügynököt? (Gyakran ez a helyzet, amennyiben grafikus XDM bejelentkezõ felületen lépünk be, vagy ha OS X-et futtatunk.) Aggodalomra semmi ok, legalábbis, amíg nem olvastuk a [#69] „Az SSH-Agent futtatása grafikus felületen” címû trükköt. Amennyiben fontosnak tartjuk a biztonságot, ennél gyorsabban és egyszerûbben nemigen használhatjuk az SSH-t. Esetleg mégis? A választ a [#67] „Villámgyors SSHbejelentkezés” címû trükkben találjuk.
#69 Az SSH-Agent futtatása grafikus felületen Az SSH-Agent futtatása ablakos környezetben A [#68] „SSH-Agent, hatékonyan” címû trükkben a bejelentkezésre bemutatott tipp addig mûködik jól, amíg a kezdeti eval ssh-agent parancsot még a grafikus felület indulása elõtt ki tudjuk adni. Ezt a bejelentkezés során például a ~/.bash_login (vagy tcsh alatt a ~/.login) fájlban tehetjük meg. Amennyiben jelmondatokat használunk kulcsainkhoz (valószínûleg ezt szeretnénk), ez egyáltalán nem hatékony megoldás. Ablakkezelõ rendszerünk mindaddig nem fog elindulni, amíg a bejelentkezés után be nem gépeljük a kulcsok jelszavait. A módszer másik mellékhatása, hogy ha az SSH-Agent ügynökprogram valamiért leáll, mindig ki kell lépnünk az X-bõl, új ügy-
nököt kell indítanunk, majd újra be kell jelentkeznünk. Ráadásul néhány környezetben (például ilyen az OS X is) egyáltalán nincs is lehetõségünk parancsok futtatására a grafikus környezet indulása elõtt. Ahhoz, hogy ne kelljen elindítanunk feleslegesen minden egyes megnyitott ablakban az SSH-Agent-et (vagy átmásolgatni a környezeti változókat), próbáljuk meg a következõ kódot beilleszteni ~/.profile állományunkba: if [ -f ~/.agent.env ]; then . ~/.agent.env > /dev/null if ! kill -0 $SSH_AGENT_PID > /dev/null 2>&1 then echo "Stale agent file found. Spawning new ¯ agent..." eval `ssh-agent | tee ~/.agent.env` ssh-add fi else echo "Starting ssh-agent..." eval `ssh-agent | tee ~/.agent.env` ssh-add fi
A kód készít számunkra egy ~/.agent.env állományt, amelyben az éppen futó SSH-Agent-re mutató környezet található. Amikor az ügynök „meghal”, új terminál létrehozásával önmûködõen újabb indul (és egyben kulcsaink is betöltõdnek), amit az összes további ablak már osztottan használ. Na, ez már jobban hangzik: kívánságra újjáéledõ SSH-Agent.
Kapcsolódó anyagok • [#66] Gyors bejelentkezés SSH-ügyfélkulcsokkal • [#67] Villámgyors SSH-bejelentkezés
219
#69
6. fejezet • Az SSH