[kecy]
Disclaimer: Ideologie může být místy nepodložená (prostě můžu kecat kraviny), ale praktické návody by měly fungovat :). Kde si nejsem jistá a nic mě zatím nenutilo si danou vec oveřit, přikládám poznámku NO WARRANTY s přiměřeným počtem vykřičníků. Pokud jsem na něco nepřišla, rozhodně to neznamená, že to nejde, takže mi nenadávejte, nýbrž buďte rádi, že jste se dozvěděli alespoň něco :), případně přidejte své komentáře a hinty do diskuse. Nehodlám zde přednést nic objevného, pouze dát do kupy užitečné věci, které jednak (ze zkušenosti) mnoho lidí vůbec neví, druhak já sama je sice znám a používám, ale kdybych to neměla sepsáno, musím to opakovaně hledat v man-pagích a věřím, ze mnozí z vás jsou na tom podobně. Text přehledně rozčlením na sekce [data] a [kecy], aby se vám v něm později snadněji hledalo :).
Milé děti,
předpokládám, že už jste všichni velcí, takže víte, že slova telnet a ftp jsou zapovězena (o BBSkách a anonymous ftp serverech se teď samozřejmě nebavíme), vaše hesla mají alespoň N znaků z K různých tříd, nemáte je napsaná na monitoru a občas si je měníte. Ale pro bezpecnost a pohodlí práce toho lze samozřejme udělat i více, zde si přiblížíme lehčí i težší paranoidní postupy při práci s ssh (z hlediska klienta, konfigurací serveru se zabývat nebudeme).
Slovníček – pojmovníček – análníček
OpenSSH x SSH
Existuje spousta různých ssh, na Linuxu potkáte s největší pravděpodobnosti jedno z těchto dvou – OpenSSH, které je součástí všech normálních distribucí a používá ho 99% lidí, a ssh, které není open (říkejme mu SSH, jak se obecně značí) a používá ho johanka. ssh malými písmeny zůstane jako označení obecného protokolu. SSH má nekomerční verzi (tou se zde budeme zabývat, komerční toho údajně umí více) s takovou zajímavou licencí, co jsem pochopila (NO WARRANTY!), tak většina normálních lidí se do toho vejde, např. pod Linuxem a Free-, Open-, NetBSD ho můžete používat nekomerčně i komerčně, akorát musíte odevzdat každé druhé hříbě, chci říct jakékoliv patche apod., co na SSH napíšete, a oni je pak mohou libovolně distribuovat. Ale jinak se mi tohle ssh líbí víc, zdrojáky k němu jsou, lépe se s ním pracuje, je v něm méně děr a vůbec, co se s váma budu hádat, je to moje věc :). To jen na vysvětlenou, proč většina postupů bude prezentována pro oba druhy ssh. K tomu, jak si OpenSSH a SSH povídají mezi sebou navzájem, se (doufám) dostaneme k závěru (jen nevím, kterého dílu..).
[/kecy][data]
Jaké ssh máte, zjistíte buď lokálně (klient)
johanka@atrey:~/.ssh$ ssh -V OpenSSH_3.4p1 Debian 1:3.4p1-1, ssh protocols 1.5/2.0, OpenSSL 0x0090603f johanka@arc:~$ ssh -V SSH: SSH Secure Shell 3.2.0 (non-commercial version) on i686-pc-linux-gnu
nebo vzdáleně (daemon na serveru)
johanka@atrey:~$ telnet localhost 22 Trying 195.113.31.123... Connected to atrey.karlin.mff.cuni.cz. Escape character is '^]'. SSH-1.99-OpenSSH_3.4p1 Debian 1:3.4p1-1 johanka@atrey:~$ telnet arc.ms.mff.cuni.cz 22 Trying 195.113.18.218... Connected to arc.ms.mff.cuni.cz. Escape character is '^]'. SSH-2.0-3.2.0 SSH Secure Shell (non-commercial)
Dá se předpokládat, že klient i daemon budou ze stejného vrhu, ale nikdy nevíte :). Za domácí úkol zkuste poznat, které je které ;))). Ulovili-li jste něco úplně jiného, samozřejmě se pochlubte do diskuse. SSH-x.xx značí verzi protokolu, kterou server podporuje (viz dále), 1.99 znamená, že 1 i 2.
[/data][kecy]
Pokud budu mluvit o tom, že dané ssh umí či defaultně dělá to či ono, vždy se tím rozumí přiměřeně aktuální verze, tedy u OpenSSH 3.4p1 a výše (nejnovější je tuším 3.5p1), u SSH 3.2.0 a výše. Mimochodem (thanx to qiq), verze OpenSSH se číslují tak, že vždy nejprve vyjde OpenSSH x.x (pro OpenBSD), poté k číslu verze přibyde p.x, což znamená portable, tedy i pro ostatní systémy.
OpenSSH si svůj (user-specific) bordýlek (klíče apod.) kompostuje (a taky ho tam posléze hledá) v adresáři ~/.ssh, SSH v ~/.ssh2, takže v tomto směru se nepotlučou, pěstujete-li obojí v jednom teráriu (k tomu se taky možná časem dostaneme :)).
Protokol 1 (1.x) x Protokol 2
Mezi těmito protokoly není (z uživatelského pohledu) žádný fatální rozdíl, protokol 1 používá pouze šifrování RSA, dvojka umí podle specifikace DSA a ve většině implementací i RSA, navíc jsou v ní vyladěné některé bugy a znemožněné některé druhy útoků, tedy je o fous bezpečnější. Aktuální OpenSSH podporuje 1 i 2, SSH pouze 2, potřebujete-li (např. kvůli scp kompatibilitě, viz někdy příště) protokol 1, můžete si z www.ssh.com stáhnout některou ze starších verzí a k aktuální dvojkové ji dobastlit. Jaký protokol upřednostňuje vaše OpenSSH, zjistíte v /etc/ssh/ssh_config. Hledejte nezakomentovanou řádku, která bude vypadat něco jako Protocol 1,2 nebo Protocol 2,1 :). Pokud tam žádná taková není, zjistíte default experimentálně :) (já experimentálně zjistila 2, ale NO WARRANTY). Použití vytouženého protokolu v OpenSSH si buď určíte v souboru config (viz někdy příště), nebo forcenete parametrem –2 nebo –1. Já osobně mám raději protokol 2, proto jsou klíčové postupy vyzkoušeny pouze pro něj, použití pro 1 (je velmi podobné až stejné) naznačím.
RSA x DSA (též DSS)
Jak jsem už uvedla, při použití ssh protokolu 1 nemáte na výběr, u 2 většinou ano. V zásadě je to jedno, RSA bylo dřív chráněno patentem nebo čímsi takovým, teď už není, bezpečnostní díru v SSL také zatím na ssh nikdo neportoval :). Ohledně klíčů serveru (viz dále), SSH ukazuje pri konexi fingeprinty z DSA public klíčů, OpenSSH se dohodne, defaultně RSA, lze nastavit (to abyste se nedivili, ze vám váš oblíbený server podle typu klienta hlásí různé fingerprinty, ale víc než tři různé by být neměly :)). Ohledne klíčů uživatelů, SSH defaultně generuje DSA a umí i RSA, OpenSSH umí také obě a musíte mu vytouženou šifru explicitně zadat opšnou. Já preferuji DSA, a proto budou příklady pro něj (RSA verze lze odvodit triviální modifikací).
Klíč x Fingerprint
Klíč je obecně věc větší dvoudílná a skládá se z public a private části (vzory ssh klíčů všech možných kategorií). Fingerprint je obecně věc malá jednodílná jednořádková, generovaná jednoznačně z daného public klíče, aby se pomocí ní pohodlněji kontrolovala shodnost oněch public klíčů, a vypadá nějak takto
1d:b6:94:d5:e1:5f:c3:cd:7d:07:53:3d:48:b7:86:c2
nebo takto
xukip-sihoh-hisah-kevad-fyzyt-bulah-cyzuz-mezid-bereg-lovys-pixux
Jde o jiné otisky téhož public klíče, prvnímu formátu se říká SHA-1 (podle algoritmu, kterým je generován) a používá jej OpenSSH, druhému se říká Bubble Babble, je generován pomocí MD5 a používá jej SSH. OpenSSH umí i bublavý MD5 fingerprint, zatímco SSH SHA-1 neumí (NO WARRANTY).
První akční paranoidní postup – kontrola public klíče serveru.
Já to teda v životě nedělala, takže jsem dost nevěřila :), když se kamarád z mé chroustalky logoval k sobě domů a hned vytáhl análníček, kde si kontroloval fingerprint stroje. Ale chcete-li být úderní, je to dobrý způsob, jak zamezit odposlechnutí (zneužití, podchycení, rozvrácení, pozvracení…) konexe. Pokud public key serveru, na který se logujete, sedí, vydáváte se všanc pouze potenciálním škůdcům sedícím přímo na vašem stroji nebo onom serveru (resp. tomu, kdo ukradl privátní klíč serveru, ale to většinou už znamená, že se tam usídlil :)).
Jistě ty dialogy o klíči serveru znáte, při prvním připojení z místa A na místo B se vás ssh samo zeptá, jestli se vám fingeprint místa B líbí, pak si public klíč uloží a vysílá warningy jen tehdy, když se změní. Pozor, pokud se klíč změnil, v 99% případů to neznamená žádný útok, nýbrž pouze to, ze stroj byl jemněji či hruběji přeinstalován. Pokud o tom víte, nic se neděje, ale ssh občas prudí a nechce vás pustit dál, v tom případě pomůže (if OpenSSH) smazání příslušných řádek (začínajících jménem cílového stroje) v ~/.ssh/known_hosts (já nejsem troškař a rovnou smažu celé known_hosts, kdo to tam má hledat :)) resp. (if SSH) smazání příslušných souborů v ~/.ssh2/hostkeys.
[/kecy][data]
Fingerprint public klíče svého stroje zjistíte takto (server = stroj, na který se chci pojit, zrovna na něm sedím, klient = stroj, ze kterého si chci pojit):
Server i klient OpenSSH (vetšina případů):
echo /etc/ssh/ssh_host_*|xargs -n 1 ssh-keygen -l -f
Dostanu tři klíče a jeden z nich při konexi musí sedět, případně zvlášť takto (popořadě protokol 1 (RSA), 2 DSA, 2 RSA):
ssh-keygen -l -f /etc/ssh/ssh_host_key.pub ssh-keygen -l -f /etc/ssh/ssh_host_dsa_key.pub ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub
Server i klient SSH (default protokol 2 DSA):
ssh-keygen2 -F /etc/ssh2/hostkey.pub
Server OpenSSH, klient SSH (default protokol 2 DSA):
ssh-keygen -B -f /etc/ssh/ssh_host_dsa_key.pub
Server SSH, klient OpenSSH:
Tady je to složitější, protože SSH neumí generovat OpenSSH fingerprinty, ale my paranoici si poradíme (nebo se poradíme, a to s ještě horšími paranoiky :)). Následuje Laceův akční postup:
Klíč serveru zjistíme normálně, jako bychom se chtěli pojit z SSH.
johanka@arc:~$ ssh-keygen2 -F /etc/ssh2/hostkey.pub Fingerprint for key: xodev-sabuf-cafun-laruf-venob-zuzum-mekyc-logyb-nyfat-husiv-tuxux
Připojení se z neznámého klienta s OpenSSH:
johanka@atrey:~$ ssh arc The authenticity of host 'arc.ms.mff.cuni.cz (195.113.18.218)' can't be established. DSA key fingerprint is 7a:04:e5:41:6b:8a:5d:3f:95:50:89:03:95:8a:9e:64. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'arc.ms.mff.cuni.cz,195.113.18.218' (DSA) to the list of known hosts. johanka@arc.ms.mff.cuni.cz's password:
akceptujeme fingeprint, ale nezadáme heslo, nýbrž Ctrl+C
johanka@atrey:~$ ssh-keygen -B -l -f ~/.ssh/known_hosts | grep arc 1024 xodev-sabuf-cafun-laruf-venob-zuzum-mekyc-logyb-nyfat-husiv-tuxux arc.ms.mff.cuni.cz,195.113.18.218
Vidíme, že bublavý fingerprint sedí, takže spustíme ssh znovu a tentokrát už se bez obav přihlásíme.
[/data][kecy]
Příště konečně dostanete slibovaný návod na výrobu klíčů (má to 17 kilo, tak bych to sem nenarvala :)).
Extra special thanx to: Lace, Qiq
Domácí úkol: Windoze (která nepoužívám, takže se mi po tom nechtělo pátrat) si public klíče strojů také někam ukládají a pak mají kecy, když se změní. Kam, a jak je odsmahnout, víte to někdo?