Бенчмаркинг SSH-шифров: выбор самого быстрого шифрования для вашей сети

Безопасно тестируйте SSH-шифры с помощью scp, ssh, dd и pv, затем выбирайте AES-GCM или ChaCha20 на основе вашего реального оборудования.

Бенчмаркинг SSH-шифров: выбор самого быстрого шифрования для вашей сети

Бенчмаркинг SSH-шифров полезен, когда зашифрованные передачи медленнее, чем позволяет сеть. Шифр не всегда является узким местом, но на быстрых каналах или слабых процессорах он может решить, будет ли scp, sftp или rsync -e ssh насыщать соединение.

Правильный ответ зависит от вашего клиента, сервера, возможностей процессора, сборки OpenSSH и сетевого пути. Тестируйте в своей среде перед массовым изменением настроек по умолчанию.

Понимание SSH-шифров и их роли

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

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

Ключевые современные SSH-шифры для производительности

В современных SSH-средах два семейства аутентифицированных шифров выделяются своим отличным балансом безопасности и производительности: AES-GCM и ChaCha20-Poly1305. Оба обеспечивают аутентифицированное шифрование с ассоциированными данными (AEAD), что означает, что они шифруют данные и обеспечивают проверку целостности за один проход, что более эффективно и безопасно, чем старые подходы "сначала шифрование, затем MAC".

AES-GCM (Advanced Encryption Standard - Galois/Counter Mode)

AES-GCM — это очень популярный и широко используемый блочный шифр, работающий в режиме Galois/Counter. Он обеспечивает высокую безопасность и особенно быстр на системах с аппаратной поддержкой AES. Большинство современных процессоров (Intel, AMD и все чаще ARM) включают выделенные наборы инструкций (например, AES-NI на архитектурах x86/x64), которые значительно ускоряют операции AES, делая AES-GCM чрезвычайно эффективным.

  • Плюсы: Отличная производительность на процессорах с аппаратным ускорением, высокая безопасность, широкая поддержка.
  • Минусы: Может быть медленнее в чисто программных реализациях (например, на старых или специализированных процессорах без AES-NI).

ChaCha20-Poly1305

ChaCha20-Poly1305 — это поточный шифр, разработанный Дэниелом Дж. Бернстайном. Он известен своей дружественной к программному обеспечению конструкцией, работая очень хорошо даже на процессорах без специального аппаратного ускорения криптографии. Это делает его отличным выбором для разнообразного оборудования, включая встраиваемые системы, старые процессоры или среды, где аппаратное ускорение недоступно или не оптимизировано для других алгоритмов.

  • Плюсы: Отличная программная производительность, высокая безопасность, устойчивость к атакам по времени.
  • Минусы: Обычно не так быстр, как аппаратно-ускоренный AES-GCM на современных настольных/серверных процессорах.

Факторы, влияющие на производительность шифра

"Самый быстрый" шифр не является универсально фиксированным; он зависит от нескольких ключевых факторов:

  1. Архитектура процессора и аппаратное ускорение: Это самый значимый фактор. Если ваш процессор имеет AES-NI или аналогичные инструкции, AES-GCM почти наверняка превзойдет ChaCha20-Poly1305. Без них ChaCha20-Poly1305 может выйти вперед.
  2. Реализации SSH-клиента и сервера: Эффективность SSH-программного обеспечения (например, OpenSSH) и используемых криптографических библиотек (например, OpenSSL) может повлиять на реальную производительность. Новые версии часто включают оптимизации.
  3. Сетевые условия: Хотя это не связано напрямую со скоростью шифра, сетевая задержка и доступная пропускная способность могут маскировать или усиливать воспринимаемую разницу в производительности шифра. В очень медленной сети затраты процессора на шифрование могут быть незначительными по сравнению с сетевыми ограничениями. В очень быстрой сети (например, 10 Гбит/с и выше) шифрование, связанное с процессором, может стать узким местом.
  4. Объем и тип данных: Бенчмаркинг с разными размерами данных (маленькие файлы против больших) и типами (сжимаемые против несжимаемых) может выявить различные характеристики производительности. Например, очень маленькие передачи могут быть доминированы накладными расходами на установку соединения, а не скоростью шифра.

Как тестировать производительность SSH-шифров

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

1. Определите поддерживаемые шифры

Прежде чем начать, проверьте, какие шифры поддерживает ваш SSH-клиент:

ssh -Q cipher

Затем используйте подробный вывод SSH, чтобы увидеть, что согласовывает реальное соединение:

ssh -vvv user@your_server

Ищите строки, похожие на debug1: kex: server->client cipher: [email protected] MAC: <implicit> compression: none. Политика сервера контролируется параметром Ciphers в sshd_config, но эффективная поддержка зависит как от клиента, так и от сервера.

2. Укажите шифры с помощью ssh -c

Клиент ssh позволяет указать желаемый шифр с помощью флага -c. Вы можете указать список, разделенный запятыми, и клиент попытается использовать первый поддерживаемый шифр из списка.

Распространенные шифры для тестирования:

3. Выберите метод передачи и источник данных

Для последовательного бенчмаркинга вам понадобится способ передачи известного объема данных.

  • scp (Secure Copy): Идеально подходит для передачи файлов. Используйте большой несжимаемый файл, чтобы шифр был узким местом, а не сжатие или дисковый ввод-вывод.
  • sftp (SSH File Transfer Protocol): Аналогичен scp, полезен, если вы предпочитаете этот протокол.
  • dd (Data Duplicator): Может генерировать поток данных для передачи по SSH, полезен для тестов чистой пропускной способности без накладных расходов файловой системы на стороне клиента.

Практические шаги бенчмаркинга

Предположим, вы хотите протестировать передачи с клиента на сервер. Вам понадобится тестовый файл на клиенте (или сервере), достаточно большой (например, 1 ГБ), чтобы обеспечить значимые измерения, но не настолько большой, чтобы тесты заняли слишком много времени. Хороший способ создать несжимаемый тестовый файл — использовать /dev/urandom. Используйте /dev/zero только когда сжатие SSH отключено, потому что данные из всех нулей хорошо сжимаются.

На клиенте (для создания фиктивного файла размером 1 ГБ):

pwd=$(pwd)
dd if=/dev/urandom of=$pwd/dummy_1GB.bin bs=1M count=1024 iflag=fullblock

Бенчмаркинг с помощью scp:

  1. Тест AES256-GCM:

    echo "Testing AES256-GCM..."
    time scp -c [email protected] dummy_1GB.bin user@your_server:/tmp/test_gcm.bin
    
  2. Тест ChaCha20-Poly1305:

    echo "Testing ChaCha20-Poly1305..."
    time scp -c [email protected] dummy_1GB.bin user@your_server:/tmp/test_chacha.bin
    
  3. Тест AES128-GCM (часто самый быстрый):

    echo "Testing AES128-GCM..."
    time scp -c [email protected] dummy_1GB.bin user@your_server:/tmp/test_aes128_gcm.bin
    

Бенчмаркинг с помощью dd и pv (для пропускной способности в реальном времени):

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

Установка pv (если еще не установлен):

sudo apt-get install pv # Debian/Ubuntu
sudo yum install pv     # RHEL/CentOS
sudo brew install pv    # macOS
  1. Тест AES256-GCM с dd и pv:

    echo "Testing AES256-GCM with dd..."
    dd if=/dev/zero bs=1M count=1024 | pv | ssh -o Compression=no -c [email protected] user@your_server "cat > /dev/null"
    
  2. Тест ChaCha20-Poly1305 с dd и pv:

    echo "Testing ChaCha20-Poly1305 with dd..."
    dd if=/dev/zero bs=1M count=1024 | pv | ssh -o Compression=no -c [email protected] user@your_server "cat > /dev/null"
    

Совет: Запускайте каждый тест несколько раз (например, 3-5 раз) и берите среднее значение, чтобы учесть колебания сети или загрузку системы.

Интерпретация результатов и рекомендации

После запуска бенчмарков сравните время real из выводов команды time или среднюю пропускную способность, сообщенную pv. Вы, вероятно, заметите отчетливые закономерности:

  • Современные процессоры с AES-NI: Вы почти наверняка обнаружите, что [email protected] и [email protected] обеспечивают самую высокую пропускную способность. AES-128 часто немного быстрее AES-256 из-за меньшего количества раундов, но разница может быть незначительной на системах с аппаратным ускорением.
  • Старые процессоры, ARM (без специальных крипто-расширений) или виртуальные машины: ChaCha20-Poly1305 может работать сравнимо или даже превосходить AES-GCM, так как его программно-оптимизированная конструкция проявляет себя в этих сценариях.

Рекомендации:

  • Для высокопроизводительных серверов с современными процессорами Intel/AMD (и AES-NI): Отдавайте предпочтение AES-GCM (особенно [email protected]). Он использует аппаратное ускорение для превосходной скорости и безопасности.
  • Для разнообразных сред, старого оборудования, систем на базе ARM или ситуаций, где важна программная производительность: ChaCha20-Poly1305 — отличный выбор, обеспечивающий высокую безопасность с постоянной высокой производительностью на различных архитектурах без использования аппаратно-зависимых функций.
  • Безопасность прежде всего: Всегда выбирайте шифры, обеспечивающие аутентифицированное шифрование (AEAD). И AES-GCM, и ChaCha20-Poly1305 являются AEAD-шифрами и считаются надежными. По возможности избегайте старых не-AEAD шифров, таких как aes*-cbc.

Другие соображения по производительности SSH

Хотя выбор шифра имеет решающее значение, помните, что это часть более широкой картины производительности:

  • Сжатие: SSH может сжимать данные перед шифрованием (-o Compression=yes или Compression yes в ~/.ssh/config). Для хорошо сжимаемых данных по медленным каналам это может значительно улучшить воспринимаемую скорость, даже если добавляет небольшую нагрузку на процессор. Для уже сжатых данных или очень быстрых каналов это может снизить производительность.
  • Мультиплексирование соединений: Такие функции, как ControlMaster в OpenSSH, позволяют нескольким SSH-сессиям повторно использовать одно базовое TCP-соединение, уменьшая накладные расходы на рукопожатие для последующих соединений.
  • MTU (Maximum Transmission Unit): Убедитесь, что MTU вашей сети оптимизирован для предотвращения фрагментации, которая может ухудшить производительность.
  • Версия SSH-клиента/сервера: Поддерживайте ваше SSH-программное обеспечение в актуальном состоянии. Новые версии часто включают улучшения производительности и поддержку новых, более быстрых шифров.

Выбирайте на основе ваших измерений

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

Для многих современных серверов AES-GCM работает хорошо благодаря аппаратному ускорению. На старых системах, встраиваемом оборудовании и некоторых виртуализированных средах ChaCha20-Poly1305 может быть лучшим выбором. Держите старые CBC-шифры вне обычного использования, если у вас нет требования совместимости, которое вы можете изолировать и документировать.