SSH (secure shell) – это безопасный протокол и наиболее распространенный способ защищенного управления удаленными серверами. Используя ряд технологий шифрования, SSH обеспечивает механизм для установления криптографически защищенного соединения между двумя сторонами, аутентификации каждой стороны, обмена командами и выходными данными.
Читайте также:
- Использование SSH для подключения к удаленному серверу Ubuntu
- Устранение неполадок SSH: как и когда искать ошибки?
- Тонкая настройка демона SSH на Linux VPS
В данной статье мы рассмотрим основные методы шифрования и установления защищенных соединений, которые использует SSH. Эта информация может быть полезна для понимания различных уровней шифрования и этапов формирования соединения и аутентификации.
Симметричное шифрование, асимметричное шифрование и хэш
Для обеспечения передачи информации SSH использует несколько различных методов управления данными в разных точках транзакции. К ним относится симметричное шифрование, асимметричное шифрование и хеширование.
Симметричное шифрование
Способ шифрования определяется связью компонентов, которые шифруют и дешифруют данные.
Симметричное шифрование – это способ шифрования, при котором для шифрования и дешифровки данных между сторонами используется один и тот же ключ. Это означает, что любой, у кого есть ключ, может шифровать и дешифровать сообщения других пользователей, у которых есть этот же ключ.
Такой тип также называется шифрованием с общим секретным ключом. Обычно при этом для всех операций используется только один ключ, или пара простых ключей.
Симметричные ключи используются в SSH для шифрования всего соединения. В свою очередь асимметричные пары ключей используются только для аутентификации, а не для шифрования соединения. Симметричное шифрование позволяет защитить парольную аутентификацию от отслеживания.
Клиент и сервер устанавливают этот секретный ключ, который не должен быть известен посторонним. Секретный ключ создается посредством так называемого алгоритма обмена ключами. Этот обмен приводит к тому, что сервер и клиент одновременно используют один и тот же ключ независимо друг от друга.
Ключ для симметричного шифрования зависит от сессии и обеспечивает шифрование данных, передаваемых между сервером и клиентом. Как только соединение установлено, ключ шифрует все данные между сервером и клиентом. Это делается до аутентификации клиента.
Протокол SSH может использовать различные системы симметричного шифрования, включая AES, Blowfish, 3DES, CAST128 и Arcfour. Сервер и клиент могут определить список поддерживаемых шифров и упорядочить его в зависимости от своих предпочтений. Первый шифр из списка клиента, который поддерживается сервером, используется в качестве алгоритма шифрования в обоих направлениях.
В Ubuntu 14.04 клиенты и серверы по умолчанию используют aes128-ctr, aes192-ctr, aes256-ctr, arcfour256, arcfour128, aes128-gcm@openssh.com, aes256-gcm@openssh.com, chacha20-poly1305@openssh.com, aes128-cbc, blowfish-cbc, cast128-cbc, aes192-cbc, aes256-cbc, arcfour.
То есть если две машины Ubuntu 14.04 пытаются установить соединение, не переопределяя стандартных параметров, они всегда будут использовать aes128-ctr для шифрования их соединения.
Асимметричное шифрование
Асимметричное шифрование отличается от симметричного тем, что для передачи данных в одном направлении необходимы два связанных ключа. Один из них называется закрытым (или секретным) ключом, а второй – открытым ключом.
Открытый ключ можно свободно распространять. Он связан с закрытым ключом, но закрытый ключ нельзя вычислить из открытого ключа. Математическая взаимосвязь между этими ключами позволяет открытому ключу шифровать сообщения, которые могут быть дешифрованы только закрытым ключом. Это одностороннее шифрование: открытый ключ не может расшифровывать зашифрованные им данные и все, что отправляет его закрытый ключ.
Закрытый ключ нужно хранить в секрете и никому не передавать. Это базовое правило асимметричного шифрования. Закрытый ключ является единственным компонентом, способным расшифровывать данные, которые были зашифрованы с помощью связанного с ним открытого ключа.
SSH использует асимметричное шифрование в нескольких разных задачах. Во время начального процесса обмена ключами для настройки симметричного шифрования сессии используется асимметричное шифрование. На данном этапе обе стороны генерируют временные пары ключей и обмениваются открытыми ключами, чтобы создать общий секретный ключ для симметричного шифрования.
Более широко асимметричное шифрование SSH используется для беспарольной аутентификации на основе ключей. Пары ключей SSH могут использоваться для аутентификации клиента на сервере. Клиент создает пару ключей и подгружает открытый ключ на удаленный сервер в файл authorized_keys в каталоге ~/.ssh.
После установки симметричного шифрования между сервером и клиентом клиент должен пройти аутентификацию для разрешения доступа. Сервер может использовать открытый ключ шифрования сообщения о вызове клиенту. Если клиент может расшифровать это сообщение, он подтверждает, что ему принадлежит связанный закрытый ключ. Затем сервер может настроить среду для клиента.
Хеширование
Еще одна форма обработки данных, которую использует SSH, – это криптографическое хеширование.
Криптографическое хеширование – это совокупность методов создания краткой «подписи» или сводки набора информации. Главными отличительными признаками методов хеширования являются их необратимость, непредсказуемость и уникальность.
Шифруя одно и то же сообщение с помощью одной и той же функции хэширования, вы получите один и тот же хэш. Изменится любая часть данных – получите совершенно другой хэш. Пользователь не должен иметь возможность воссоздавать исходное сообщение из хэша, но должен иметь возможность определить, выдало ли данное сообщение заданный хэш.
Учитывая эти свойства, хеши в основном используются для подтверждения целостности данных и проверки подлинности связи. Основное использование хэширования в SSH – это HMAC или хэш-коды аутентификации сообщений. Они позволяют подтвердить, что текст принятого сообщения не был изменен или поврежден.
В рамках согласования симметричного шифрования выбирается алгоритм кода аутентификации сообщения (MAC). Алгоритм выбирается путем обработки списка доступных MAC-адресов клиента. В результате будет использоваться первый алгоритм из этого списка, который поддерживает сервер.
Впоследствии каждое отправленное сообщение должно содержать MAC, чтобы другая сторона могла проверить целостность пакета. MAC вычисляется из симметричного общего секретного ключа, последовательности пакетов сообщения и фактического содержимого сообщения.
Сам MAC отправляется за пределы области симметричного шифрования в качестве конечной части пакета. Обычно рекомендуют зашифровать данные, а затем вычислить MAC.
Как работает шифрование?
Теперь у вас есть базовое понимание того, как работает SSH. В протоколе SSH используется модель клиент-сервер для аутентификации двух сторон и шифрования данных между ними.
Серверный компонент прослушивает соединения по указанному порту. Он отвечает за ведение переговоров о безопасном подключении, аутентификацию подключаемой стороны и создание правильной среды для клиента в случае, если он предоставил валидные учетные данные.
Клиент отвечает за рукопожатие TCP с сервером, согласование безопасного соединения, проверку соответствия сервера ранее записанной информации и за предоставление учетных данных для аутентификации.
Сессия SSH устанавливается в два этапа. Первый этап – согласование и установка шифрования для защиты будущего взаимодействия. Второй этап – аутентификация пользователя и принятие решения о том, должен ли клиент получить доступ к серверу.
Согласование шифрования сессии
Когда клиент инициирует TCP-соединение, сервер отвечает версиями протокола, которые он поддерживает. Если клиент тоже поддерживает одну из версий протокола, соединение продолжается. Сервер также предоставляет свой открытый ключ хоста, с помощью которого клиент может подтвердить, что подключается к нужному хосту.
На этом этапе обе стороны обсуждают ключ сеанса с помощью алгоритма Диффи-Хеллмана. Этот алгоритм (и его варианты) позволяет каждой стороне объединить свои личные данные с общедоступными данными другой системы, чтобы получить одинаковый секретный ключ для сессии.
Ключ сессии будет использоваться для шифрования всей сессии. Открытый и закрытый ключ, который используется на этом этапе, не совпадают с парой ключей SSH, используемой для аутентификации клиента на сервере.
Базовый алгоритм Диффи-Хеллмана работает так:
- Обе стороны выбирают большое простое число, которое будет служить в качестве начального значения.
- Обе стороны выбирают генератор шифрования (обычно AES), который будет предопределенным образом управлять значениями.
- Независимо каждая сторона придумывает другое простое число, которое хранится в секрете от другой стороны. Это число используется как закрытый ключ для этого взаимодействия (это не тот SSH-ключ, что используется для аутентификации).
- Сгенерированный закрытый ключ, генератор шифрования и общее простое число используются для создания открытого ключа, который является производным от закрытого ключа, но который может также использоваться другой стороной.
- Затем оба участника обмениваются открытыми ключами.
- Каждая сторона использует свой собственный закрытый ключ, открытый ключ другой стороны и общее простое число для вычисления общего секретного ключа. В результате обе стороны должны получить один и тот же секретный ключ.
- Общий секретный ключ затем используется для шифрования всех последующих сообщений.
Симметричное шифрование, которое используется для такого соединения, называется бинарным протоколом пакетов. Вышеупомянутый процесс позволяет каждой стороне одинаково участвовать в создании общего ключа, благодаря чему ни одна из сторон не может полностью контролировать этот ключ. Кроме того, когда обе стороны получают одинаковый ключ, нет необходимости отправлять эту информацию по небезопасным каналам.
Сгенерированный ключ – это симметричный ключ, который используется для шифрования и расшифровки сообщений. Цель этого ключа – заключить всю дальнейшую связь в зашифрованный туннель, который не сможет расшифровать злоумышленник.
После этого этапа начинается аутентификация клиента.
Аутентификация клиента
Следующий этап подразумевает аутентификацию пользователя и определение доступа. Существует несколько различных методов, которые могут использоваться для аутентификации на основе того, какие данные принимает сервер.
Простейшим методом является парольная аутентификация, при которой сервер просто запрашивает у клиента пароль учетной записи. Пароль отправляется через шифрованное соединение, поэтому он защищен от посторонних.
Несмотря на то, что пароль шифруется при передаче, этот метод обычно не рекомендуется использовать из-за ограничений сложности пароля. Автоматизированные сценарии очень легко подбирают пароли обычной длины и могут навредить серверу.
Самой популярной и рекомендуемой альтернативой парольной аутентификации является аутентификация на основе ключей SSH. Пары SSH-ключей являются асимметричными ключами, что означает, что два связанных ключа служат для разных функций.
Открытый ключ используется для шифрования данных, которые могут быть дешифрованы только с помощью закрытого ключа. Открытый ключ можно свободно передавать, потому что вычислить закрытый ключ из открытого ключа невозможно.
Аутентификация на основе ключей SSH начинается после того, как установлено симметричное шифрование. Процедура выполняется следующим образом:
- Клиент отправляет ID для пары ключей, с помощью которой он хотел бы аутентифицироваться на сервере.
- Сервер проверяет файл authorized_keys учетной записи, с помощью которой клиент пытается выполнить вход клиент.
- Если в файле обнаружен открытый ключ и его ID совпадает с тем, что отправил клиент, сервер генерирует случайное число и использует открытый ключ для шифрования этого числа.
- Сервер отправляет клиенту это зашифрованное сообщение.
- Если клиент на самом деле клиент имеет связанный закрытый ключ, он сможет расшифровать сообщение с помощью этого ключа и указать переданное число.
- Клиент объединяет дешифрованное число с общим ключом сессии, который используется для шифрования связи, и вычисляет хеш MD5 этого значения.
- Затем клиент отправляет этот хеш MD5 обратно на сервер в качестве ответа на сообщение с зашифрованным числом.
- Сервер использует общий ключ сеанса и исходное число, которое он отправил клиенту, для вычисления значения MD5. Он сравнивает свой результат с тем, что отправил ему клиент. Если эти два значения совпадают, это доказывает, что клиент имеет закрытый ключ. Клиент проходит аутентификацию.
Как видите, асимметрия ключей позволяет серверу шифровать сообщения клиенту с помощью открытого ключа. Затем клиент может доказать, что он имеет закрытый ключ, для чего ему нужно дешифровать полученное сообщение.
Теперь у вас есть представление о взаимоотношениях между различными компонентами и алгоритмами. Знакомство с основами SSH может помочь вам лучше понять, что происходит при входе на удаленный сервер.