Цікаві прийоми та хитрості SSH

Цікаві прийоми та хитрості SSH
8 хв. читання
07 жовтня 2020

Кілька порад та хитростей для ефективного використання SSH. В цій статті ми поговоримо про:

Багатофакторна аутентифікація в SSH

Існує п'ять способів, як додати другий фактор для аутентифікації в SSH:

1. Оновіть OpenSSH і використовуйте апаратні токени

У лютому 2020 року в OpenSSH додали підтримку токенів FIDO U2F (Universal Second Factor). Це відмінна нова функція, але є нюанс.
Оскільки це оновлення додає нові типи ключів для підтримки токенів, його можна використовувати тільки, якщо оновити клієнта та сервер до версії 8.2 або новіше. Поточну версію клієнта можна перевірити командою ssh -V, для віддаленого сервера можна використовувати nc [servername] 22.

Також були додані два нових типи ключів - ecdsa-sk та ed25519-sk (з відповідними типами сертифікатів). Для створення ключових файлів вставте ваш токен в комп'ютер і виконайте команду

$ ssh-keygen -t ecdsa-sk -f ~/.ssh/id_ecdsa_sk

Ця команда створить відкритий і закритий ключі, прив'язані до вашого U2F токену. Закритий ключ на U2F пристрої використовується для розшифровки файлу закритого ключа, що зберігається на диску.

Також в якості другого фактора можна задати пароль для ключових файлів. OpenSSH підтримує ще один варіант генерації ключів типу -sk - «резидентні» ключі. В цьому випадку ключові файли зберігаються на U2F токені. Таким чином, ключі будуть завжди у вас з собою. Створити резидентний ключ можна командою

$ ssh-keygen -t ecdsa-sk -O resident -f ~/.ssh/id_ecdsa_sk

Щоб перенести ключовий файл на нову машину, необхідно вставити ключовий носій і виконати команду

$ ssh-add -K

Необхідно буде активувати ваш токен при підключенні.

2. Використовуйте PIV + PKCS11 і Yubikey

Якщо ви хочете підключатися до машин, де встановлені старіші версії SSH-сервера, ви можете використовувати токен іншим способом. Проєкт Yubikey публікує інструкцію U2F + SSH with PIV / PKCS11. Це не те ж саме, що у випадку з FIDO U2F. Потрібно трохи напружитися, щоб розібратися.

3. Використовуйте ssh-агент yubikey-agent.

Filippo Valsorda зробив SSH-агента для Yubikeys. Він зовсім новий і поки має мінімальний набір функцій.

4. Використовуйте Touch ID і sekey

Sekey - це SSH-агент з відкритим вихідним кодом, який зберігає закриті ключі в системі secure enclave для MacOS і дозволяє використовувати функцію підписання через Touch ID.

5. Використовуйте Single Sign On SSH

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

Безпечне використання переправляння ключа (agent forwarding)

Переправляння ключа в SSH дає доступ віддаленого хосту до вашого локального SSH-агента. Коли ваш SSH-клієнт використовує переправлення ключа (зазвичай активується опцією ssh -A), в поєднанні присутні 2 канали - ваша інтерактивна сесія і канал переправлення ключа. Локальний SSH-агент створює IPC-сокет, який підключається до віддаленого хосту через цей канал. Це небезпечно, тому що користувач з правами рівня root на віддаленій машині має доступ до вашого локального SSH-агента і потенційно може використовувати його для доступу до ресурсів мережі від вашого імені. Зі стандартним SSH-агентом, який поставляється в складі OpenSSH, ви ні за що не впізнаєте, що таке сталося. Але якщо ви використовуєте U2F ключ (або Sekey), ви зможете припиняти будь-які спроби використання вашого SSH-агента.

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

Вихід з SSH-сесії яка зависла

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

Ось кілька способів, як вийти з  сесії що зависла:

  1. Автоматичний вихід при розриві мережі. До вашої SSH-конфігурації .ssh/config потрібно додати:
    ServerAliveInterval 5
    ServerAliveCountMax 1

    SSH перевірятиме з'єднання, відправляючи echo-запити на віддалений хост кожні ServerAliveInterval секунд. Якщо понад ServerAliveCountMax таких запитів залишаться без відповіді, то SSH закриє з'єднання.

  2. Розірвати сесію. SSH використовує символ ~ як  послідовність для керування за замовчуванням. Команда ~. закриває поточне з'єднання і повертає в термінал (вводити керуючі послідовності можна тільки в новому рядку).
    Команда  ~? виводить список команд, які можна використовувати в поточній сесії. Якщо у вас клавіатура з декількома мовами, вам можливо доведеться натискати кнопку ~ двічі, щоб відправити цей символ.

    Чому сесії зависають? Коли був винайдений Інтернет, комп'ютери були не особливо мобільними. Коли ви працюєте на ноутбуці і перемикаєтеся між IPv4 WiFi мережами, ваа IP-адреса змінюється. Оскільки SSH базується на TCP-з'єднанні, а TCP-з'єднання залежать від точок підключення з незмінними IP-адресами, то кожен раз, коли ви підключаєтеся до іншої мережі, ваше SSH-з'єднання втрачається. Коли ваш IP-адреса змінюється, проходить деякий час, перш ніж мережевий стек виявить, що з'єднання було втрачено. TCP-з'єднання не передбачає швидкого закриття з'єднання однією із сторін у разі проблем в мережі, тому воно буде намагатися повторювати відправку даних ще якийсь час. У вашому ж терміналі сесія буде виглядати такою що зависла. IPv6 додає функціональність, що дозволяє пристроям зберігати свою IP-адресу при перемиканні між мережами.

Як залишити термінал  на віддалений хост відкритим

Є два варіанти, як зберегти сесію, коли ви перемикаєтеся між мережами або хочете на час відключитися:

1. Використовуйте Mosh або Eternal Terminal

Якщо вам дійсно потрібне з'єднання, яке не падає, навіть якщо ви перемикаєтеся між мережами, використовуйте Mosh - mobile shell. Mosh - це захищена оболонка, яка використовує SSH для ініціалізації сесії (handshake), після чого перемикається на власний зашифрований канал. Цей канал дуже стабільний. Він може обробляти різні ситуації, включаючи розриви з'єднання з інтернетом, зміну IP-адреси вашого ноутбука, великі затримки при передачі мережею, та інше. Завдяки магії UDP і протоколу синхронізації, використовуваного Mosh.
Для використання Mosh його необхідно встановити як на вашому сервері, так і на клієнті та відкрити порти в діапазоні 60000-61000 для вхідного UDP трафіку на вашому віддаленому сервері. Після чого просто наберіть mosh user@server для підключення.

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

2. Використовуйте tmux

Якщо ви хочете підключатися і відключатися, коли заманеться і зберігати ту ж саму сесію на віддаленому сервері, використовуйте мультиплексор терміналу tmux. Якщо ваше SSH-з'єднання відвалюється, просто під'єднайтеся знову і наберіть tmux attach (або tmux a), щоб повернутися в сесію tmux. У ньому є кілька відмінних додаткових можливостей - вбудовані вкладки і панелі, такі ж як в терміналі macOS і можливість розшарити термінал з іншим користувачем.

Деякі покращують tmux за допомогою Byobu - пакета, який додає безліч зручних функцій і поєднання клавіш. Byobu поставляється разом з Ubuntu і його легко встановити на macOS через менеджера пакетів Homebrew.

Як розшарити віддалений термінал

Коли розв'язуєш складну проблему на сервері,  вам можливо б хотілося розшарити SSH-сесію з кимось ще, хто знаходиться в іншому місці. tmux - це найкращий інструмент для цьго. Отже, потрібно зробити наступне:

  1. Переконайтеся, що tmux встановлено на вашому сервері (або куди ви хочете під'єднатися).
  2. Вам обом необхідне з'єднання із сервером через SSH, використовуючи один і той же обліковий запис.
  3. Один з вас повинен запустити tmux, щоб створилася tmux-сессія.
  4. Інший повинен виконати команду tmux attach.
  5. Вуаля! Тепер ви обоє знаходитесь в спільному терміналі.

Якщо вам потрібне тонше налаштування мультисесії користувачів, використовуйте tmate, це форк tmux, який дозволяє робити розшарені сесії ще простішими.

Джерело: SSH Tips & Tricks

Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація