Введение

Протокол сетевой криптографии

Протокол Secure Shell (SSH) — это криптографический сетевой протокол для безопасной работы сетевых служб по незащищенной сети. SSH был впервые разработан в 1995 году финским ученым-компьютерщиком Тату Йлёненом (для замены сетевого протокола Telnet). Последующая разработка протокола велась несколькими группами разработчиков, что привело к созданию различных вариантов реализации. Спецификация протокола различает две основные версии, известные как SSH 1 и SSH 2. Наиболее распространенным программным обеспечением является OpenSSH, выпущенный в 1999 году разработчиками OpenBSD как программное обеспечение с открытым исходным кодом. Реализации доступны для всех распространенных операционных систем, включая встраиваемые системы. Приложения SSH основаны на архитектуре клиент-сервер, соединяющей экземпляр SSH-клиента с SSH-сервером. SSH функционирует как многоуровневый протокол, состоящий из трех основных иерархических компонентов: транспортный уровень обеспечивает аутентификацию сервера, конфиденциальность и целостность данных; протокол аутентификации пользователя подтверждает личность пользователя на сервере; а протокол соединения мультиплексирует зашифрованный туннель в несколько логических каналов связи.

Определение

SSH использует криптографию с открытым ключом для аутентификации удаленного компьютера и, при необходимости, для аутентификации пользователя этим компьютером. SSH учитывает этот файл только в том случае, если он не доступен для записи никому, кроме владельца и root-пользователя. Если открытый ключ присутствует на удаленной машине, а соответствующий закрытый ключ – на локальной, ввод пароля становится необязательным. Однако для повышения безопасности сам закрытый ключ может быть защищен парольной фразой. Закрытый ключ также можно искать в стандартных каталогах, а его полный путь можно указать в качестве параметра командной строки (опция -i для ssh). Утилита ssh-keygen генерирует пары открытых и закрытых ключей.

Использование

SSH обычно используется для входа в оболочку удаленного компьютера или интерфейс командной строки (CLI) и для выполнения команд на удаленном сервере. Он также поддерживает механизмы туннелирования, пересылки TCP-портов и X11-соединений, а также может использоваться для передачи файлов с помощью связанного протокола передачи файлов SSH (SFTP) или протокола безопасного копирования (SCP). В Windows 10 версии 1709 теперь доступен официальный Win32-порт OpenSSH. Файловые менеджеры для UNIX-подобных систем (например, Konqueror) могут использовать протокол FISH для обеспечения графического интерфейса с разделенным экраном и поддержкой перетаскивания. Программа WinSCP с открытым исходным кодом для Windows обеспечивает аналогичные возможности управления файлами (синхронизация, копирование, удаленное удаление), используя PuTTY в качестве бэк-энда. WinSCP и PuTTY доступны в виде пакета для запуска непосредственно с USB-накопителя без необходимости установки на клиентском компьютере. Расширение Secure Shell для браузера Chrome также позволяет устанавливать SSH-соединения без установки какого-либо программного обеспечения и даже использовать SSH с компьютера Chromebook. Настройка SSH-сервера в Windows обычно включает в себя включение соответствующей функции в приложении "Параметры". SSH играет важную роль в облачных вычислениях, решая проблемы подключения и избегая проблем безопасности, связанных с прямым подключением облачной виртуальной машины к Интернету. SSH-туннель может обеспечить безопасный путь через Интернет и брандмауэр к виртуальной машине. IANA назначила TCP-порт 22, UDP-порт 22 и SCTP-порт 22 для этого протокола. IANA еще в 2001 году включила стандартный TCP-порт 22 для SSH-серверов в список известных портов. SSH также может работать с использованием SCTP вместо TCP в качестве протокола транспортного уровня с установлением соединения.

Версия 1

В 1995 году Тату Йлёнен, исследователь из Хельсинкского технологического университета в Финляндии, разработал первую версию протокола (впоследствии названного SSH 1) в ответ на атаку по перехвату паролей в сети своего университета. Целью SSH было заменить более ранние протоколы rlogin, TELNET, FTP и rsh, которые не обеспечивали надежную аутентификацию и не гарантировали конфиденциальность. Он выбрал номер порта 22, поскольку он расположен между портами telnet (23) и ftp (21). Йлёнен опубликовал свою реализацию как бесплатное программное обеспечение в июле 1995 года, и инструмент быстро приобрел популярность. К концу 1995 года число пользователей SSH выросло до пользователей в пятидесяти странах. В декабре 1995 года Йлёнен основал SSH Communications Security для коммерциализации и дальнейшей разработки SSH. Изначальная версия программного обеспечения SSH использовала различные компоненты свободного программного обеспечения, такие как GNU libgmp, но последующие версии, выпущенные SSH Communications Security, становились все более проприетарными. По оценкам, к 2000 году число пользователей достигло 2 миллионов.

Версия 2

В 2006 году, после обсуждения в рабочей группе под названием "secsh", пересмотренная версия протокола SSH, SSH 2, была принята в качестве стандарта. Эта версия обеспечивает повышенную безопасность и новые возможности, но несовместима с SSH 1. Например, в ней реализованы новые механизмы обмена ключами, такие как обмен ключами Диффи — Хеллмана, а также улучшена проверка целостности данных с помощью кодов аутентификации сообщений, таких как MD5 или SHA-1, которые могут быть согласованы между клиентом и сервером. SSH 2 также добавляет более надежные методы шифрования, такие как AES, которые со временем заменили более слабые и скомпрометированные шифры из предыдущего стандарта, например, 3DES. Новые возможности SSH 2 включают возможность запуска произвольного количества сеансов оболочки через одно SSH-соединение. Благодаря превосходству и популярности SSH 2 над SSH 1, некоторые реализации, такие как libssh (v0.8.0+), Lsh и Dropbear, в конечном итоге стали поддерживать только протокол SSH 2.

Версия 1.99

В январе 2006 года, спустя значительное время после утверждения версии 2.1, было определено, что SSH-сервер, поддерживающий версии 2.0 и более ранние, должен указывать свою версию протокола как 1.99. Этот номер версии не соответствует конкретной исторической редакции программного обеспечения, а служит способом обозначения обратной совместимости.

OpenSSH и OSSH

В 1999 году разработчики, стремясь к наличию версии свободного программного обеспечения, возобновили разработку, начав с выпуска 1.2.12 оригинальной программы SSH – последней версии, распространявшейся под лицензией с открытым исходным кодом. Она послужила кодовой базой для программного обеспечения OSSH, разработанного Бьёрном Гронваллом. Вскоре после этого разработчики OpenBSD сделали форк кода Гронвалла и создали OpenSSH, который поставлялся вместе с выпуском 2.6 OpenBSD. От этой версии была выделена ветвь "портабельности" для переноса OpenSSH на другие операционные системы. К 2005 году OpenSSH стала самой популярной реализацией SSH, являясь версией по умолчанию во многих дистрибутивах операционных систем. OSSH, тем временем, устарела. OpenSSH продолжает поддерживаться и работает с протоколом SSH 2, отказавшись от поддержки SSH 1 в выпуске OpenSSH 7.6.

Алгоритмы

EdDSA, ECDSA, RSA и DSA для криптографии с открытым ключом. ECDH и Diffie–Hellman для обмена ключами. AES (и устаревшие RC4, 3DES, DES) для симметричного шифрования. AES GCM и ChaCha20 Poly1305 для шифрования с аутентификацией (AEAD). SHA (и устаревший MD5) для формирования отпечатков ключей.

SSH-1

В 1998 году была описана уязвимость в SSH 1.5, которая позволяла несанкционированное внедрение данных в зашифрованный SSH-поток из-за недостаточной защиты целостности данных со стороны CRC 32, используемой в этой версии протокола. Для устранения уязвимости в большинство реализаций был внедрён механизм, известный как SSH Compensation Attack Detector. Многие из этих обновлённых реализаций содержали новую уязвимость, связанную с переполнением целочисленных переменных, которая позволяла злоумышленникам выполнять произвольный код с привилегиями демона SSH, обычно root. В январе 2001 года была обнаружена уязвимость, позволяющая злоумышленникам изменять последний блок сессии, зашифрованной алгоритмом IDEA. В том же месяце была обнаружена ещё одна уязвимость, позволяющая злонамеренному серверу перенаправлять аутентификацию клиента на другой сервер. Поскольку SSH 1 имеет принципиальные недостатки в архитектуре, делающие его уязвимым, он в настоящее время считается устаревшим и его следует избегать, явно отключив возможность возврата к SSH 1.

Восстановление чистого текста CBC

В ноябре 2008 года была обнаружена теоретическая уязвимость во всех версиях SSH, позволяющая восстановить до 32 бит открытого текста из блока зашифрованного текста, зашифрованного с использованием стандартного режима шифрования по умолчанию, CBC. Наиболее эффективным решением является использование режима CTR (счётчик), вместо режима CBC, поскольку это делает SSH устойчивым к данной атаке. Утечка информации, предоставленная информатором Эдвардом Сноуденом, предполагает, что Агентство национальной безопасности может быть способно расшифровывать часть трафика SSH. Технические подробности этого процесса не были раскрыты. Анализ хакерских инструментов ЦРУ BothanSpy и Gyrfalcon, проведённый в 2017 году, показал, что протокол SSH не был скомпрометирован.

Атака террапинов

Новая атака типа «человек посередине» против большинства современных реализаций SSH была обнаружена в 2023 году. Её первооткрыватели назвали её атакой Terrapin. Однако риск смягчается необходимостью перехвата действующей SSH-сессии, а также тем, что атака ограничена по масштабу и, по счастливой случайности, в основном приводит к сбоям подключения. Разработчики SSH заявили, что основное воздействие атаки заключается в снижении эффективности маскировки времени нажатия клавиш в SSH. Уязвимость была устранена в OpenSSH 9.6, но для полной эффективности исправления требуется обновление как клиента, так и сервера.