Поиск по сайту:

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


Введение

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

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

Понимание симметричного шифрования, асимметричного шифрования и хэшей

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

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

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

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

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

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

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

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

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

В Ubuntu 20.04 и клиент, и сервер по умолчанию установлены следующим образом:

  • chacha20-poly1305@openssh.com
  • aes128-ctr
  • aes192-ctr
  • aes256-ctr
  • aes128-gcm@openssh.com
  • aes256-gcm@openssh.com

Это означает, что если две машины с Ubuntu 20.04 подключаются друг к другу (без переопределения шифров по умолчанию с помощью параметров конфигурации), они всегда будут по умолчанию использовать шифр chacha20-poly1305@openssh.com для шифрования своего соединения. .

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

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

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

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

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

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

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

Хеширование

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

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

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

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

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

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

Понимание того, как работает SSH

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Клиент начинает с отправки идентификатора пары ключей, с помощью которой он хочет пройти аутентификацию, на сервер.
  • Сервер проверяет файл authorized_keys учетной записи, в которую клиент пытается войти, на наличие идентификатора ключа.
  • Если в файле найден открытый ключ с совпадающим идентификатором, сервер генерирует случайное число и использует открытый ключ для его шифрования.
  • Сервер отправляет клиенту это зашифрованное сообщение.
  • Если у клиента действительно есть связанный закрытый ключ, он сможет расшифровать сообщение с помощью этого ключа, раскрывая исходный номер.
  • Клиент объединяет расшифрованное число с общим ключом сеанса, который используется для шифрования связи, и вычисляет хэш MD5 этого значения. MD5 – это алгоритм дайджеста сообщений, который использует хеш-функцию для создания 128-битного хеш-значения.
  • Затем клиент отправляет этот хэш MD5 обратно на сервер в качестве ответа на зашифрованное числовое сообщение.
  • Сервер использует тот же общий ключ сеанса и исходное число, которое он отправил клиенту, для самостоятельного вычисления значения MD5. Он сравнивает свой собственный расчет с тем, который клиент прислал обратно. Если эти два значения совпадают, это доказывает, что клиент владел закрытым ключом, и клиент прошел проверку подлинности.

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

Заключение

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

  • Как настроить аутентификацию на основе ключа SSH на сервере Linux
  • Как использовать SSH для подключения к удаленному серверу
  • Как настроить ключи SSH для различных операционных систем
  • Основы SSH: работа с серверами, клиентами и ключами SSH