Рубріки: Теорія

Що таке протокол SSH і як його використовувати?

Сергій Бондаренко

Що таке SSH

Хоча протокол SSH і розшифровується як Secure Shell, але насправді він не є шеллом. SSH – це протокол безпечного доступу до віддалених систем. В основному SSH використовується для доступу до серверів, для віддаленого доступу до консолі, до терміналу, до командного інтерпретатора віддаленої машини (скоріше за все ПК під керуванням Linux, але може бути інше мережеве обладнання або навіть пристрій з Windows). SSH застосовується різними способами, наприклад через цей протокол можна монтувати різні віддалені файлові системи, прокидати порти і т.д. SSH – це де-факто стандарт доступу до віддалених Linux-машин.

Історія створення протоколу

SSH була розроблена ще далекого 1995 року фінським інженером Тату Юльоненом з Технологічного університету в Гельсінкі.

Тату Юльєнен

Він працював над створенням механізму захисту, який служив би альтернативою TELNET, FTP та rsh, які не могли на той час гарантувати безпечну автентифікацію користувача в мережі (для написання першої версії використовувалася бібліотека libgmp). Тільки до кінця 1995 року загальна кількість користувачів SSH-1 зросла вже до двадцяти тисяч у п’ятдесяти країнах, а до 2000 року ця кількість збільшилася до двох мільйонів. 2006 року протокол пройшов оновлення, а його версія SSH-2 стала підтримувати обмін ключами Діффі-Хеллмана (покращена захищеність), перевірка відбувалася за допомогою MAC-підписів. Друга версія мала сумісність із SSH-1. Протокол SSH-2 міг запускати будь-яку кількість сеансів оболонки через одне з’єднання SSH.

На даний момент існують дві реалізації SSH, причому практично з однаковим набором команд: приватна комерційна і безкоштовна вільна OpenSSH. Переважна кількість комп’ютерів Інтернету використовує саме OpenSSH. Комерційна реалізація протоколу створюється SSH Communications Security, і також безкоштовна для некомерційного використання. Перша версія протоколу вже давно не підтримується, через велику кількість виявлених у ній уразливостей.

Як протокол працює

Цей протокол використовує клієнт-серверну архітектуру, тому SSH складається з двох частин – клієнтської та серверної. Звичайний SSH-сервер управляється клієнтською частиною, приймаючи вхідні підключення по 22 порту (за замовчуванням). Клієнтська частина може бути реалізована під різні платформи: десктопні, мобільні, серверні та ін. На сервері, до якого ви підключаєтеся, має працювати daemon sshd.

Daemon SSH

Для підключення SSH необхідно виконати в терміналі команду

ssh username@remote_host -p port

Наприклад, для підключення до сервера 51.306.148.242 в обліковий запис serge потрібно ввести
ssh serge@51.306.148.242
В данному прикладі порт не вказуємо, він береться за замовчуванням стандартний – 22.

Тунелювання

SSH-з’єднання може забезпечувати тунелювання даних, наприклад, для пересилання файлів. Особливість цієї функції полягає в тому, що незашифрований трафік будь-якого протоколу шифрується з одного боку SSH-тунелю, а розшифровується з іншого боку з’єднання. З практичної точки зору це може бути реалізовано або за допомогою Socks-проксі, або через через програми, що підтримують SSH-тунель, або через VPN-тунель. Якщо програма працює з одним певним сервером, можна налаштувати SSH-клієнт таким чином, щоб він пропускав через SSH-тунель TCP-з’єднання, що приходять на певний TCP-порт машини, на якій запущено SSH-клієнт. Наприклад, для клієнтів Jabber використовується порт 443. Так, щоб налаштувати підключення до сервера Jabber через SSH-тунелювання, SSH-клієнт налаштовується на перенаправлення підключень з будь-якого порту локальної машини (наприклад, з порту 4430) на віддалений сервер (наприклад, jabber.example .com та порт 443):

$ ssh -L 4430:jabber.example.com:443 будь_який_хост

 

Головний плюс SSH – у його безпеці та поширеності. Цей протокол можна знайти практично на будь-якій машині з Linux. Якщо ви встановили, скажімо, стандартну Ubuntu, там вже буде встановлений SSH —  ваш основний спосіб спілкування з цією машиною, будь то віртуальна машина чи фізичне залізо. На будь-якому Linux, як правило, вже встановлено клієнт SSH «з коробки», відповідно ви вибираєте самі яким командним інтерпретатором користуватися і як це виглядатиме зовні. Якщо використовувати комп’ютер під керуванням MacOS, там можна використовувати для клієнта SSH стандартний UNIX Terminal або одну з численних надбудов. Так, наприклад, можна порекомендувати використовувати для протоколу SSH програму iTerm2.

 

iTerm2 для MacOS

Для Windows є кілька клієнтів:

  • Putty (https://www.putty.org/) – маленька, легка безкоштовна програма
  • Xshell (https://www.netsarang.com/en/xshell/) – платний клієнт (проте, вільний для некомерційного використання), який розрахований на більш серйозне використання. Цю програму можна рекомендувати тим, хто працює з великою кількістю серверів (скажімо, більше десяти).

Xshell

  • OpenSSH – вбудований клієнт, який з’явився у Windows 10.
  • Cygwin (https://cygwin.com/) – ще один клієнт під Windows, головна особливість якого полягає у тому, що він підтримує команди Linux. Наприклад, у цій програмі SSL-сертифікати створюються так само, як і в Linux. Встановивши цю програму ви можете використовувати SSH зі звичайного командного рядка, через Power Shell та ін.

Інтерфейс Pytty

Важливим елементом безпеки SSH є генерація унікального відбитка fingerprint при кожній установці Open SSH сервера. Це дозволяє ідентифікувати сервер та захиститися від його заміни. Наприклад, коли сервер фізично вимкнений, хтось може взяти його IP-адресу, прослухати всі підключення і отримати всі паролі. У цьому ж випадку ви отримуєте попередження про те, що автентифікація fingerprint порушена. Важливим елементом безпеки SSH є генерація унікального відбитка fingerprint при кожній установці Open SSH сервера. Це дозволяє ідентифікувати сервер та захиститися від його заміни. Наприклад, коли фізично сервер вимкнений, хтось може взяти його IP-адресу, прослухати всі підключення і отримати всі паролі. У цьому ж випадку ви отримуєте попередження про те, що автентифікація fingerprint порушена.

SSH та ключі

Для максимальної безпеки зазвичай прийнято відмовлятися від паролів та використовувати практику ключів. Її суть полягає в тому, що генерується два ключі, один із яких є приватним, він зберігається лише у вас, а другий ключ – публічний. Оскільки другий ключ не становить цінності без першої частини, його можна публікувати та передавати. Якщо хтось хоче зашифрувати дані, він використовує публічний ключ. При цьому навіть той, хто зашифрував інформацію, відкрити її без приватного ключа не зможе. Також це використовується і у зворотньому напрямі – для гарантування цифрового підпису. Людина може зашифрувати дані, використовуючи свій приватний ключ – будь-який користувач зможе розшифрувати дані, користуючись публічним ключем. Таким чином можна переконатися, що відправник секретної інформації володіє другою частиною ключа, що гарантує цифровий підпис. 

Використання ключів має низку переваг, пов’язаних з безпекою. Насамперед їх досить важко зламати. При достатній довжині ключа зламати його методом перебору (атака методом брутфорс) або методом підбору за словником – завдання практично нездійсненне.

По-друге, під час використання ключів на сервері не зберігається жодної приватної інформації. При використанні пароля, наприклад, на сервері залишається парольний хеш, який, у разі доступу до зловмисників, є потенційною загрозою безпеці.

Крім того, використання ключів дає низку додаткових переваг. Наприклад, у звичайному випадку, коли створюється обліковий запис на сервері, генерується тимчасовий пароль, який необхідно змінювати при першій авторизації. Відповідно цей тимчасовий пароль потрібно якось передавати, що з міркувань безпеки є не дуже добре. З ключами все набагато простіше – ви передаєте свій публічний ключ, його прописують на потрібні сервери. При цьому є можливість призначити кілька ключів одному користувачеві. Це набагато зручніше та безпечніше, ніж при використанні паролів.

Так працюють ключі SSH

Генерація ключів

Процедура генерації пари ключів є досить простою. Її можна виконати за допомогою консольної команди ssh-keygen, яку підтримують усі SSH-клієнти.

ssh-keygen -t rsa

Згенеровані ключі будуть збережені у файлах  ~/.ssh/id_rsa.pub та ~/.ssh/id_rsa.

Однак, у нашому прикладі ми використовуємо програму PuTTY Key Generator, яка використовує свій формат зберігання приватного ключа (в разі необхідності він легко конвертується). Вказавши внизу, у правому нижньому куті вікна, довжину ключа, а також алгоритм шифрування, натискаємо Generate та чекаємо, паралельно рухаючи мишею, щоб створити «випадковість» для ключа. Публічний ключ відображається одразу, його можна копіювати через буфер обміну.

Генерація ключа в Putty

Для того, щоб отримати приватний ключ, ми спочатку повинні ввести пароль (дана процедура не є обов’язковою, але рекомендується з метою безпеки). До кожного ключа можна призначити свій коментар, наприклад, вказати ім’я користувача, щоб було зрозуміло чий він. Тепер нам потрібно прописати наш публічний ключ на сервер.

На сервері необхідно переміститися в домашню папку користувача та створити там папку .SSH:

ujin@ubuntu:~$ mkdir .ssh

Після того, як папка буде створена, необхідно встановити права тільки на нашого користувача, щоб інші користувачі не могли переглянути наші ключі:

ujin@ubuntu:~$ chmod 700 .ssh
ujin@ubuntu:~$ vim .ssh/autorized_keys

 

Після чого копіюємо вміст ключа через буфер обміну. Потім ми маємо виправити права на читання створеного файлу:
ujin@ubuntu:~$ chmod 600 .ssh/autorized_keys

Тепер машина готова до прийому нашого приватного ключа як механізму авторизації.

Висновок

Основна перевага SSH – простота, безпека та універсальність віддаленого доступу. У той час, як графічний інтерфейс автоматизувати досить проблематично, з віддаленим командним рядком це зробити досить просто. Завдяки використанню ключів протокол надійно захищає дані, забезпечуючи високий рівень безпеки. Для тих, кому цікава дана тема, рекомендуємо подивитися відео нижче в якому розповідається, як налаштувати доступ до сайту по SSH і працювати з командного рядка https://youtu.be/Ms-xEJzZahk

Останні статті

Більше 50% Go i Ruby розробників з досвідом 3+ роки найняли на $5000. PHP — на самому дні

Більше половини Go i Ruby розробників з досвідом 3+ роки найняли на $5000 або більше.…

26.04.2024

Програмісти намагалися втекти з України в Молдову, щоб влаштуватись на роботу

Прикордонники недалеко від с. Кучурган Одеської області затримали двох програмістів, які намагалися втекти з України…

26.04.2024

В Україні запускають безплатне навчання блокчейн-розробці на Solana

Українське Solana-комʼюніті Kumeka Team з 7 травня запускає безплатне навчання блокчейн-розробці — Solana BootCamp. Про…

26.04.2024

Не гаяли часу. Туреччина створила спеціальні візи для «цифрових кочівників» з України

Туреччина створила спеціальні візи для диджитал-номадів або «цифрових кочівників». Скористатися ними зможуть і українці. Про…

26.04.2024

Росіяни, вірогідно, вкрали для гри про ПВК «Вагнер» створені українцями ассети бійців СБУ

Російська студія NoName Company, вірогідно, вкрала для розробки тактичного шутеру Best in Hell про ПВК…

26.04.2024

11 травня відбудеться хакатон студентських інновацій University Software Bootcamp

11 та 12 травня в NAU HUB відбудеться хакатон студенських новацій University Software Bootcamp. Про…

25.04.2024