SSH je protokol slúžiaci na bezpečné prihlásenie na vzdialeného systém alebo na bezpečné pripojenie na iné sieťové služby cez sieť, ktorá nie je bezpečná.
Protokol SSH pozostáva z troch častí:
- SSH-TRANS: Protokol transportnej vrstvy, zabezpečujúci autentifikáciu servra a bezpečný prenos utajených údajov. Nepovinne môže robiť aj kompresiu a dekompresiu. Tento protokol je obyčajne postavený na TCP/IP vrstve, ale môže byť postavený na ľubovoľnom protokole zebezpečujúcom spoľahlivý dátový tok.
- SSH-USERAUTH: Protokol autentifikácie používateľa, teda klientskej strany. Beží nad transportnou vrstvou.
- SSH-CONN: Spojový protokol, ktorý multiplexuje jeden šifrovaný kanál na niekoľko logických kanálov. Beží nad protokolom autentifikácie používateľa.
Klient pošle požiadavku na vytvorenie spojenia na transportnej vrstve. Po autentifikácii používateľa sa posiela druhá požiadavka. To umožňuje, definovať nový protokol, ktorý bude spolupracovať s doteraz definovanými SSH protokolmi.
Spojový protokol poskytuje kanály, ktoré môžu byť použité na rôzne účely. Štandardný spôsob použitia je na bezpečnú interaktívnu komunikáciu so shellom, alebo na bezpečné prepojenie s ľubovoľným TPC/IP portom, alebo na bezpečné X11 spojenie.
Bezpečnostný kľúč
Každý server aj klient musí mať bezpečnostný kľúč. Server a klient môžu mať aj viacero kľúčov používajúce rôzne algoritmy. Viacero servrov alebo klientov môže zdieľať ten istý bezpečnostný kľúč. Každý server musí mať najmenej jeden kľúč pre každý vyžadovaný algoritmus s verejným kľúčom (V súčasnosti sa používa DES).
Bezpečnostný kľúč servra sa používa na overenie toho, že sa klient spojil so správnym servrom. Na to aby to bolo možné musí klient poznať verejný kľúč servra. Na tento účel môžu byť použité dve metódy:
- 1) Klient má vlastnú databázu obsahujúcu dvojice meno servra a jeho verejný kľúč. Táto metóda nevyžaduje žiadnu centrálnu správu, ani koordináciu treťou stranou. Nevýhodou tejto metódy je, že sa databáza kľúčov môže veľmi rozrásť a tak sa jej udržiavanie stane náročným.
- 2) Dvojica server-kľúč je certifikovaná dôveryhodnou certifikačnou autoritou. Klient pozná iba koreňový kľúč certifikačnej autority a pomocou neho dokáže overiť všetky kľúče certifikované touto autoritou.
Druhá metóda síce rieši problém správy lokálnej databázy kľúčov, ale zas vyžaduje aby všetky vygenerované kľúče boli pred začatím používania certifikované nejakou centrálnou autoritou. Pri tejto metóde závisí bezpečnosť viacerých servrov od bezpečnosti centrálnej autority.
Protokol volitelne umožňuje prvé spojenie bez overenia dvojice meno servra, bezpečnostný kľúč. To umožnuje komunikáciu bez predošlého prenesenia bezpečnostného kľúča alebo certifikátu. Takéto spojenie je chránené voči pasívnemu odposluchu, ale nie je chránené voči aktívnemu útočníkovi, ktorý dokáže predstierať, že je jednou z komunikujúcich strán.
Rozšíriteľnosť
Jedným z návrhových cieľov bolo aby bol samotný protokol čo najjednoduchší. Prídavné algoritmy a metódy ako napríklad šifrovacie algoritmy, alebo spôsoby autentifikácie sú definované osobitne.
Bezpečnostné vlastnosti
Použité šifrovacie algoritmy a algoritmy s verejným kľúčom sú všeobecne známe.
Dĺžka paketu
K prenášaným údajom sa pridávajú hlavičky. Tým sa zvyšuje množstvo prenášaných dát. Ak sú dáta posielané vo veľkých paketoch, tak v pomere k nim je veľkosť hlavičky takmer zanedbateľná. Pri prenose veľmi malých paketov, ako napríklad pri interaktívnej komunikácii so shellom, je prírastok veľkosti veľmi významný.
Minimálna dĺžka TCP/IP hlavičky je 32 byte-ov. Pri prenose jedného byte-u je celková dĺžka IP paketu 33 byte-ov. Pridaním SSH hlavičky sa zvýši dĺžka na 51 byte-ov. Minimálna dĺžka dát v ethernetovom rámci je 46 byte-ov [RFC-894]. Teda skutočná dĺžka sa zvýši o 5 byte-ov. Preto pri použití ethernetu narastie množstvo prenášaných dát o 10%. Pri použití PPP protokolu je tento nárast veľkosti paketu významnejší.
Maximálna dĺžka paketu má významný vplyv na odozvu. Najmä keď je k dispozícii pomalá linka. Maximálna dĺžka paketu sa dá nastaviť pre každý kanál zvlášť.
Reprezentácia údajov
Na reprezentáciu údajov sa používajú štandardné typy char, uint32. Okrem nich sa používa typ boolean, ktorý je reprezentovaný ako char, pričom hodnota 0 znamená FALSE a nenulová hodnota TRUE. Polia a stringy sú reprezentované ako postupnosti ľubovoľných byte-ov. Pričom dĺžka postupnosti je určená pomocou uint32. Pole nie je ukončený nulou.
Okrem spomínaných typov sa v SSH protokole používa aj typ mpint, ktorý predstavuje integer s ľubovoľnou veľkosťou. Na jeho reprezentáciu sa používa pole.
Číselná IP adresa je reprezentovaná ako reťazec. Menné adresy sa nepoužívajú, kvôli tomu, že DNS protokol nie je bezpečný. Ak adresa obsahuje znak ':', tak je interpretovaná ako IPv6 adresa [RFC-1884].
Mená použitých šifrovacích, kompresných a iných algoritmov sú reprezentované textovým menom.
Message number
Každý SSH paket má 'message numbeŕ, ktoré je z intervalu 1-255. Tieto čísla majú nasledujúci význam:
1-19 pakety transportnej vrstvy. Ako napríklad disconnect, ignore ,debug ...
20- 29 dohodnutie algoritmu
30- 49 dohodnutie metódy výmeny kľúčov
50- 59 pakety pre autentifikáciu používateľa
60- 79 špecifické pakety závislé od metódy autentifikácie používateľa
80- 89 pakety pre spojový protokol
90-127 správy vzťahujúce sa ku kanálom
128-191 rezervované pre budúce klientské protokoly
192-255 pre ďalšie rozšírenie
Protokol transportnej vrstvy
Tento protokol zabezpečuje šifrovanie a autentifikáciu strojov. Okrem toho zabezpečuje dohodnutie metódy výmeny kľúčov, algoritmu verejného kľúča, symetrického šifrovania, algoritmu autentifikácie a iných algoritmov a parametrov.
Predpokladá sa, že na dohodnutie všetkých potrebných parametrov vrátane zvolenia služby budú vo väčšine prípadov potrebné dve výmeny informácií.
SSH transportný protokol funguje na transparentnom 8 bitovom prenose, ktorý by mal zabezpečiť bezchybný prenos. Pričom spojenie iniciuje klient. Ak je SSH použité v sieti TCP/IP, tak server čaká obyčajne na porte 22.
Po nadviazaní spojenia musia obe strany vyslať svoj identifikačný reťazec vo formáte: "SSH-protokolováverzia-verziasoftwaru poznámka". Za týmto reťazcom nasledujú znak CR a LF. Obe strany však musia byť schopné spracovať tento reťazec aj bez znaku CR. Maximálna dĺžka tohto reťazca je 255 znakov vrátane znakov CR a LF.
Pred identifikačným reťazcom sa môžu posielať aj iné riadky zakončené CR LF, ktoré nesmú začínať znakmi "SSH-". Tieto riadky môže prijímacia strana buď ignorovať, alebo ich vypísať používateľovi. Jedným s z dôvodov prečo je podporovaná táto vlastnosť, je použitie TCP wrappera, ktorý môže vypísať nejakú informáciu pred zrušením spojenia.Bezprostredne po odoslaní identifikačného reťazca prebehne výmena kľúčov.
Formát paketov
Každý paket je nasledujúceho formátu:
uint32 dĺžka paketu (bez MAC)
byte dĺžka padding-u
byte[n] údaje. n = dĺžka paketu - dĺžka padding-u - 1
byte[x] padding. x = dĺžka padding-u
byte[m] MAC (Message Authentication Code) m = mac_length
Pole údaje môže byť v prípade, že bola dohodnutá kompresia kompresované. Pole MAC obsahuje autentifikáciu správy, ak bola dohodnutá autentifikácia správ.
Dĺžka celého paketu okrem MAC musí byť násobkom dĺžky bloku alebo čísla 8, podľa toho, ktoré je väčšie.
Všetky implementácie musia byť schopné pracovať s paketmy, ktorých nekompresované údaje sú 32768 byte-ov dlhé a celková dĺžka nepresahuje 35000 byte-ov.
Ak bola dohodnutá kompresia, tak bude kompresované iba pole údaje dohodnutou metódou. Pre každý smer môže byť dohodnutá iná kompresia.
Šifrovanie
Algoritmus šifrovania sa dohodne počas výmeny kľúčov. Šifrované sú polia dĺžka paketu, dĺžka padding-u, údaje, padding každého paketu. Keďže všetky údaje v jednom smere sú prenášané jedným dátovým tokom, tak koncový stav šifrovania jedného paketu je začiatočným stavom šifrovania nasledujúceho paketu. Šifrovanie pre oba smery je nezávislé a môže byť pre každý smer zvolená iná metóda.
V súčasnosti sa používajú tieto šifrovacie algoritmy: 3des-cbc, blowfish-cbc, twofish-cbc, arcfour, idea-cbc, cast128-cbc .
Integrita údajov
Integrita údajov je zabezpečená vkladaním poľa MAC, ktoré je vypočítané zo sekvenčného čísla paketu, spoločného tajomstva a obsahu paketu. Vkladanie MAC je nezávislé pre oba smery prenosu a posiela sa nešifrované.
Na výpočet MAC sa v súčasnosti sa používajú nasledovné hashovacie algoritmy: hmac-sha1, hmac-sha-96, hmac-md5, hmac-md5-96.
Metóda výmeny kľúčov
Metóda výmeny kľúčov špecifikuje spôsob, ktorým sa vygenerujú kľúče na jedno konkrétne spojenie a ako sa autentifikuje server. V súčasnosti je definovaná len jedna metóda na výmenu kľúčov a tou je diffie-hellman-group1-sha1.
Algoritmus s verejným kľúčom
Verejný kľúč a certifikát sú reprezentované štruktúrou:
uint32 dĺžka identifikátora formátu a samotného kľúča
string identifikátor formátu
byte[n] kľúč / certifikát
Verejný kľúč môže, ale nemusí obsahovať certifikát. Verejný kľúč môže byť použitý na šifrovanie, alebo na podpisovanie. V súčasnosti sú v SSH používané tieto algoritmy: ssh-dss, x509v3, spki, pgp.
Podpis je reprezentovaný štruktúrou:
uint32 dĺžka
string názov metódy
string zašifrovaný podpis pozostávajúci z niektorých konštánt danej metódy.
Výmena kľúčov
Výmena kľúčov začne tým, že obe strany pošlu zoznam podporovaných algoritmov. Obe strany majú v každej kategórii svoj preferovaný algoritmus. Zoznam vyzerá takto:
byte SSH_MSG_KEXINIT
byte[16] cookie (random bytes)
string kex_algorithms
string server_host_key_algorithms
string encryption_algorithms_client_to_server
string encryption_algorithms_server_to_client
string mac_algorithms_client_to_server
string mac_algorithms_server_to_client
string compression_algorithms_client_to_server
string compression_algorithms_server_to_client
string languages_client_to_server
string languages_server_to_client
boolean first_kex_packet_follows
uint32 0 (reserved for future extension)
Každý reťazec je čiarkou oddelený zoznam názvov algoritmov, pričom prvý v poradí je preferovaný algoritmus. Každá kategória musí obsahovať najmenej jeden algoritmus. Pole cookie je náhodne vygenerované posielajúcou stranou.
Ak sa preferované algoritmy výmeny kľúčov zhodujú, tak sa použijú. Inak sa postupuje podľa zoznamu klientom podporovaných algoritmov, pričom sa zaradom skúšajú tie, ktoré podporuje aj server. Ak nevyhovuje žiaden algoritmus, tak obe strany prerušia spojenie. Obdobne funguje aj výber ostatných algoritmov.
Za týmto paketom nasleduje samotná výmena informácii o zvolenej metóde, ktorá je závislá od zvolenej metódy.
Service request
Po výmene kľúčov klient posiela požiadavku služby (server request). Služba je identifikovaná menom. V súčasnosti sú používané tieto mená: ssh-userauth a ssh-connection. Požiadavka vyzerá následovne:
byte SSH_MSG_SERVICE_REQUEST
string meno služby
Ak server zamietne túto požiadavku, tak pošle správu SSH_MSG_DISCONNECT a ukončí spojenie.
Ak server vyhovel žiadosti, tak posiela odpoveď
byte SSH_MSG_SERVICE_ACCEPT
string meno služby
Dodatočné správy
Každá strana môže kedykoľvek vyslať jednu z týchto správ:
Disconnect - ukončenie spojenia
byte SSH_MSG_DISCONNECT
uint32 dôvod
string popis
string jazyk
Možné dôvody: HOST_NOT_ALLOWED_TO_CONNECT, PROTOCOL_ERROR, KEY_EXCHANGE_FAILED, HOST_AUTHENTICATION_FAILED, MAC_ERROR, COMPRESSION_ERROR, SERVICE_NOT_AVAILABLE, PROTOCOL_VERSION_NOT_SUPPORTED, HOST_KEY_NOT_VERIFIABLE, CONNECTION_LOST, BY_APPLICATION.
Ignored Data Message - posielané dáta je nutné ignorovať
byte SSH_MSG_IGNORE
string dáta
Debug Message
byte SSH_MSG_DEBUG
boolean always_display
string správa
string jazyk
Unimplemented
byte SSH_MSG_UNIMPLEMENTED
uint32 sekvenčné číslo paketu s odmietnutou správou
Protokol autentifikácie používateľa
Protokol autentifikácie používateľa je všeobecný protokol na autentifikáciu používateľa. Pracuje na SSH transportnej vrstve.
Server najprv povie klientovi, aké spôsoby autentifikácie je ochotný akceptovať. Klient si z nich môže ľubovoľne vybrať. Server by mal mať vyhradený čas počas ktorého sa musí klient autentifikovať. Ak sa tak nestane do stanoveného času server spojenie automaticky preruší. Server by mal mať tiež limitovaný počet pokusov o prihlásenie.
Žiadosť o autentifikáciu vyzerá následovne:
byte SSH_MSG_USERAUTH_REQUEST
string používateľské meno
string meno služby
string názov metódy
zvyšok paketu je závislý od metódy
Meno služby predstavuje identifikáciu, služby, ktorá sa má vykonať po úspešnej autentifikácii. Ak požadovaná služba neexistuje autentifikácia, tak autentifikácia nebude prijatá.
Používané metódy autentifikácie sú: publickey, password, hostbased
Ak server zamietne požiadavku musí poslať následovnú správu:
byte SSH_MSG_USERAUTH_FAILURE
string zoznam prípustných metód autentifikácie
boolean čiastočný úspech
Odpoveď na úspešnú autentifikáciu je:
byte SSH_MSG_USERAUTH_SUCCESS
Po úspešnej autentifikácii server odštartuje požadovanú službu.
Banner
SSH server môže kedykoľvek pred úspešnou autentifikáciou poslať správu:
byte SSH_MSG_USERAUTH_BANNER
string správa, ktorú klient zobrazí
string jazyk
SSH Spojový protokol
SSH Spojový protokol beží nad protokolom autentifikácie používateľa. Zabezpečuje interaktívne login spojenie, vzdialené vykonanie príkazu a forwardovanie TCP/IP a X11 spojení.
Globálna požiadavka
Globálna požiadavka predstavuje požiadavku, ktorá nezávisí od kanálov. Jej formát je:
byte SSH_MSG_GLOBAL_REQUEST
string požiadavka
boolean je potrebná odpoveď
zvyšok je závislý od požiadavky
Server na túto požiadavku odpovie SSH_MSG_REQUEST_SUCCESS, alebo SSH_MSG_REQUEST_FAILURE.
Mechanizmus kanálov
Každá strana môže tvoriť kanál. Všetky kanály sú multiplexované do jedného SSH spojenia. Kanál je na oboch stranách identifikovaný číslom, ktoré môže byť na každej strane iné. Žiadosť o otvorenie kanála obsahuje odosielateľové číslo kanála. Ostatné žiadosti obsahujú príjemcové číslo kanála.
Kanály majú riadenie toku. Nemôže byť poslaná žiadna správa, pokým nepríde správa o tom že je kanál voľný.
Otvorenie kanála
Keď chce niektorá strana otvoriť kanál, tak najprv alokuje lokálne číslo kanálu a potom pošle následovnú správu:
byte SSH_MSG_CHANNEL_OPEN
string typ kanálu
uint32 odosielateľové číslo kanálu
uint32 začiatočná veľkosť okna
uint32 maximálna veľkosť paketu
údaje závislé na type kanálu
Opačná strana odpovie v prípade súhlasu paketom:
byte SSH_MSG_CHANNEL_OPEN_CONFIRMATION
uint32 číslo kanálu príjemcu
uint32 číslo kanálu odosielateľa
uint32 začiatočná veľkosť okna
uint32 maximálna veľkosť paketu
údaje závislé na type kanálu
V prípade nesúhlasu odpovie:
byte SSH_MSG_CHANNEL_OPEN_FAILURE
uint32 číslo kanálu príjemcu
uint32 kód dôvodu
string prídavná textová správa
string jazyk
Definované sú nasledovné dôvody: ADMINISTRATIVELY_PROHIBITED, CONNECT_FAILED, UNKNOWN_CHANNEL_TYPE, RESOURCE_SHORTAGE.
Prenos dát
Obe strany používajú riadenie toku dát v kanáloch metódou posuvného okna. Okno sa posúva príjemca správou:
byte SSH_MSG_CHANNEL_WINDOW_ADJUST
uint32 číslo kanálu príjemcu
uint32 počet byte-ov
Samotný prenos dát sa uskutoční nasledujúcou správou:
byte SSH_MSG_CHANNEL_DATA
uint32 číslo kanálu príjemcu
string údaje
Maximálna dĺžka prenášaných údajov je limitovaná veľkosťou okna.
Niektoré kanály môžu potrebovať prenášať rôzne typy údajov. Príkladom je chybový výstup pri komunikácii so shellom. Na prenos takýchto údajov slúži správa:
byte SSH_MSG_CHANNEL_EXTENDED_DATA
uint32 číslo kanálu príjemcu
uint32 typ dát
string údaje
V súčasnosti je definovaný iba typ DATA_STDERR.
Zatvorenie kanála
Keď jedna zo strán už nechce nič do kanála posielať, tak pošle správu:
byte SSH_MSG_CHANNEL_EOF
uint32 číslo kanálu príjemcu
Tento príkaz uzatvára kanál v jednom smere. V opačnom smere ešte môžu prísť ďalšie údaje. Ak chce niektorá zo strán uzavrieť kanál, tak pošle:
byte SSH_MSG_CHANNEL_CLOSE
uint32 číslo kanálu príjemcu
Na túto správu musí aj druhá strana odpovedať SSH_MSG_CHANNEL_CLOSE. Potom je kanál definitívne uzavretý a jeho číslo sa môže znovu použiť.
Špecifické kanálové správy
Niektoré typy kanálov majú špecifiká, ktorá sa využívajú pomocou špeciálnych správ, ktoré majú nasledujúci tvar:
byte SSH_MSG_CHANNEL_REQUEST
uint32 číslo kanálu príjemcu
string typ požiadavky
boolean potrebné odpovedať
údaje závislé od typu požiadavky
Ak je potrebné odpovedať, tak druhá strana pošle naspäť odpoveď SSH_MSG_CHANNEL_SUCCESS, alebo SSH_MSG_CHANNEL_FAILURE.
Interaktívna komunikácia so shellom
Interaktívna komunikácia so shellom sa otvára otvorením kanála typu "session". O pty možno požiadať špeciálnou kanálovov požiadavkou typu "pty-req".
Nastavenie enviromentových premenných sa uskutočňuje pomocou špeciálnej kanálovej požiadavky typu "env". Samotné spustenie shellu sa vyžiada špeciálnou kanálovov požiadavkou typu "shell". Vykonanie jedného príkazu bez spúšťania shellu sa dá vyžiadať pomocou "exec".
Ďalšie typy kanálov
Na forwardovanie X11 spojení slúžia kanály typu "x11"
Na forwardovanie TCP/IP spojení slúžia kanály typu "forwarded-tcpip"
Literatúra
http://www.ietf.org/internet-drafts/draft-ietf-secsh-architecture-04.txt
http://www.ietf.org/internet-drafts/draft-ietf-secsh-transport-06.txt
http://www.ietf.org/internet-drafts/draft-ietf-secsh-userauth-06.txt
http://www.ietf.org/internet-drafts/draft-ietf-secsh-connect-06.txt
|