Что такое SSH и как он работает?

SSH (Secure Shell или Secure Socket Shell) — сетевой протокол и набор утилит, с помощью которого администраторы создают безопасное соединение в незащищённой сети. Secure Shell обеспечивает аутентификацию по паролю и открытому ключу, а ещё передачу зашифрованных данных между двумя компьютерами по открытой сети.
В общем, для администратора это отличный инструмент для управления машиной удалённо. SSH использует модель “клиент-сервер”: сессия отображается в клиенте SSH, который соединяется с SSH-сервером, где эта сессия выполняется.
Реализации SSH часто включают поддержку прикладных протоколов для эмуляции терминала или передачи файлов. Ещё SSH может создавать безопасные туннели для других протоколов приложений. По умолчанию SSH-сервер прослушивает 22-й TCP-порт.
История SSH
SSH-1 появился в 1995 году благодаря Тату Юлёнену, который тогда был исследователем в Хельсинкском технологическом университете. Позже он основал SSH Communications Security — финскую компанию в сфере кибербезопасности. Через время в SSH-1 обнаружили уязвимости, и теперь эта версия считается устаревшей.
SSH-2 — текущая версия протокола — была принята Internet Engineering Task Force (IETF) в качестве спецификации Standards Track в 2006 году. SSH-2 несовместим с SSH-1, использует обмен ключами Диффи-Хеллмана и более строгую проверку целостности с использованием кодов аутентификации сообщений. Клиенты и серверы SSH могут использовать ряд методов шифрования, из которых наиболее широко используются Advanced Encryption Standard (AES) и Blowfish.
На данный момент в SSH-2 нет известных уязвимостей, которыми можно воспользоваться. Но Эдвард Сноуден в 2013 году говорил, что Агентство национальной безопасности (АНБ) может расшифровать часть трафика SSH.
Как работает SSH?
Этот протокол создавали для замены незащищённых эмуляторов терминала или программ входа в систему: Telnet, rlogin и rsh и т.п. Ещё SSH должен был заменять программы передачи файлов: например, FTP или rcp.
В основном SSH используется, чтобы подключиться к удаленному хосту для сеанса терминала. Форма команды следующая:
После этой команды клиент попытается подключиться к серверу с именем server.example.com по ID пользователя UserName. Если соединение устанавливается впервые, пользователю предложат ввести открытый ключ удаленного хоста и запрос на подключение:
The authenticity of host 'sample.ssh.com' cannot be established.
DSA key fingerprint is 01:23:45:67:89:ab:cd:ef:ff:fe:dc:ba:98:76:54:32:10.
Are you sure you want to continue connecting (yes/no)?
Ответ “да” продолжит сеанс, а ключ хоста сохранится в файле known_hosts локальной системы. Это скрытый файл, который по умолчанию хранится в скрытом каталоге с именем /.ssh/known_hosts в домашнем каталоге пользователя.
Когда ключ сохранится в файле known_hosts, клиентская система может снова подключиться к этому серверу без согласований — ключ хоста аутентифицирует соединение.
Возможности SSH
Вот что обеспечивает протокол:
- безопасный удаленный доступ к сетевым системам или устройствам с поддержкой SSH для пользователей;
- автоматизированные процессы;
- безопасные и интерактивные сеансы передачи файлов;
- автоматизированная и безопасная передача файлов;
- безопасная выдача команд на удаленных устройствах или системах;
- безопасное управление компонентами сетевой инфраструктуры.
SSH можно использовать в интерактивном режиме для включения терминальных сеансов. Лучше использовать его вместо менее безопасного Telnet. SSH также обычно используется в сценариях и другом ПО для удалённого доступа к данным и прочим ресурсам.
Реализации SSH
Как открытый протокол SSH был реализован для большинства платформ, а OpenSSH с открытым исходным кодом чаще всего встречается в Unix-like системах.
OpenSSH был портирован для работы в Windows PowerShell, начиная с 2015 года, а в 2018 году в Windows 10 была добавлена дополнительная поддержка OpenSSH.
PuTTY — ещё одна реализация SSH с открытым исходным кодом, доступная для Windows, macOS и BSD.
Большинство реализаций пакета SSH содержат три утилиты: slogin (безопасный вход), ssh и scp (безопасное копирование), которые являются безопасными версиями более ранних утилит Unix: rlogin, rsh и rcp.
Применение
SSH по умолчанию поставляется с серверами на Unix, Linux и Mac. Используется протокол для защиты многих типов связи между локальной машиной и удалённым хостом: сюда входят безопасный удалённый доступ к ресурсам, удалённое выполнение команд, поставка исправлений и обновлений и т.п. Ещё через SSH управляют маршрутизаторами, серверным хардвером, платформами виртуализации и операционными системами.
Secure Shell используется для подключения к серверам, внесения изменений, выполнения загрузки и выхода с помощью инструментов или напрямую через терминал.
Ключи SSH могут использоваться для автоматизации доступа к серверам, часто — в сценариях, системах резервного копирования и инструментах управления конфигурацией. Они разработаны так, чтобы быть удобными, работать вне организации и обеспечивать единый вход (SSO).
SSH важен для управления идентификацией и доступами, но делает больше, чем аутентификацию по зашифрованному соединению: весь трафик шифруется независимо от того, передают ли пользователи файл, просматривают веб-страницы или выполняют команду. Все их действия конфиденциальны.
SSH можно использовать с обычными user ID и паролем, но чаще это делают с парой открытых ключей для аутентификации хостов между собой. Например, для единичной сессии создаётся две пары ключей: первая нужна для аутентификации удалённой машины на локальной, вторая — наоборот.
Проблемы безопасности SSH
Если вы пользуетесь SSH, нужно подумать о способах управления ключами хоста в клиентских системах: со временем они могут накапливаться. С данными из файла SSH known_hosts можно получить аутентифицированный доступ к удалённым системам. Поэтому нужно помнить об их существовании и контролировать файлы, даже если система вышла из строя: данные в памяти могут храниться просто в виде текста.
Разработчикам тоже надо быть осторожными при работе с командами или функциями SSH в сценариях и программах. Можно аутентифицировать пользователя через user ID и пароль локальной учётной записи на удалённом хосте, но таким образом можно дать доступ к данным злоумышленнику, владеющему исходным кодом.
Дыра в безопасности в Bash с названием Shellshock может выполняться через SSH, но это уязвимость в Bash, а не в SSH. Самая большая угроза для протокола — плохое управление ключами. Без централизованного создания, ротации и удаления ключей SSH можно потерять контроль над тем, кто и когда имеет доступ ресурсам. Особенно это важно, когда SSH используют в автоматизированных процессах между приложениями.
SSH против Telnet
Telnet был одним из первых протоколов интернет-приложений, и он использовался для запуска и поддержки эмуляции терминала на удаленном хосте.
SSH и Telnet функционально похожи, но основное различие между ними — SSH использует криптосистему с открытым ключом. Так он аутентифицирует конечные точки при настройке сеанса терминала и шифрует команды сеанса и вывода.
Telnet в основном используется для эмуляции терминала, но и SSH может использоваться для этого. Ещё он может удалённо выдавать команды, как с rsh, передавать файлы с использованием протокола передачи файлов SSH (SFTP) и туннелировать другие приложения.
SSH против SSL/TLS
Протокол Transport Layer Security (TLS), который обновляет протокол Secure Sockets Layer (SSL), был разработан для обеспечения безопасности сетевых передач на транспортном уровне. SSH также работает на транспортном уровне или выше, но между двумя протоколами есть различия.
Оба стандарта полагаются на пары открытых/закрытых ключей для аутентификации хостов, но в TLS только сервер аутентифицируется с помощью пары ключей. SSH использует отдельную пару ключей для аутентификации каждого соединения: пара от локального к удаленному и пара с удаленного на локальный хост.
Еще одно различие между SSH и TLS заключается в том, что TLS позволяет шифрование соединений без аутентификации или аутентификацию без шифрования. SSH шифрует и аутентифицирует все соединения.
Вместо того чтобы требовать аутентификации по паролю для инициализации соединения между клиентом SSH и сервером, протокол аутентифицирует сами устройства. Это даёт подключаться к удаленным системам и изменять конфигурации SSH, в том числе добавлять или удалять пары ключей хоста в файле known_hosts.
Команды SSH
Есть графические реализации SSH, но нас интересует вызов из командной строки и выполнение как часть сценария. Выполнение команды ssh без аргументов, таких как целевой хост или идентификатор пользователя, возвращает список параметров и опций команды.
Самая простая форма команды SSH — это вызвать программу и указать имя хоста назначения или IP-адрес:
ssh server.example.org
Она подключится к месту назначения (server.example.org), целевой хост ответит запросом user ID и пароля учётки, под которой работает клиент. Другими словами, если используемый ID пользователя — jsmith, то удаленный хост запросит пароль, связанный с учетной записью jsmith на удаленном хосте. Во многих случаях идентификатор пользователя для удаленного хоста будет другим, и в этом случае команду следует вводить с идентификатором пользователя удаленного хоста:
SSH также можно использовать из командной строки, чтобы выполнить одну команду на удаленном хосте и затем выйти, например:
ssh example.org ls
Эта команда выполняет ls, которая отображает все содержимое текущего каталога на удаленном хосте. Так мы видим, что SSH можно использовать для выполнения более интересных команд на удаленном хосте.
Например, можно создать команду, инициирующую экземпляр сервера, который предоставит удаленной машине доступ к одному файлу или другому ресурсу, а затем завершит работу сервера после получение удалённым хостом доступа к файлу.
В дополнение к исполняемому файлу ssh, в SSH есть другие исполняемые команды:
sshd
— запускает SSH-сервер, который ожидает входящих запросов на SSH-соединение и позволяет авторизованным системам подключаться к локальному узлу;ssh-keygen
— программа для создания новой пары ключей аутентификации для SSH, которую можно использовать для автоматизации входа в систему, реализации SSO и аутентификации хостов;ssh-copy-id
— программа для копирования, установки и настройки ключа SSH на сервере для автоматизации входа в систему без пароля и единого входа;ssh-agent
— вспомогательная программа, которая отслеживает ключи идентификации и их парольные фразы. Из них SSH получает ключ шифрования, и позволяет юзеру использовать идентификационные ключи для входа на разные серверы без необходимости повторно вводить пароли или парольные фразы;ssh-add
— используется для добавления ключа к агенту аутентификации SSH и используется с ssh-agent для реализации SSO с использованием SSH;scp
— программа, используемая для копирования файлов с одного компьютера на другой, и защищенная SSH версия rcp;sftp
— программа для копирования файлов с одного компьютера на другой. SSH-защищённая версия ftp. SFTP стал предпочтительным механизмом для обмена файлами через Интернет, заменив FTP и FTP/S.
Туннелирование SSH
Туннели SSH — мощные инструменты как для администраторов, так и для злоумышленников: так они могут незаметно проходить через корпоративный межсетевой экран.
SSH-туннелирование или перенаправление портов SSH — метод, который даёт пользователю открыть безопасный туннель между локальным и удаленным хостами.
Перенаправление портов SSH — это метод перенаправления сетевого трафика на определенный порт/IP-адрес так, что удаленный хост становится напрямую доступным для приложений на локальном хосте. Пункт назначения может быть на удаленном сервере SSH или этот сервер может быть настроен для пересылки на еще один удаленный хост.
Авторские курсы системного администрирования от учебного центра – IT Education Center