【実務・中級編】 IPsecにおける暗号アルゴリズム(AES-GCM, AES-CBC)の特性 – ゼロトラスト&エンタープライズセキュリティ実践ガイド

なぜ今さらIPsecの「暗号アルゴリズム」を語るのか?――AES-GCM vs AES-CBC の決定的分岐点

現場でバリバリとWeb APIのバックエンドやインフラを触っているエンジニア諸君、お疲れ様。突然だが、君たちがクラウドとオンプレミスを繋ぐIPsecトンネルを構築する際、プロポーザル設定で「なんとなく推奨されているから」という理由で AES-GCM を選んではいないだろうか。あるいは、レガシーな装置の互換性維持のために、思考停止で AES-CBC を使い続けてはいないか。

ゼロトラストアーキテクチャが叫ばれる昨今、ネットワークの境界は消失したと言われるが、それでも拠点間接続やテレワークのインフラとしてIPsecは現役の「壁」だ。この壁を支える暗号アルゴリズムの選択は、単なるスペックの比較じゃない。それは、君たちのアプリケーションが叩き出すスループットや、パケットロス発生時の挙動を左右する「実務的な生命線」なんだ。

今日は、教科書には載っていない(載っていても読み飛ばされる)、この二つのアルゴリズムの「中の動き」に焦点を当てて解説しよう。

—

1. AES-CBC:かつての王者が抱える「逐次処理」の限界

AES-CBC (Cipher Block Chaining) は、長らくIPsecの標準だった。仕組みは直感的だ。前のブロックの暗号文を次のブロックの暗号化に利用する。これによって、同じ平文でも毎回異なる暗号文が生成される。

しかし、実務において AES-CBC には致命的な弱点がある。それは「完全性保護(Integrity)」のために別途 HMAC(SHA-256など)が必要になるという点だ。

CBCの通信フロー(実務的視点)

1. 暗号化: データを AES-CBC で暗号化する。
2. 認証: 暗号化されたデータに対して HMAC を計算し、MAC(Message Authentication Code)を付与する。
3. 検証: 受信側で HMAC を再計算し、一致しなければパケットを破棄する。

ここで発生するのが「二重のオーバーヘッド」だ。CPUは暗号化とハッシュ計算を別々に行わなければならない。特に高スループットなWeb API通信において、この処理の重さは CPU Load に直結する。さらに悪いことに、CBC は並列処理ができない。前のブロックが終わらないと次へ進めないからだ。

—

2. AES-GCM:現代のインフラに不可欠な「AEAD」の真価

一方、現代のインフラにおける救世主が AES-GCM (Galois/Counter Mode) だ。これは AEAD (Authenticated Encryption with Associated Data) と呼ばれる方式で、「暗号化」と「認証(改ざん検知)」を一つのプロセスで同時にやってのける。

なぜGCMが圧倒的に速いのか?

AES-GCM は内部的に CTR (Counter Mode) をベースにしている。CTR はブロックごとに独立して計算できるため、CPUのパイプラインをフル活用した「並列処理」が可能だ。現代のプロセッサが持つ AES-NI 命令セットと組み合わせれば、その速度差は歴然とする。

比較まとめ:

| 特徴 | AES-CBC + HMAC | AES-GCM |
| :— | :— | :— |
| 処理方式 | 逐次処理(遅い) | 並列処理(非常に速い) |
| 完全性保護 | 別途HMACが必要 | 暗号化に内包(AEAD) |
| CPU負荷 | 高い | 低い(ハードウェア支援と相性◎) |
| 実務推奨 | 互換性維持以外は非推奨 | 現在のデファクトスタンダード |

—

3. 実践:強固なIPsecトンネルを定義する

では、実機の設定例を見てみよう。例えば、StrongSwan を使ったLinuxベースのゲートウェイで AES-GCM を採用する場合、以下のように設定する。

# /etc/ipsec.conf の抜粋
conn vpn-to-cloud
    # 認証と暗号化をGCMで統合指定する(AEAD)
    # aes256gcm16 は 256bitの暗号化 + 128bitのICV(認証タグ)を意味する
    esp=aes256gcm16-sha256-modp2048
    
    # 鍵交換にはIKEv2を使うこと(必須!)
    ike=aes256gcm16-sha256-modp2048
    
    # ライフタイム設定(短めに設定して定期的に鍵を更新する)
    ikelifetime=28800s
    keylife=3600s

もし、古いネットワーク機器との接続で CBC を使わざるを得ない場合は、以下のように明示的にハッシュ関数を組み合わせる必要がある。

# レガシーな環境でCBCを使用する場合の例
esp=aes256-sha256-modp2048

※ ここで sha256 を指定しているのは、md5 や sha1 が既に衝突耐性を失っているためだ。インフラ屋としては、どんなに古くても sha1 は絶対に避けるべきだ。

—

4. エンジニアへのアドバイス:トラブルシュートの現場から

最後に、現場でよくある失敗談を一つ。

AES-GCM を採用した際、通信が不安定になるケースがある。原因の多くは「MTUの不一致」と「ICV(認証タグ)の付与によるパケットサイズ増」だ。

AES-GCM は HMAC を含んだ形でパケットを構築するため、CBC よりもパケットサイズが微妙に大きくなることがある。これが原因で、VPNトンネルを通るパケットがMTU制限に引っかかり、断片化(フラグメンテーション)やパケットロスを引き起こす。

APIのレスポンスが途中で切れる、といった不可解な現象に遭遇したら、まずは以下のコマンドでMSS(Maximum Segment Size)を調整してほしい。

# iptablesでVPNトンネルを通るTCPパケットのMSSをクランプする例
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -o eth0 -j TCPMSS --clamp-mss-to-pmtu

結びに代えて

技術は進化し、かつての「定石」は今の「ボトルネック」になる。AES-GCM への移行は単なる設定変更ではない。それは、君たちのインフラがより安全で、かつ効率的にスケールするための重要な一歩だ。

もし君が今のシステムで AES-CBC を使っているなら、まずは検証環境で AES-GCM に切り替えてパフォーマンスを計測してみるといい。その劇的な変化に、きっと驚くはずだ。

「なぜその設定なのか」を言語化できるエンジニアこそが、真に強いネットワークを守れるのだと、私は信じている。また次の現場で会おう。

コメント

タイトルとURLをコピーしました