Безпечна оболонка (SSH)
SSH — це протокол, який керує невидимою половиною Інтернету: кожною віддаленою консоллю системного адміністратора, кожним кроком розгортання розробника, кожним надсиланням Git до приватного сховища. Він замінив telnet наприкінці 1990-х і з тих пір є протоколом безпечної оболонки за замовчуванням. Знання того, що він насправді робить, робить сенсом багато операцій.
Повний текст статті подано англійською мовою нижче.
SSH (Secure Shell) — це криптографічний мережевий протокол для безпечної роботи мережевих служб у незахищеній мережі. Найчастіше використовується для віддаленого входу в командний рядок («оболонка» в назві) і для передачі файлів, але основний протокол достатньо загальний, щоб тунелювати будь-яку програму TCP. SSH був створений Тату Юлененом у 1995 році після атаки з перехопленням пароля в його університеті; реалізація OpenSSH (розпочата в 1999 році) є найпоширенішою версією сьогодні.
Що надає SSH
Три властивості:
- Конфіденційність — зашифровано під час передачі. Спостерігачі мережі бачать зашифровані байти, а не команди чи паролі.
- IIntegrity — змінені пакети виявляються та відхиляються.
- Автентифікація обох сторін — клієнт автентифікується на сервері (пароль, відкритий ключ або інший метод), а сервер автентифікується на клієнт (через ключ хоста).
Поєднання замінює старіший пакет telnet, rlogin, rsh і rcp — усі вони передають облікові дані у відкритому вигляді.
Як працюють з’єднання SSH
Рукостискання, спрощено:
- Client відкриває TCP-з’єднання з сервером на порту 22 (може налаштувати).
- Обидві сторони обмінюються рядками версій.
- Обидві сторони обмінюються підтримуваними алгоритмами; оберіть найнадійніший взаємний шифр, KEX, MAC.
- Key exchange — як правило, криві X25519 або NIST. Обидві сторони отримують спільний секрет, не проходячи через канал у відкритому вигляді.
- Сервер надсилає свій ключ хоста, підписаний спільним секретом. Клієнт перевіряє ~/.ssh/known_hosts.
- З цього моменту все зашифровано за допомогою ключів, отриманих із спільного секрету.
- Клієнт автентифікується — за допомогою пароля, відкритого ключа чи іншого механізму.
- Зашифрований сеанс відкрито. Клієнт запитує оболонку, передачу файлів, перенаправлення портів або щось, що йому насправді потрібно.
Методи автентифікації
- Пароль. Користувач вводить пароль; він надсилається в зашифрованому вигляді всередині сеансу. Простий, але вразливий до атак із використанням облікових даних проти відкритих серверів SSH.
- Відкритий ключ. Клієнт має закритий ключ (зазвичай у
~/.ssh/id_ed25519); сервер має відповідний відкритий ключ у~/.ssh/authorized_keys. Клієнт підтверджує володіння закритим ключем, підписуючи запит від сервера. Жоден пароль не проходить мережею. Рекомендоване значення за замовчуванням майже для всіх випадків використання. - На основі сертифіката. ЦС підписує сертифікат для ключа користувача, включаючи термін дії та обмеження. Сервери довіряють ЦС, автоматично довіряють підписаним сертифікатам. Правильна модель для організацій з великою кількістю користувачів; замінює ssh-key-distribution nightmare.
- FIDO2 / hardware-key SSH. Остання версія OpenSSH підтримує ключі, захищені апаратним маркером безпеки. Захищений від фішингу, вимагає фізичного володіння.
- Багатофакторний — поєднайте вищезазначене. Пароль + ключ або пароль + апаратний маркер.
Доступ до оболонки поза межами: переадресація портів
SSH може тунелювати довільний трафік TCP через зашифрований сеанс:
- Переадресація локального порту (
-L):ssh -L 9000:internal:3306 user@bastionвідкриває локальний порт 9000, який тунелює доinternal:3306через бастіонний хост. Корисно для доступу до внутрішніх служб через вузол переходу. - Віддалене перенаправлення портів (
-R): протилежний напрямок. Віддалений хост отримує порт, який тунелює назад до служби на вашій машині. - Динамічна переадресація портів (
-D): SSH створює проксі-сервер SOCKS5 на вашій локальній машині. TCP-трафік будь-якої програми, спрямованої на нього, тунелюється через сеанс SSH. По суті, однокористувацька VPN через SSH.
SSH динамічна переадресація є єдиною найкориснішою VPN для бідних людей; кожен, хто десь має сервер, має до нього доступ.
Екосистема OpenSSH
- ssh — клієнт
- sshd — серверний демон
- scp — захищена копія (застаріла, тепер переважно замінена на sftp під hood)
- sftp — безпечний FTP, окремий протокол, який працює всередині SSH
- ssh-agent — кешує розшифровані ключі в пам’яті, щоб ви не вводили парольну фразу connection
- ssh-keygen — створює пари ключів
- ssh-copy-id — копіює ваш відкритий ключ у віддалений файл authorized_keys
Захист SSH-сервера
An Сервер SSH у загальнодоступному Інтернеті постійно бачить сканування облікових даних. Захист:
- Вимкнути автентифікацію паролем. Лише відкриті ключі. Видаляє весь вектор атаки із заповнення обліковими даними.
- Використовуйте ключі Ed25519. Сучасний, швидкий, маленький.
ssh-keygen -t ed25519— правильна команда для нових ключів. - Використовуйте порт, відмінний від стандартного. Маргінальний; здебільшого зменшує шум у журналі сканування.
- fail2ban або sshguard — блокувати IP-адреси після повторних невдалих спроб.
- Обмежити облікові записи користувачів, які можуть SSH.
AllowUserssshd_config. - Використовуйте VPN або Tailscale — взагалі не надавайте доступ до SSH загальнодоступному Інтернету, якщо можете цього уникнути.
- Аудит відомих_хостів і авторизованих_ключів. Видаліть ключі для користувачів, які залишилися; перевірте наявність неочікуваних записів.
Часті запитання
- Який порт використовує SSH?
- 22 за замовчуванням. Порт налаштовується; деякі оператори переміщують SSH на нестандартний порт, щоб зменшити трафік сканування в журналах. Це безпека через невідомість — корисна для гігієни, а не для фактичної безпеки. Справжня безпека – це надійна автентифікація.
- Чи SSH безпечніший за HTTPS?
- Різні моделі загроз. Обидва використовують сучасну криптографію та, по суті, однаково безпечні на рівні протоколу. SSH зазвичай використовується з автентифікацією за допомогою відкритого ключа (без паролів, дуже надійний), тоді як багато сайтів HTTPS все ще використовують автентифікацію за паролем (слабша за замовчуванням). Протоколи є одноранговими; практики розгортання відрізняються.
- Чи можу я використовувати SSH для передачі файлів?
- так <code>scp</code> і <code>sftp</code> працюють через SSH. SFTP є більш потужним сучасним вибором — відновлювані передачі, рекурсивні операції, атомарний запис. <code>rsync</code> також може використовувати SSH як транспортний засіб і є правильним інструментом для будь-якої нетривіальної передачі.
- Що таке ключ SSH?
- Пара відкритий/приватний ключ, що використовується для автентифікації. Приватний ключ знаходиться в <code>~/.ssh/id_*</code> на вашій машині; відкритий ключ встановлюється в <code>~/.ssh/authorized_keys</code> на серверах, до яких ви підключаєтеся. Втрата закритого ключа без парольної фрази є серйозною проблемою — будь-хто, хто має його, може увійти як ви. Завжди захищайте ключі SSH за допомогою парольної фрази.
- Чому SSH каже "ключ хоста змінено"?
- Ключ ідентифікації сервера змінився з моменту вашого останнього з’єднання — або сервер перебудували, або ключ було змінено, або щось не так (найбільш тривожний випадок: хтось видає себе за сервер). Не приймайте сліпо новий ключ; перевірити поза межами мережі в оператора сервера. Якщо це була законна ротація, видаліть старий ключ із unknown_hosts і прийміть новий.