Benchmarking de Cifras SSH: Escolhendo a Criptografia Mais Rápida para Sua Rede

Faça benchmark de cifras SSH com segurança usando scp, ssh, dd e pv, depois escolha AES-GCM ou ChaCha20 com base no seu hardware real.

Benchmarking de Cifras SSH: Escolhendo a Criptografia Mais Rápida para Sua Rede

Fazer benchmark de cifras SSH é útil quando as transferências criptografadas são mais lentas do que a rede deveria permitir. A cifra nem sempre é o gargalo, mas em links rápidos ou CPUs pequenas, ela pode decidir se scp, sftp ou rsync -e ssh saturam a conexão.

A resposta correta depende do seu cliente, servidor, recursos da CPU, compilação do OpenSSH e caminho de rede. Teste em seu próprio ambiente antes de alterar os padrões em toda a frota.

Entendendo as Cifras SSH e Seu Papel

Uma cifra SSH é um algoritmo usado para criptografar e descriptografar os dados trocados entre um cliente e um servidor SSH. Seu objetivo principal é garantir confidencialidade, integridade e autenticidade da comunicação. Quando você inicia uma conexão SSH, o cliente e o servidor negociam um conjunto de algoritmos (cifras, MACs, métodos de troca de chaves) que ambos suportam, concordando finalmente com as opções mais fortes e preferidas. Esse processo de negociação é crítico para estabelecer um canal seguro.

Diferentes cifras empregam operações matemáticas distintas, levando a demandas computacionais variadas. Algumas cifras são otimizadas para aceleração de hardware, aproveitando instruções especializadas da CPU, enquanto outras são projetadas para ter um desempenho eficiente em software em uma ampla gama de processadores. A escolha da cifra, portanto, impacta diretamente a utilização da CPU e as velocidades de transferência de dados resultantes.

Principais Cifras SSH Modernas para Desempenho

Em ambientes SSH modernos, duas famílias de cifras de criptografia autenticada se destacam por seu excelente equilíbrio entre segurança e desempenho: AES-GCM e ChaCha20-Poly1305. Ambas fornecem criptografia autenticada com dados associados (AEAD), o que significa que criptografam os dados e fornecem verificação de integridade em uma única passagem, o que é mais eficiente e seguro do que abordagens mais antigas de criptografar-depois-MAC.

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

AES-GCM é uma cifra de bloco altamente popular e amplamente adotada que opera no modo Galois/Counter. Oferece segurança robusta e é particularmente rápida em sistemas com suporte de hardware para AES. A maioria das CPUs modernas (Intel, AMD e, cada vez mais, processadores ARM) inclui conjuntos de instruções dedicados (como AES-NI em arquiteturas x86/x64) que aceleram drasticamente as operações AES, tornando o AES-GCM extremamente eficiente.

  • Prós: Excelente desempenho em CPUs com aceleração de hardware, segurança robusta, amplamente suportado.
  • Contras: Pode ser mais lento em implementações apenas em software (por exemplo, em CPUs mais antigas ou especializadas sem AES-NI).

ChaCha20-Poly1305

ChaCha20-Poly1305 é uma cifra de fluxo desenvolvida por Daniel J. Bernstein. É conhecida por seu design amigável ao software, tendo um desempenho muito bom mesmo em CPUs sem aceleração criptográfica de hardware específica. Isso a torna uma excelente escolha para uma gama diversificada de hardware, incluindo sistemas embarcados, processadores mais antigos ou ambientes onde a aceleração de hardware não está consistentemente disponível ou otimizada para outros algoritmos.

  • Prós: Excelente desempenho em software, segurança robusta, resistente a ataques de canal lateral por temporização.
  • Contras: Geralmente não é tão rápido quanto o AES-GCM acelerado por hardware em CPUs modernas de desktop/servidor.

Fatores que Afetam o Desempenho da Cifra

A cifra "mais rápida" não é universalmente fixa; depende de vários fatores-chave:

  1. Arquitetura da CPU e Aceleração de Hardware: Este é o fator mais significativo. Se sua CPU tiver AES-NI ou instruções semelhantes, o AES-GCM quase certamente superará o ChaCha20-Poly1305. Sem isso, o ChaCha20-Poly1305 pode assumir a liderança.
  2. Implementações do Cliente e Servidor SSH: A eficiência do software SSH (por exemplo, OpenSSH) e das bibliotecas criptográficas que ele usa (por exemplo, OpenSSL) pode impactar o desempenho no mundo real. Versões mais recentes geralmente incluem otimizações.
  3. Condições de Rede: Embora não esteja diretamente relacionado à velocidade da cifra, a latência da rede e a largura de banda disponível podem mascarar ou amplificar a diferença percebida no desempenho da cifra. Em uma rede muito lenta, o custo de CPU da criptografia pode ser insignificante em comparação com as limitações da rede. Em uma rede muito rápida (por exemplo, 10 Gbps ou mais), a criptografia vinculada à CPU pode se tornar o gargalo.
  4. Volume e Tipo de Dados: Fazer benchmark com diferentes tamanhos de dados (arquivos pequenos vs. arquivos grandes) e tipos (compressíveis vs. incompressíveis) pode revelar diferentes características de desempenho. Por exemplo, transferências muito pequenas podem ser dominadas pela sobrecarga de configuração da conexão, em vez da velocidade da cifra.

Como Fazer Benchmark do Desempenho de Cifras SSH

Fazer benchmark envolve dizer explicitamente ao SSH para usar uma cifra específica e, em seguida, medir o tempo necessário para transferir uma quantidade conhecida de dados. Isso permite uma comparação direta.

1. Identifique as Cifras Suportadas

Antes de começar, verifique quais cifras seu cliente SSH suporta:

ssh -Q cipher

Em seguida, use a saída SSH detalhada para ver o que uma conexão real negocia:

ssh -vvv usuario@seu_servidor

Procure linhas semelhantes a debug1: kex: server->client cipher: [email protected] MAC: <implicit> compression: none. A política do servidor é controlada por Ciphers em sshd_config, mas o suporte efetivo depende tanto do cliente quanto do servidor.

2. Especifique Cifras com ssh -c

O cliente ssh permite que você especifique a cifra desejada usando a flag -c. Você pode fornecer uma lista separada por vírgulas, e o cliente tentará usar a primeira cifra suportada da lista.

Cifras comuns para testar:

3. Escolha um Método de Transferência e Fonte de Dados

Para um benchmark consistente, você precisará de uma maneira de transferir uma quantidade conhecida de dados.

  • scp (Secure Copy): Ideal para transferir arquivos. Use um arquivo grande e não compressível para garantir que a cifra seja o gargalo, não a compressão ou E/S de disco.
  • sftp (SSH File Transfer Protocol): Semelhante ao scp, útil se você preferir esse protocolo.
  • dd (Data Duplicator): Pode gerar um fluxo de dados para canalizar via SSH, útil para testes de taxa de transferência pura sem sobrecarga do sistema de arquivos no lado do cliente.

Etapas Práticas de Benchmark

Vamos supor que você queira fazer benchmark de transferências de um cliente para um servidor. Você precisará de um arquivo de teste no cliente (ou servidor) que seja grande o suficiente (por exemplo, 1 GB) para permitir uma medição significativa, mas não tão grande que os testes demorem muito. Uma boa maneira de criar um arquivo de teste não compressível é usar /dev/urandom. Use /dev/zero apenas quando a compressão SSH estiver desabilitada, porque dados todos zero são altamente compressíveis.

No cliente (para criar um arquivo dummy de 1 GB):

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

Fazendo benchmark com scp:

  1. Teste AES256-GCM:

    echo "Testando AES256-GCM..."
    time scp -c [email protected] dummy_1GB.bin usuario@seu_servidor:/tmp/test_gcm.bin
    
  2. Teste ChaCha20-Poly1305:

    echo "Testando ChaCha20-Poly1305..."
    time scp -c [email protected] dummy_1GB.bin usuario@seu_servidor:/tmp/test_chacha.bin
    
  3. Teste AES128-GCM (geralmente o mais rápido):

    echo "Testando AES128-GCM..."
    time scp -c [email protected] dummy_1GB.bin usuario@seu_servidor:/tmp/test_aes128_gcm.bin
    

Fazendo benchmark com dd e pv (para taxa de transferência em tempo real):

Este método canaliza dados via SSH e pode mostrar velocidades em tempo real, reduzindo a E/S de disco como gargalo. pv (Pipe Viewer) fornece informações de progresso e taxa de transferência.

Para instalar pv (se ainda não estiver instalado):

sudo apt-get install pv # Debian/Ubuntu
sudo yum install pv     # RHEL/CentOS
sudo brew install pv    # macOS
  1. Teste AES256-GCM com dd e pv:

    echo "Testando AES256-GCM com dd..."
    dd if=/dev/zero bs=1M count=1024 | pv | ssh -o Compression=no -c [email protected] usuario@seu_servidor "cat > /dev/null"
    
  2. Teste ChaCha20-Poly1305 com dd e pv:

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

Dica: Execute cada teste várias vezes (por exemplo, 3-5 vezes) e tire a média para considerar flutuações de rede ou carga do sistema.

Interpretando Resultados e Recomendações

Após executar seus benchmarks, compare o tempo real das saídas do comando time ou a taxa de transferência média relatada pelo pv. Você provavelmente observará padrões distintos:

  • CPUs modernas com AES-NI: Você quase certamente descobrirá que [email protected] e [email protected] oferecem a maior taxa de transferência. AES-128 é muitas vezes marginalmente mais rápido que AES-256 devido a menos rodadas, mas a diferença pode ser insignificante em sistemas acelerados por hardware.
  • CPUs mais antigas, ARM (sem extensões criptográficas específicas) ou Máquinas Virtuais: ChaCha20-Poly1305 pode ter um desempenho comparável ou até mesmo superar o AES-GCM, pois seu design otimizado para software brilha nesses cenários.

Recomendações:

  • Para servidores de alto desempenho com CPUs Intel/AMD modernas (e AES-NI): Priorize AES-GCM (especialmente [email protected]). Ele aproveita a aceleração de hardware para velocidade e segurança superiores.
  • Para ambientes diversos, hardware mais antigo, sistemas baseados em ARM ou situações que favorecem o desempenho de software: ChaCha20-Poly1305 é uma excelente escolha, fornecendo segurança robusta com desempenho consistente e alto em várias arquiteturas, sem depender de recursos específicos de hardware.
  • Segurança em Primeiro Lugar: Sempre escolha cifras que forneçam criptografia autenticada (AEAD). Tanto AES-GCM quanto ChaCha20-Poly1305 são cifras AEAD e são consideradas fortes. Evite cifras mais antigas e não AEAD, como aes*-cbc, se possível.

Outras Considerações de Desempenho SSH

Embora a seleção de cifras seja crucial, lembre-se de que ela faz parte de um quadro de desempenho mais amplo:

  • Compressão: O SSH pode compactar dados antes da criptografia (-o Compression=yes ou Compression yes em ~/.ssh/config). Para dados altamente compressíveis em links lentos, isso pode melhorar drasticamente a velocidade percebida, mesmo que adicione uma pequena sobrecarga de CPU. Para dados já compactados ou links muito rápidos, pode reduzir o desempenho.
  • Multiplexação de Conexão: Recursos como ControlMaster no OpenSSH permitem que várias sessões SSH reutilizem uma única conexão TCP subjacente, reduzindo a sobrecarga de handshake para conexões subsequentes.
  • MTU (Maximum Transmission Unit): Certifique-se de que o MTU da sua rede esteja otimizado para evitar fragmentação, o que pode degradar o desempenho.
  • Versão do Cliente/Servidor SSH: Mantenha seu software cliente e servidor SSH atualizados. Versões mais recentes geralmente incluem melhorias de desempenho e suporte para cifras mais novas e rápidas.

Escolha a Partir de Suas Medições

Otimizar a seleção de cifras SSH pode melhorar o desempenho de transferência segura, mas apenas quando a criptografia é o fator limitante. Execute vários testes, mantenha a compressão e o tamanho do arquivo consistentes e compare o uso da CPU, bem como o tempo de transferência.

Para muitos servidores modernos, o AES-GCM tem um bom desempenho devido à aceleração de hardware. Em sistemas mais antigos, hardware embarcado e alguns ambientes virtualizados, o ChaCha20-Poly1305 pode ser a melhor escolha. Mantenha as cifras CBC antigas fora do uso normal, a menos que você tenha um requisito de compatibilidade que possa isolar e documentar.