SSH暗号化方式のベンチマーク:ネットワークに最適な高速暗号化の選択

暗号化方式を理解しベンチマークすることで、より高速なSSHデータ転送を実現しましょう。本ガイドでは、AES-GCMとChaCha20-Poly1305を比較し、異なるCPUアーキテクチャ間でのパフォーマンス特性を強調します。`scp`と`dd`を使用して暗号化方式をテストする実践的な手順を学び、結果を解釈し、大容量転送に最適な暗号化を選択します。堅牢なセキュリティとネットワークの最大スループットのバランスを取りましょう。

43 ビュー

SSH暗号のベンチマーク:ネットワークに最適な最速の暗号化方式を選択する

Secure Shell (SSH) は、世界中の無数のシステムにおけるセキュアなリモートアクセスとデータ転送の根幹をなしています。その主要な機能はセキュリティですが、基盤となる暗号化アルゴリズム、すなわち「暗号(Cipher)」は、特に大容量のデータ転送時にパフォーマンスに大きな影響を与える可能性があります。適切な暗号を選択することは、超高速の転送を実現するか、あるいは苛立たしいボトルネックに直面するかの分かれ目となり得ます。

この記事では、最新のSSH暗号化の世界を深く掘り下げ、AES-GCMやChaCha20-Poly1305といった一般的な暗号のパフォーマンス特性を比較します。暗号速度に影響を与える要因を探り、特定の環境でパフォーマンスをベンチマークするための実践的な方法を提供し、堅牢なセキュリティとスループットのバランスを取りながら、ネットワーク固有のニーズに最適な暗号を選択できるようガイドします。

SSH暗号とその役割を理解する

SSH暗号は、SSHクライアントとサーバー間で交換されるデータを暗号化および復号化するために使用されるアルゴリズムです。その主な目的は、通信の機密性、完全性、および認証性を保証することです。SSH接続を開始すると、クライアントとサーバーは、両方がサポートするアルゴリズムのセット(暗号、MAC、鍵交換方式)をネゴシエートし、最終的に最も強力で優先されるオプションに合意します。このネゴシエーションプロセスは、セキュアなチャネルを確立するために不可欠です。

異なる暗号は、独自の数学的演算を採用しており、その結果、計算負荷も異なります。一部の暗号は、特殊なCPU命令を活用するハードウェアアクセラレーション向けに最適化されていますが、一方で広範なプロセッサでソフトウェアとして効率的に動作するように設計されているものもあります。したがって、暗号の選択は、CPU使用率と結果として得られるデータ転送速度に直接影響を与えます。

パフォーマンスのための主要なモダンSSH暗号

モダンなSSH環境では、セキュリティとパフォーマンスの優れたバランスから、2つの認証付き暗号化(AEAD)暗号ファミリーが際立っています:AES-GCMとChaCha20-Poly1305です。どちらも認証付きデータ暗号化(AEAD: Authenticated Encryption with Associated Data)を提供します。これは、データを暗号化、単一のパスで完全性チェックも提供することを意味し、古い「暗号化してからMACを行う」アプローチよりも効率的で安全です。

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

AES-GCMは、Galois/Counter Modeで動作する非常に人気があり広く採用されているブロック暗号です。強力なセキュリティを提供し、AESのハードウェアサポートを備えたシステムで特に高速です。ほとんどの最新CPU(Intel、AMD、そして増えつつあるARMプロセッサ)には、AES演算を劇的に高速化する専用の命令セット(x86/x64アーキテクチャのAES-NIなど)が含まれており、これによりAES-GCMは非常に効率的になります。

  • 長所: ハードウェアアクセラレーション対応CPUで優れたパフォーマンス、強力なセキュリティ、幅広いサポート。
  • 短所: ソフトウェアのみの実装(例:AES-NIのない古いCPUや特殊なCPU)では遅くなる可能性がある。

ChaCha20-Poly1305

ChaCha20-Poly1305は、Daniel J. Bernsteinによって開発されたストリーム暗号です。ソフトウェアフレンドリーな設計で知られており、特定の暗号化ハードウェアアクセラレーションがないCPUでも非常に優れたパフォーマンスを発揮します。この特性により、組み込みシステム、古いプロセッサ、またはハードウェアアクセラレーションが一貫して利用できない、あるいは他のアルゴリズム向けに最適化されていない環境を含む、多様なハードウェアにとって優れた選択肢となります。

  • 長所: 優れたソフトウェアパフォーマンス、強力なセキュリティ、タイミングサイドチャネル攻撃への耐性がある。
  • 短所: 通常、最新のデスクトップ/サーバーCPU上のハードウェアアクセラレーション対応AES-GCMほど速くはない。

暗号パフォーマンスに影響を与える要因

「最速」の暗号は普遍的に決まっているわけではなく、いくつかの主要な要因に依存します。

  1. CPUアーキテクチャとハードウェアアクセラレーション: これが最も重要な要因です。CPUにAES-NIまたは類似の命令がある場合、AES-GCMはほぼ間違いなくChaCha20-Poly1305を上回ります。それがない場合、ChaCha20-Poly1305が優位に立つ可能性があります。
  2. SSHクライアントとサーバーの実装: SSHソフトウェア(例:OpenSSH)およびそれが使用する暗号ライブラリ(例:OpenSSL)の効率は、実世界のパフォーマンスに影響を与える可能性があります。新しいバージョンには、しばしば最適化が含まれています。
  3. ネットワークの状態: 暗号速度に直接関係はありませんが、ネットワーク遅延と利用可能な帯域幅は、暗号パフォーマンスの体感的な違いを隠したり増幅させたりする可能性があります。非常に遅いネットワークでは、暗号化のCPUコストはネットワークの制限と比較して無視できるかもしれません。非常に高速なネットワーク(例:10 Gbps以上)では、CPUに制約される暗号化がボトルネックになる可能性があります。
  4. データ量とタイプ: 異なるデータサイズ(小さなファイル対大きなファイル)とタイプ(圧縮可能対非圧縮可能)でベンチマークを行うと、異なるパフォーマンス特性が明らかになることがあります。例えば、非常に小さな転送は、暗号速度よりも接続確立のオーバーヘッドによって支配される可能性があります。

SSH暗号のパフォーマンスをベンチマークする方法

ベンチマークは、SSHに特定の暗号を使用するよう明示的に指示し、既知の量のデータを転送するのにかかる時間を測定することを含みます。これにより、直接的な比較が可能になります。

1. サポートされている暗号を特定する

開始する前に、SSHサーバーがどの暗号をサポートしているかを確認してください。これは通常、サーバーの sshd_config ファイルで確認できるか、または nmap --script ssh-auth-methods <IP> を使用してNMAPスキャンを実行することで確認できます。ネゴシエートされた暗号を確認するより簡単な方法は、詳細なSSH出力を使用することです。

ssh -vvv user@your_server

debug1: kex: server->client cipher: [email protected] MAC: <implicit> compression: none のような行を探してください。

2. ssh -c で暗号を指定する

ssh クライアントでは、-c フラグを使用して目的の暗号を指定できます。カンマ区切りのリストを提供でき、クライアントはリストからサポートされている最初の暗号を使用しようとします。

テストする一般的な暗号:
* [email protected]
* [email protected]
* [email protected]

3. 転送方法とデータソースを選択する

一貫性のあるベンチマークを行うには、既知の量のデータを転送する方法が必要です。

  • scp (Secure Copy): ファイル転送に最適です。暗号がボトルネックとなり、圧縮やディスクI/Oではないことを確実にするために、大きく圧縮不可能なファイルを使用してください。
  • sftp (SSH File Transfer Protocol): scp と似ており、このプロトコルを好む場合に有用です。
  • dd (Data Duplicator): SSH経由でパイプするデータストリームを生成でき、クライアント側のファイルシステムオーバーヘッドなしで純粋なスループットテストに役立ちます。

実践的なベンチマークの手順

クライアントからサーバーへの転送をベンチマークすると仮定します。意味のある測定を可能にするのに十分な大きさ(例:1GB)でありながら、テストに時間がかかりすぎない程度のテストファイルをクライアント(またはサーバー)に用意する必要があります。圧縮不可能なテストファイルを作成する良い方法は、/dev/urandom または /dev/zero を使用することです。

クライアント側で(1GBのダミーファイルを作成する):

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

scp を使用したベンチマーク:

  1. AES256-GCMのテスト:
    bash echo "Testing AES256-GCM..." time scp -c [email protected] dummy_1GB.bin user@your_server:/tmp/test_gcm.bin

  2. ChaCha20-Poly1305のテスト:
    bash echo "Testing ChaCha20-Poly1305..." time scp -c [email protected] dummy_1GB.bin user@your_server:/tmp/test_chacha.bin

  3. AES128-GCMのテスト(多くの場合最速):
    bash echo "Testing AES128-GCM..." time scp -c [email protected] dummy_1GB.bin user@your_server:/tmp/test_aes128_gcm.bin

ddpv を使用したベンチマーク(リアルタイムスループット用):

この方法は、SSHを介してデータをパイプし、リアルタイムの速度を表示できるため、ディスクI/Oがボトルネックになるのを減らします。pv (Pipe Viewer) は、進行状況とスループットの情報を提供します。

pv をインストールするには(未インストールの場合は):

sudo apt-get install pv # Debian/Ubuntu
sudo yum install pv     # RHEL/CentOS
sudo brew install pv    # macOS
  1. ddpv を使用したAES256-GCMのテスト:
    bash echo "Testing AES256-GCM with dd..." dd if=/dev/zero bs=1M count=1024 | pv | ssh -c [email protected] user@your_server "cat > /dev/null"

  2. ddpv を使用したChaCha20-Poly1305のテスト:
    bash echo "Testing ChaCha20-Poly1305 with dd..." dd if=/dev/zero bs=1M count=1024 | pv | ssh -c [email protected] user@your_server "cat > /dev/null"

ヒント: 各テストを複数回(例:3〜5回)実行し、ネットワークの変動やシステム負荷を考慮して平均を取ります。

結果の解釈と推奨事項

ベンチマークを実行した後、time コマンド出力の real 時間、または pv が報告した平均スループットを比較します。おそらく、明確なパターンが観察されるでしょう。

  • AES-NIを搭載したモダンCPU: ほぼ間違いなく、[email protected][email protected] が最高のスループットを提供することがわかります。AES-128は、ラウンド数が少ないためAES-256よりもわずかに高速であることが多いですが、ハードウェアアクセラレーション対応システムではその差は無視できる可能性があります。
  • 古いCPU、ARM(特定の暗号拡張機能なし)、または仮想マシン: ChaCha20-Poly1305は、そのソフトウェア最適化された設計がこれらのシナリオで優れているため、AES-GCMと同等、あるいは上回るパフォーマンスを発揮する可能性があります。

推奨事項:

  • 最新のIntel/AMD CPU(およびAES-NI)を搭載した高性能サーバーの場合: AES-GCM(特に [email protected]を優先してください。ハードウェアアクセラレーションを活用し、優れた速度とセキュリティを実現します。
  • 多様な環境、古いハードウェア、ARMベースのシステム、またはソフトウェアパフォーマンスを重視する場合: ChaCha20-Poly1305は優れた選択肢であり、ハードウェア固有の機能に依存せずに、さまざまなアーキテクチャで一貫した高いパフォーマンスと強力なセキュリティを提供します。
  • セキュリティを最優先: 常に認証付き暗号化(AEAD)を提供する暗号を選択してください。AES-GCMとChaCha20-Poly1305は両方ともAEAD暗号であり、強力であると見なされています。可能な限り、aes*-cbcのような古い非AEAD暗号は避けてください。

その他のSSHパフォーマンスに関する考慮事項

暗号の選択は重要ですが、それがより広範なパフォーマンスの一部であることを忘れないでください。

  • 圧縮: SSHは暗号化の前にデータを圧縮できます(-o Compression=yes または ~/.ssh/configCompression yes)。低速なリンクを介した圧縮率の高いデータの場合、わずかなCPUオーバーヘッドが追加されても、体感速度が劇的に向上する可能性があります。すでに圧縮されているデータや非常に高速なリンクの場合、パフォーマンスが低下する可能性があります。
  • 接続多重化(Connection Multiplexing): OpenSSHの ControlMaster のような機能を使用すると、複数のSSHセッションが単一の基盤となるTCP接続を再利用できるため、後続の接続におけるハンドシェイクのオーバーヘッドが削減されます。
  • MTU (Maximum Transmission Unit): ネットワークのMTUが最適化されていることを確認し、パフォーマンスを低下させる可能性のあるフラグメンテーションを防ぎます。
  • SSHクライアント/サーバーのバージョン: SSHクライアントとサーバーソフトウェアを最新の状態に保ってください。新しいバージョンには、パフォーマンスの向上と、より新しく高速な暗号のサポートが含まれていることがよくあります。

結論

SSH暗号の選択を最適化することは、セキュリティを損なうことなく、セキュアなデータ転送のパフォーマンスを向上させる強力な方法です。AES-GCMやChaCha20-Poly1305のようなモダンな暗号の特性を理解し、特定のネットワーク環境で実践的なベンチマークを実施することで、情報に基づいた決定を下すことができます。

「最速」の暗号はコンテキストに依存することを覚えておいてください。迅速なベンチマークセッションにより、インフラストラクチャにとって速度とセキュリティの最適なバランスを真に提供する暗号がどれであるかが明らかになります。SSH構成を定期的に見直し、効率的でセキュアなネットワークを維持するために、暗号化パフォーマンスの新しい開発に常に注意を払ってください。