SSH протоколът работи по клиент-сървър модела и отговаря за криптиране на информацията и аутентикацията между тях.
Клиентът е отговорен за началният handshake, уговаряне на начинът на криптиране, аутентикиране.
Сървърът е отговорен да слуша определен порт (по подразбиране 22), да участва в първоначалният handshake с клиента и да уговори начинът на криптиране, да аутентикира клиента.
SSH сесия се установява на два отделни етапа – 1) първо трябва да се договори начинът на криптиране на връзката, 2) тогава вече следва аутентикацията по тази криптирана връзка и 3) след това самата обмяна на информация.
Демек, нищо не става преди първо да се договори начинът на криптиране. И от там нататък, всичко – криптирано.
- Negotiating Encryption for the Session:
1.1. когато се установи TCP връзка, сървърът изпраща на клиента какви версии на SSH поддържа.
Ако клиентът не поддържа никоя от тях, връзката се прекъсва.
Сървърът предава на клиента също и своят public host key, с който клиентът може да разбере дали това е сървърът, към който наистина иска да се свърже (спомни си Chain of Trust).
1.2. следва договаряне на т.н. session key използвайки Diffie-Hellman algorithm.
This algorithm (and its variants) make it possible for each party to combine their own private data with public data from the other system to arrive at an identical secret session key.
Този ключ е симетричен, демек използва се както за криптиране на изходящите, така и декриптиране на входящите съобщения. Пак не забравяме – всичко това е само per session и само между сървъра и един клиент.
Веднъж договорен между двете страни, може да се пристъпи към аутентикация. - Authenticating the User’s Access to the Server:
2.1. Може да стане с парола, която сървърът изисква от клиента и клиентъ я изпраща, криптирана с установеният преди ключ. Това обаче не е достатъчно сигурно.
2.2. По-сигурен метод е използването на SSH key pairs, които са асиметрични, тоест с private ключа можеш само да декриптираш, а с public – само да криптираш. Публичният ключ, както личи от името му, може да се раздава свободно, защото няма начин да се получи private ключа от него.
SSH има няколко начина за криптиране/декриптиране на транспортираната информация.
Symmetrical Encryption
Вид кодиране, при което с един и същ ключ (представляващ най-вероятно някакъв хеш стринг) може да се криптират и декриптират съобщенията между страните в комуникацията. Демек, всеки, притежаващ съответният ключ може да участва в комуникацията.
Този тип кодиране се нарича още „shared secret“ кодиране или „secret key“ кодиране.
Този тип кодиране може да се използва за криптиране на цялата връзка, не само за криптиране при аутентикация.
Как се създава този ключ? Създва се от клиента и сървъра с процес, наречен „key exchange algorithm“. Това е процес, които е само между сървъра и клиента, и при който и сървърът, и клиентът, независимо един от друг изчисляват въпросният ключ, на базата на някаква публична информация. Важно е да се знае, че изчисленият ключ е session based и веднъж изчислен от страните в комуникацията, всяка последваща разменена информация трябва да е криптирана с него. Включително и аутентикацията, тоест всичко това става преди аутентикацията.
Asymmetric Encryption
Тук вече ни трябва двойка public/private ключ за да можем да изпратим успешно информация в една връзка.
Private ключа трябва да се пази тайно, той е единственият, с който може да се декриптира информация, криптирана със съответният public ключ. Public ключа може свободно да се споделя с тези, които искат да комуникират със сървъра и от public-a не може да се получи private ключа.
Щом някой може да декриптира информацията, значи има private ключа.
Важно е да се знае, че public ключа може само да криптира, но не и да декриптира, дори и своите съобщения не може да декриптира. Нито може да декриптира съобщенията, криптирани и изпратени му от съответният му private ключ.
Hashing
Използва се за проверка дали изпратената информация не е променена. Заедно с оригиналното съобщение се изпраща и неговият хеш (message authentication code – MAC). Може да има и предварително споделена секретна дума ако използваме HMAC.
Декодиране на полученият хеш както е известно, е невъзможно.
Този начин (hashing) се използва основно за верифициране дали информацията не е променена по пътя.
Литература: