SSH

SSH ( — «безопасная оболочка») — сетевой протокол прикладного уровня, позволяющий производить удалённое управление операционной системой и туннелирование TCP-соединений (например, для передачи файлов). Схож по функциональности с протоколами Telnet и rlogin, но, в отличие от них, шифрует весь трафик, включая и передаваемые пароли. SSH допускает выбор различных алгоритмов шифрования. SSH-клиенты и SSH-серверы доступны для большинства сетевых операционных систем.

SSH позволяет безопасно передавать в незащищённой среде практически любой другой сетевой протокол. Таким образом, можно не только удалённо работать на компьютере через командную оболочку, но и передавать по шифрованному каналу звуковой поток или видео (например, с веб-камеры). Также SSH может использовать сжатие передаваемых данных для последующего их шифрования, что удобно, например, для удалённого запуска клиентов X Window System.

Большинство хостинг-провайдеров за определённую плату предоставляет клиентам доступ к их домашнему каталогу по SSH. Это может быть удобно как для работы в командной строке, так и для удалённого запуска программ (в том числе графических приложений).

Техническая информация о протоколе 
SSH — это протокол прикладного уровня. SSH-сервер обычно прослушивает соединения на TCP-порту 22. Спецификация протокола SSH-2 содержится в RFC 4251. Для аутентификации сервера в SSH используется протокол аутентификации сторон на основе алгоритмов электронно-цифровой подписи RSA или DSA, но допускается также аутентификация при помощи пароля (режим обратной совместимости с Telnet) и даже ip-адреса хоста (режим обратной совместимости с rlogin).

 Аутентификация по паролю наиболее распространена. При каждом подключении подобно https вырабатывается общий секретный ключ для шифрования трафика.
 При аутентификации по ключевой паре предварительно генерируется пара открытого и закрытого ключей для определённого пользователя. На машине, с которой требуется произвести подключение, хранится закрытый ключ, а на удалённой машине — открытый. Эти файлы не передаются при аутентификации, система лишь проверяет, что владелец открытого ключа также владеет и закрытым. При данном подходе, как правило, настраивается автоматический вход от имени конкретного пользователя в ОС.
 Аутентификация по ip-адресу небезопасна, эту возможность чаще всего отключают.

Для создания общего секрета (сеансового ключа) используется алгоритм Диффи — Хеллмана (DH). Для шифрования передаваемых данных используется симметричное шифрование, алгоритмы AES, Blowfish или 3DES. Целостность передачи данных проверяется с помощью CRC32 в SSH1 или HMAC-SHA1/HMAC-MD5 в SSH2.

Для сжатия шифруемых данных может использоваться алгоритм LempelZiv (LZ77), который обеспечивает такой же уровень сжатия, что и архиватор ZIP. Сжатие SSH включается лишь по запросу клиента, и на практике используется редко.

История и разработка 
Версия 1.x

В 1995 году Тату Юлёнен, исследователь из Технологического университета Хельсинки, Финляндия, разработал первую версию протокола (теперь называемого SSH-1), вызванную атакой по сбору пароля в его университетской сети.  Целью SSH было заменить более ранние протоколы rlogin, TELNET, FTP [16] и rsh, которые не обеспечивали строгую аутентификацию и конфиденциальность. Юлёнен выпустил свою реализацию как бесплатное ПО в июле 1995 года, и инструмент быстро завоевал популярность. К концу 1995 года база пользователей SSH выросла до 20 000 пользователей в пятидесяти странах.

В декабре 1995 года Юлёнен основал SSH Communications Security для продвижения и разработки SSH. Первоначальная версия программного обеспечения SSH использовала различные части бесплатного программного обеспечения, такие как GNU libgmp, но более поздние версии, выпущенные SSH Communications Security, превратились во всё более проприетарное программное обеспечение.

Было подсчитано, что к 2000 году количество пользователей выросло до 2 миллионов.

Версия 2.x

«Secsh» было официальным названием группы инженеров Интернета (IETF) для рабочей группы IETF, ответственной за версию 2 протокола SSH. В 2006 году обновлённая версия протокола SSH-2 была принята в качестве стандарта. Эта версия несовместима с SSH-1. SSH-2 отличается как безопасностью, так и улучшенными функциями по сравнению с SSH-1. Например, лучшая безопасность достигается за счёт обмена ключами Диффи-Хеллмана и строгой проверки целостности с помощью кодов аутентификации сообщений. Новые функции SSH-2 включают возможность запускать любое количество сеансов оболочки через одно соединение SSH. Из-за превосходства и популярности SSH-2 над SSH-1 некоторые реализации, такие как libssh (v0.8.0 +),  Lsh  и Dropbear , поддерживают только протокол SSH-2.

Версия 1.99

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

OpenSSH и OSSH

В 1999 году разработчики, желающие иметь свободную реализацию, вернулись к старому выпуску 1.2.12 исходной программы SSH, который последний раз выпускался под лицензией с открытым исходным кодом. Пакет OSSH Бьорна Грёнвалля был разработан на основе этой кодовой базы. Вскоре после этого разработчики OpenBSD использовали код Грёнвалля и, проделав большую работу над ним, создали OpenSSH, который поставлялся с версией OpenBSD 2.6. Начиная с этой версии, была сформирована ветвь «переносимости» для переноса OpenSSH на другие операционные системы.

По состоянию на 2005 год OpenSSH был самой популярной реализацией SSH, входящей по умолчанию в большое количество операционных систем. OSSH тем временем устарел. OpenSSH продолжает поддерживаться и поддерживает протокол SSH-2, исключив поддержку SSH-1 из кодовой базы с выпуском OpenSSH 7.6.

Стандарты и программные реализации 
Первая версия протокола, SSH-1, была разработана в 1995 году исследователем Тату Улёненом из Технологического университета Хельсинки (Финляндия). SSH-1 был написан для обеспечения большей конфиденциальности, чем протоколы rlogin, telnet и rsh. В 1996 году была разработана более безопасная версия протокола, SSH-2, несовместимая с SSH-1. Протокол приобрёл ещё большую популярность, и к 2000 году у него было около двух миллионов пользователей. В настоящее время под термином «SSH» обычно подразумевается именно SSH-2, так как первая версия протокола ввиду существенных недостатков сейчас практически не применяется.

В 2006 году протокол был утверждён рабочей группой IETF в качестве Интернет‐стандарта.

Распространены две реализации SSH: частная коммерческая и бесплатная свободная. Свободная реализация называется OpenSSH. К 2006 году 80 % компьютеров сети Интернет использовало именно OpenSSH. Частная реализация разрабатывается организацией SSH Communications Security, которая является стопроцентным подразделением корпорации Tectia, она бесплатна для некоммерческого использования. Эти реализации содержат практически одинаковый набор команд.

Протокол SSH-1, в отличие от протокола telnet, устойчив к атакам прослушивания трафика («снифинг»), но неустойчив к атакам «человек посередине». Протокол SSH-2 также устойчив к атакам путём присоединения посередине (), так как невозможно включиться в уже установленную сессию или перехватить её.

Для предотвращения атак «человек посередине» при подключении к хосту, ключ которого ещё не известен клиенту, клиентское ПО показывает пользователю «слепок ключа» (). Рекомендуется тщательно сверять показываемый клиентским ПО «слепок ключа» со слепком ключа сервера, желательно полученным по надёжным каналам связи или лично.

Поддержка SSH реализована во всех UNIX‑подобных системах, и на большинстве из них в числе стандартных утилит присутствуют клиент и сервер ssh. Существует множество реализаций SSH-клиентов и для не-UNIX ОС. Большую популярность протокол получил после широкого развития анализаторов трафика и способов нарушения работы локальных сетей, как альтернативное небезопасному протоколу Telnet решение для управления важными узлами.

Для работы по SSH нужен SSH-сервер и SSH-клиент. Сервер прослушивает соединения от клиентских машин и при установлении связи производит аутентификацию, после чего начинает обслуживание клиента. Клиент используется для входа на удалённую машину и выполнения команд.

Для соединения сервер и клиент должны создать пары ключей — открытых и закрытых — и обменяться открытыми ключами. Обычно используется также и пароль.

SSH-серверы 
 BSD: OpenSSH
 Linux: dropbear, lsh-server, openssh-server, ssh, Tectia SSH Server
 Windows: freeSSHd, copssh, WinSSHD, KpyM Telnet/SSH Server, MobaSSH, OpenSSH через Cygwin, Tectia SSH Server

SSH-клиенты и оболочки 
 GNU/Linux, *BSD: kdessh, lsh-client, openssh-client, putty, ssh, Vinagre, Tectia SSH (SSH Communications Security) Client
 MS Windows и Windows NT: PuTTY\KiTTY, SecureCRT, ShellGuard, Axessh, ZOC, SSHWindows, ProSSHD, XShell, Tectia SSH (SSH Communications Security) Client
 MS Windows Mobile: PocketPuTTy, mToken, sshCE, PocketTTY, OpenSSH, PocketConsole, Tectia SSH (SSH Communications Security) Client
 Mac OS: iTerm2, NiftyTelnet SSH, vSSH, 
 Symbian OS: PuTTY
 Java: MindTerm, AppGate Security Server
 J2ME: MidpSSH
 iPhone: i-SSH, ssh (в комплекте с Terminal), Termius, OpenTerm, LibTerm, Shelly
 Android: connectBot, Admin Hands, Server Auditor, JuiceSSH
 Blackberry: BBSSH
 MAEMO 5: OpenSSH
 MeeGo 1.2 Harmattan: OpenSSH

Советы по безопасности использования SSH 
 Запрет на удалённый root-доступ.
 Запрет подключения с пустым паролем или отключение входа по паролю.
 Выбор нестандартного порта для SSH-сервера.
 Использование длинных SSH2 RSA-ключей (2048 бит и более). Системы шифрования на основе RSA считаются надёжными, если длина ключа не менее .
 Ограничение списка IP-адресов, с которых разрешён доступ (например, настройкой файрвола).
 Запрет доступа с некоторых потенциально опасных адресов.
 Отказ от использования распространённых или широко известных системных логинов для доступа по SSH.
 Регулярный просмотр сообщений об ошибках аутентификации.
 Установка систем обнаружения вторжений (IDS).
 Использование ловушек, подделывающих SSH-сервис (honeypot).
 Реализация технологии.

Примеры использования SSH 
Команда подключения к локальному SSH-серверу из командной строки GNU/Linux или FreeBSD для пользователя pacify (сервер прослушивает нестандартный порт 30000):

 $ ssh -p 30000 pacify@127.0.0.1

Генерация пары ключей (в UNIX-подобных ОС) осуществляется командой

 $ ssh-keygen

Генерация пары SSH-2 RSA-ключей длиной 4096 бита программой puttygen под UNIX‐подобными ОС:

 $ puttygen -t rsa -b 4096 -o sample

Некоторые клиенты, например, PuTTY, имеют и графический интерфейс пользователя.

Для использования SSH в Python существуют такие модули, как python-paramiko и python-twisted-conch.

SSH-туннелирование 
SSH-туннель — это туннель, создаваемый посредством SSH-соединения и используемый для шифрования туннелированных данных. Используется для того, чтобы обезопасить передачу данных в Интернете (аналогичное назначение имеет IPsec). При пересылке через SSH-туннель незашифрованный трафик любого протокола шифруется на одном конце SSH-соединения и расшифровывается на другом.

Практическая реализация может выполняться несколькими способами:
 Созданием Socks-прокси для приложений, которые не умеют работать через SSH-туннель, но могут работать через Socks-прокси.
 Использованием приложений, умеющих работать через SSH-туннель.
 Созданием VPN-туннеля, подходит практически для любых приложений.
 Если приложение работает с одним определённым сервером, можно настроить SSH-клиент таким образом, чтобы он пропускал через SSH-туннель TCP-соединения, приходящие на определённый TCP-порт машины, на которой запущен SSH-клиент. Например, клиенты Jabber подключаются по умолчанию на порт 443. Тогда, чтобы настроить подключение к серверу Jabber через SSH-туннель, SSH-клиент настраивается на перенаправление подключений с любого порта локальной машины (например, с порта 4430) на удалённый сервер (например, jabber.example.com и порт 443):
$ ssh -L 4430:jabber.example.com:443 somehostВ данном случае Jabber-клиент настраивается на подключение к порту 4430 сервера localhost (если ssh-клиент запущен на той же машине что и Jabber-клиент).
Для создания ssh-туннеля необходима машина с запущенным ssh-сервером и доступом к jabber.example.com. Такая конфигурация может использоваться в случае, если с локальной машины доступ к jabber.example.com закрыт файрволом, но есть доступ к некоторому ssh-серверу, у которого ограничения доступа в Интернет отсутствуют.

См. также 

 SFTP
 SCP
 SSL
 TLS
 Mosh (программа)

Примечания

Ссылки 
Стандарты
 RFC 4250 — The Secure Shell (SSH) Protocol Assigned Numbers
 RFC 4251 — The Secure Shell (SSH) Protocol Architecture
 RFC 4252 — The Secure Shell (SSH) Authentication Protocol
 RFC 4253 — The Secure Shell (SSH) Transport Layer Protocol
 RFC 4254 — The Secure Shell (SSH) Connection Protocol
 RFC 4255 — Using DNS to Securely Publish Secure Shell (SSH) Key Fingerprints
 RFC 4256 — Generic Message Exchange Authentication for the Secure Shell Protocol (SSH)
 RFC 4335 — The Secure Shell (SSH) Session Channel Break Extension
 RFC 4344 — The Secure Shell (SSH) Transport Layer Encryption Modes
 RFC 4345 — Improved Arcfour Modes for the Secure Shell (SSH) Transport Layer Protocol
 RFC 4419 — Diffie-Hellman Group Exchange for the Secure Shell (SSH) Transport Layer Protocol
 RFC 4432 — RSA Key Exchange for the Secure Shell (SSH) Transport Layer Protocol
 RFC 4716 — The Secure Shell (SSH) Public Key File Format

SSH-клиенты
 OpenSSH — свободная библиотека и набор утилит для поддержки шифрования
 PuTTY — популярный кроссплатформенный SSH-клиент
 https://serverauditor.com/ - популярный мобильный кроссплатформенный SSH-клиент (Android, iOS, Google Chrome)
 Сравнение SSH-клиентов

Программы доступа к файлам
 WinSCP — SFTP-клиент для Microsoft Windows
 FileZilla — SFTP-клиент для Microsoft Windows, Linux, MacOS

Прочее
 Уязвимость в SSH 
 Теория и практика использования SSH
 Analyzing Malicious SSH Login Attempts
 Команды Linux / SSH
 SSH для администратора

Криптография
Unix
Текстовый интерфейс
Интернет-протоколы
SSH