Введение
SSH, или безопасная оболочка, является безопасным протоколом и наиболее распространенным способом безопасного управления удаленными серверами. Используя ряд технологий шифрования, SSH обеспечивает механизм для установления криптографически защищенного соединения между двумя сторонами, аутентификации каждой стороны перед другой и передачи команд и вывода в обе стороны.
В этом руководстве мы рассмотрим основные техники шифрования, которые использует SSH, и методы, которые он использует для установления безопасных соединений. Эта информация может быть полезной для понимания различных уровней шифрования и различных шагов, необходимых для установления соединения и аутентификации обеих сторон.
Понимание симметричного шифрования, асимметричного шифрования и хэшей
Для обеспечения безопасности передачи информации SSH использует несколько различных типов техник обработки данных в различных точках транзакции. Это включает формы симметричного шифрования, асимметричного шифрования и хеширования.
Симметричное шифрование
Отношение компонентов, которые шифруют и дешифруют данные, определяет, является ли схема шифрования симметричной или асимметричной.
Симметричное шифрование – это тип шифрования, при котором один ключ может использоваться для шифрования сообщений для другой стороны, а также для дешифровки сообщений, полученных от другого участника. Это означает, что любой, кто имеет ключ, может шифровать и дешифровать сообщения для кого-либо еще, удерживающего ключ.
Этот тип шифрования часто называется “общим секретным” шифрованием или “секретным ключом”. Обычно используется только один ключ для всех операций или пара ключей, где отношение обнаруживается, и производится противоположный ключ.
Симметричные ключи используются SSH для шифрования всего соединения. Вопреки тому, что некоторые пользователи предполагают, что созданные публичные/частные асимметричные пары ключей используются только для аутентификации, а не для шифрования соединения. Симметричное шифрование позволяет даже защитить аутентификацию по паролю от подслушивания.
Клиент и сервер оба вносят свой вклад в установку этого ключа, и полученный секрет никогда неизвестен внешним сторонам. Секретный ключ создается через процесс, известный как алгоритм обмена ключами. Этот обмен приводит к тому, что сервер и клиент независимо друг от друга приходят к одному и тому же ключу, обмениваясь определенными кусками общедоступных данных и манипулируя ими с определенными секретными данными. Этот процесс будет подробно объяснен позже.
Созданный этим процедурой симметричный ключ шифрования основан на сеансе и составляет фактическое шифрование для данных, отправляемых между сервером и клиентом. После установки соединения с этим ключом остальные данные должны быть зашифрованы этим общим секретом. Это делается до аутентификации клиента.
SSH может быть настроен для использования различных систем симметричного шифрования, включая Advanced Encryption Standard (AES), Blowfish, 3DES, CAST128 и Arcfour. Сервер и клиент могут согласовать список поддерживаемых ими шифров, упорядоченных по предпочтению. Первый вариант из списка клиента, доступный на сервере, используется как алгоритм шифрования в обоих направлениях.
На Ubuntu 20.04 как клиент, так и сервер настроены следующим образом:
[email protected]
aes128-ctr
aes192-ctr
aes256-ctr
[email protected]
[email protected]
Это означает, что если две машины Ubuntu 20.04 подключаются друг к другу (без переопределения шифров по умолчанию через опции конфигурации), они всегда будут использовать шифр [email protected]
для шифрования своего соединения.
Асимметричное шифрование
Асимметричное шифрование отличается от симметричного шифрования тем, что для отправки данных в одном направлении требуются два связанных ключа. Один из этих ключей называется закрытым ключом, в то время как другой называется открытым ключом.
Открытый ключ может быть свободно распространен с любой стороной. Он связан со своим парным ключом, но закрытый ключ нельзя вывести из открытого ключа. Математическое отношение между открытым ключом и закрытым ключом позволяет открытому ключу шифровать сообщения, которые могут быть расшифрованы только закрытым ключом. Это односторонняя возможность, что означает, что открытый ключ не имеет возможности расшифровать сообщения, которые он создает, а также не может расшифровать то, что может ему отправить закрытый ключ.
Закрытый ключ должен быть полностью секретным и никогда не должен раскрываться другой стороне. Это ключевое требование для работы парадигмы открытого ключа. Закрытый ключ является единственным компонентом, способным расшифровать сообщения, которые были зашифрованы с использованием связанного открытого ключа. В силу этого факта любая сущность, способная расшифровать эти сообщения, продемонстрировала, что она контролирует закрытый ключ.
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