Tproger: Интересные приёмы и хитрости SSH

Перевод статьи «SSH Tips & Tricks» от Андрея Зинченко, руководителя отдела аналитики компании «Рексофт»

Несколько советов об эффективном использовании SSH. Поговорим о том как:

  • использовать двухфакторную аутентификацию для SSH подключений;
  • безопасно использовать «проброс ключа» (agent forwarding);
  • выйти из зависшей SSH сессии;
  • оставить терминал открытым при выходе или разрыве связи;
  • расшарить удаленный терминал с другом (без Zoom’а!).

Многофакторная аутентификация в 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. В нем есть несколько отличных дополнительных возможностей — встроенные табы и панели, такие же как в терминале macOS и возможность расшарить терминал с другим пользователем.
    Некоторые улучшают tmux с помощью Byobu —  пакета, который добавляет множество удобных функций и сочетания клавиш. Byobu поставляется вместе с Ubuntu и его легко установить на macOS через менеджер пакетов Homebrew.

Как расшарить удаленный терминал с другом

Когда решаешь сложную проблему с серверами, хотелось бы расшарить SSH-сессию с кем-то еще, кто находится в другом месте. tmux — это лучший инструмент для шаринга терминала. Итак, нужно сделать следующее:

  1. Убедитесь, что tmux установлен на вашем сервере в DMZ (или куда вы хотите подключиться).
  2. Вам обоим необходимо подключиться к серверу через SSH, используя один и тот же аккаунт.
  3. Один из вас должен запустить tmux, чтобы создалась tmux-сессия.
  4. Другой должен выполнить команду tmux attach.
  5. Вуаля! Вы расшарили терминал.

Если вам нужна более тонкая настройка мульти-пользовательских сессий, используйте tmate, это форк tmux, который позволяет делать расшаренные сессии еще проще.

ЕЩЕ НОВОСТИ

Меню