Понимание процесса шифрования и подключения SSH

Вступление

SSH, или защищенная оболочка, является безопасным протоколом и наиболее распространенным способом безопасного администрирования удаленных серверов. Используя ряд технологий шифрования, SSH предоставляет механизм для установления криптографически защищенного соединения между двумя сторонами, аутентификации каждой стороны к другой и передачи команд и вывода вперед и назад.

В других руководствах мы обсуждалиhow to configure SSH key-based access,how to connect using SSH иsome SSH tips and tricks.

В этом руководстве мы рассмотрим основные методы шифрования, которые использует SSH, и методы, которые он использует для установления безопасных соединений. Эта информация может быть полезна для понимания различных уровней шифрования и различных шагов, необходимых для формирования соединения и аутентификации обеих сторон.

Симметричное шифрование, асимметричное шифрование и хэши

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

Симметричное шифрование

Отношения компонентов, которые шифруют и дешифруют данные, определяют, является ли схема шифрования симметричной или асимметричной.

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

Этот тип схемы шифрования часто называют «общим секретным» шифрованием или «секретным ключом». Обычно существует только один ключ, который используется для всех операций, или пара ключей, для которых легко обнаружить взаимосвязь, и тривиально получить противоположный ключ.

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

Клиент и сервер вносят свой вклад в установление этого ключа, и полученный секрет никогда не будет известен сторонним лицам. Секретный ключ создается с помощью процесса, известного как алгоритм обмена ключами. Этот обмен приводит к тому, что сервер и клиент одновременно получают один и тот же ключ, разделяя определенные фрагменты общедоступных данных и манипулируя ими с некоторыми секретными данными. Этот процесс будет объяснен более подробно позже.

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

SSH может быть настроен для использования различных симметричных систем шифрования, включая AES, Blowfish, 3DES, CAST128 и Arcfour. Сервер и клиент могут выбрать список поддерживаемых шифров, упорядоченный по предпочтению. Первая опция из списка клиентов, доступная на сервере, используется в качестве алгоритма шифрования в обоих направлениях.

В Ubuntu 14.04 и клиент, и сервер имеют следующие значения по умолчанию:aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,[email protected] ,[email protected],[email protected],aes128-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour.

Это означает, что если две машины Ubuntu 14.04 подключаются друг к другу (без переопределения шифров по умолчанию с помощью параметров конфигурации), они всегда будут использовать шифрaes128-ctr для шифрования своего соединения.

Асимметричное шифрование

Асимметричное шифрование отличается от симметричного шифрования тем, что для отправки данных в одном направлении необходимы два связанных ключа. Один из этих ключей известен какprivate key, а другой - какpublic key.

Открытый ключ может свободно передаваться любой стороне. Он связан с его парным ключом, но закрытый ключcannot является производным от открытого ключа. Математическая связь между открытым ключом и закрытым ключом позволяет открытому ключу шифровать сообщения, которые могут быть расшифрованы только закрытым ключом. Это односторонняя способность, означающая, что открытый ключ не имеет возможности дешифровать записанные им сообщения, а также не может расшифровать все, что частный ключ может отправить.

Закрытый ключ должен храниться полностью в секрете и никогда не должен передаваться другой стороне. Это ключевое требование для работы парадигмы открытого ключа. Закрытый ключ является единственным компонентом, способным расшифровывать сообщения, которые были зашифрованы с использованием соответствующего открытого ключа. В силу этого факта любой объект, способный расшифровать эти сообщения, продемонстрировал, что он контролирует закрытый ключ.

SSH использует асимметричное шифрование в нескольких разных местах. Во время начального процесса обмена ключами, используемого дляset up симметричного шифрования (используется для шифрования сеанса), используется асимметричное шифрование. На этом этапе обе стороны создают временные пары ключей и обмениваются открытым ключом, чтобы создать общий секрет, который будет использоваться для симметричного шифрования.

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

После того, как установлено симметричное шифрование для защиты связи между сервером и клиентом, клиент должен пройти аутентификацию, чтобы получить доступ. Сервер может использовать открытый ключ в этом файле для шифрования сообщения вызова для клиента. Если клиент может доказать, что он смог расшифровать это сообщение, он продемонстрировал, что ему принадлежит связанный закрытый ключ. Затем сервер может настроить среду для клиента.

хеширования

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

Использование одной и той же функции хеширования и сообщения должно давать одинаковый хеш; изменение любой части данных должно привести к совершенно другому хэшу. Пользователь долженnot иметь возможность создать исходное сообщение из заданного хэша, но ониshould должны быть в состоянии определить, произвело ли данное сообщение данный хэш.

Учитывая эти свойства, хеши в основном используются для обеспечения целостности данных и для проверки подлинности связи. Основное использование в SSH - HMAC, или коды аутентификации сообщений на основе хеша. Они используются для гарантии того, что полученный текст сообщения не поврежден и не изменен.

В качестве части согласования симметричного шифрования, описанного выше, выбирается алгоритм кода аутентификации сообщения (MAC). Алгоритм выбирается путем работы со списком допустимых MAC-адресов клиента. Будет использован первый из этого списка, который поддерживает сервер.

Каждое сообщение, которое отправляется после согласования шифрования, должно содержать MAC, чтобы другая сторона могла проверить целостность пакета. MAC рассчитывается на основе симметричного общего секрета, порядкового номера пакета сообщения и фактического содержимого сообщения.

Сам MAC отправляется за пределы симметрично зашифрованной области в качестве конечной части пакета. Исследователи обычно рекомендуют этот метод шифрования данных, а затем вычисляют MAC.

Как работает SSH?

Вы, вероятно, уже имеете общее представление о том, как работает SSH. Протокол SSH использует модель клиент-сервер для аутентификации двух сторон и шифрования данных между ними.

Серверный компонент прослушивает назначенный порт для соединений. Он отвечает за согласование безопасного соединения, проверку подлинности подключающейся стороны и создание правильной среды, если учетные данные приняты.

Клиент отвечает за начало первоначального установления связи TCP с сервером, согласование безопасного соединения, проверку соответствия идентификатора сервера ранее записанной информации и предоставление учетных данных для аутентификации.

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

Согласование шифрования для сеанса

Когда клиент устанавливает TCP-соединение, сервер отвечает версиями протокола, которые он поддерживает. Если клиент может соответствовать одной из приемлемых версий протокола, соединение продолжается. Сервер также предоставляет свой открытый ключ хоста, который клиент может использовать, чтобы проверить, был ли это предполагаемый хост.

На этом этапе обе стороны согласовывают сеансовый ключ, используя версию того, что называется алгоритмом Диффи-Хеллмана. Этот алгоритм (и его варианты) позволяют каждой стороне объединять свои личные данные с открытыми данными из другой системы для получения идентичного секретного ключа сеанса.

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

Основой этой процедуры для классического Диффи-Хеллмана является:

  1. Обе стороны договариваются о большом простом числе, которое послужит начальным значением.

  2. Обе стороны договариваются о генераторе шифрования (обычно AES), который будет использоваться для манипулирования значениями заранее определенным способом.

  3. Независимо от этого, каждая сторона приходит с другим простым числом, которое держится в секрете от другой стороны. Этот номер используется как закрытый ключ для этого взаимодействия (отличается от закрытого ключа SSH, используемого для аутентификации).

  4. Сгенерированный закрытый ключ, генератор шифрования и общее простое число используются для генерации открытого ключа, который получен из закрытого ключа, но которым можно поделиться с другой стороной.

  5. Затем оба участника обмениваются сгенерированными открытыми ключами.

  6. Получающий объект использует свой собственный закрытый ключ, открытый ключ другой стороны и исходное общее простое число для вычисления общего секретного ключа. Хотя это вычисляется каждой стороной независимо с использованием противоположных закрытых и открытых ключей, в результате получается общий секретный ключsame.

  7. Общий секрет затем используется для шифрования всей последующей связи.

Общее секретное шифрование, которое используется для остальной части соединения, называется протоколом двоичных пакетов. Вышеуказанный процесс позволяет каждой стороне в равной степени участвовать в создании общего секрета, что не позволяет одному концу контролировать секрет. Он также выполняет задачу генерации идентичного общего секрета без необходимости передавать эту информацию по незащищенным каналам.

Сгенерированный секрет является симметричным ключом, то есть тот же ключ, который использовался для шифрования сообщения, может использоваться для его дешифрования на другой стороне. Цель этого состоит в том, чтобы обернуть всю дальнейшую связь в зашифрованный туннель, который не может быть расшифрован посторонними.

После того, как шифрование сеанса установлено, начинается этап аутентификации пользователя.

Аутентификация доступа пользователя к серверу

Следующий этап включает аутентификацию пользователя и принятие решения о доступе. Есть несколько разных методов, которые могут использоваться для аутентификации, в зависимости от того, что сервер принимает.

Самым простым, вероятно, является аутентификация по паролю, при которой сервер просто запрашивает у клиента пароль учетной записи, с которой он пытается войти. Пароль отправляется через согласованное шифрование, поэтому он защищен от внешних сторон.

Несмотря на то, что пароль будет зашифрован, этот метод обычно не рекомендуется из-за ограничений сложности пароля. Автоматизированные сценарии могут очень легко взламывать пароли нормальной длины по сравнению с другими методами аутентификации.

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

Открытый ключ используется для шифрования данных, которые могут быть расшифрованы только с помощью закрытого ключа. Публичный ключ может свободно использоваться совместно, поскольку, хотя он может зашифровывать закрытый ключ, нет способа получить закрытый ключ из открытого ключа.

Аутентификация с использованием пар ключей SSH начинается после того, как было установлено симметричное шифрование, как описано в последнем разделе. Процедура происходит так:

  1. Клиент начинает с отправки идентификатора для пары ключей, с которой он хотел бы пройти аутентификацию на сервере.

  2. Сервер проверяет файлauthorized_keys учетной записи, в которую пытается войти клиент, на предмет идентификатора ключа.

  3. Если в файле обнаружен открытый ключ с соответствующим идентификатором, сервер генерирует случайное число и использует открытый ключ для шифрования номера.

  4. Сервер отправляет клиенту это зашифрованное сообщение.

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

  6. Клиент объединяет расшифрованный номер с общим ключом сеанса, который используется для шифрования связи, и вычисляет MD5-хэш этого значения.

  7. Затем клиент отправляет этот хэш MD5 обратно на сервер в качестве ответа на сообщение с зашифрованным номером.

  8. Сервер использует тот же общий ключ сеанса и исходный номер, который он отправил клиенту, чтобы самостоятельно рассчитать значение MD5. Он сравнивает свой собственный расчет с тем, который клиент отправил обратно. Если эти два значения совпадают, это доказывает, что клиент обладал закрытым ключом и клиент прошел проверку подлинности.

Как видите, асимметрия ключей позволяет серверу шифровать сообщения клиенту с использованием открытого ключа. Затем клиент может доказать, что он держит закрытый ключ, правильно расшифровав сообщение. Используемые два типа шифрования (симметричный общий секрет и асимметричные открытые-закрытые ключи) могут использовать свои сильные стороны в этой модели.

Заключение

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

Related