なぜレイヤー2のセキュリティが最後の砦なのか
セキュリティチームは、WebトラフィックのTLSやサイト間VPNのIPsecに注力しがちです。これらは重要ですが、インフラの最下層は完全に無防備なまま残されてしまいます。侵入者がスイッチに物理的にアクセスしたり、ラック間の光ファイバーを盗聴したりすれば、すべてのパケットを傍受し、ARPスプーフィング攻撃を実行し、悪意のあるフレームを注入することが可能になります。MACsec (IEEE 802.1AE) はこのギャップを埋めるものです。
レイヤー3で動作するIPsecとは異なり、MACsecはイーサネットヘッダーより上のすべてを暗号化します.VLANタグ、IPヘッダー、TCP/UDPペイロードはすべて、第三者の目から隠されます。本番クラスターに導入した私の経験では、この保護は透過的です。アプリケーションコードを一行も変更することなく、リンクを保護できます。
現代のデータセンターでは通常、サーバーとスイッチの間や、ノード間の高速クロス接続にMACsecを導入します。ハードウェアで実装した場合、遅延のペナルティは実質的に存在せず、多くの場合2マイクロ秒未満です。カーネルのソフトウェア実装に依存するLinuxシステムであっても、現代のCPUのAES-NI命令により、パフォーマンスへの影響は驚くほど低く抑えられています。
システムの準備
Linuxはカーネルバージョン4.6からMACsecをサポートしていますが、設定には最新の <a href="https://itnotes.dev/ja/linux%e3%81%a7%e3%81%aeecmp%e3%83%ab%e3%83%bc%e3%83%86%e3%82%a3%e3%83%b3%e3%82%b0%e8%a8%ad%e5%ae%9a%ef%bc%9aiproute2%e3%81%a7%e8%a4%87%e6%95%b0%e3%82%b2%e3%83%bc%e3%83%88%e3%82%a6%e3%82%a7%e3%82%a4/">iproute2</a> パッケージが必要です。Ubuntu 22.04、Debian 12、RHEL 9などの現在の主要なディストリビューションであれば、標準で準備が整っています。
まず、カーネルモジュールが利用可能であることを確認します。
sudo modprobe macsec
lsmod | grep macsec
2番目のコマンドで macsec の行が返されれば準備完了です。そうでなければ、互換性の問題についてカーネルログを確認してください。また、現代のLinux環境でネットワークインターフェースを管理するための標準ツールである ip コマンドも必要です。
MACsecキーの構造
MACsecは、セキュアなリンクを確立するために2つの主要なコンポーネントを使用します。
- 接続アソシエーションキー (CAK): これはマスターシークレットキーです。
- 接続アソシエーションキー名 (CKN): CAKを識別する一意の16進数識別子です。
このガイドでは静的キーを使用します。大規模なエンタープライズ導入では動的なキーローテーションのために802.1X (MKA) がよく使われますが、サーバー間リンクや小規模なプライベートクラスターでは、静的キーの方が管理やトラブルシューティングが大幅に容易です。
ステップバイステップ設定ガイド
2台のサーバーがそれぞれの eth1 インターフェースを介して接続されていると仮定します。その物理リンクの上に、macsec0 という名前のセキュアな仮想インターフェースを構築します。
1. シークレットの生成
AES-128の場合、CKNとCAKの両方に32文字の16進数文字列が必要です。OpenSSLを使えば簡単に生成できます。
# ランダムな32文字の16進数CKNを生成
openssl rand -hex 16
# ランダムな32文字の16進数CAKを生成
openssl rand -hex 16
これらの値は安全に保管してください。通信を行うには、リンクの両端で同一のCKN and CAKを使用する必要があります。
2. MACsecインターフェースの初期化
サーバーAで仮想デバイスを定義します。「Secure Channel Identifier」(SCI) を指定する必要があります。これは通常、物理インターフェースのMACアドレスに4桁のポート番号(例:0001)を加えたものです。
# タイポを避けるために変数を設定
PHYS_DEV="eth1"
MACSEC_DEV="macsec0"
CKN="6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435"
CAK="0123456789abcdef0123456789abcdef"
# 仮想インターフェースを作成
sudo ip link add link $PHYS_DEV name $MACSEC_DEV type macsec sci $(cat /sys/class/net/$PHYS_DEV/address | tr -d ':')0001 encrypt on
3. 送信セキュリティアソシエーションの設定
次に、データを送信する際にどのキーを使用するかをインターフェースに伝えます。アソシエーション番号 (AN) として 0 を使用します。
sudo ip macsec add $MACSEC_DEV tx sa 0 pn 1 on key 01 $CKN $CAK
4. 受信パスの設定
サーバーAは、サーバーBからの着信トラフィックをどのように処理するかを知る必要があります。このステップではサーバーBのMACアドレスが必要です。サーバーBのMACアドレスが aa:bb:cc:dd:ee:ff の場合、設定は以下のようになります。
SERVER_B_MAC="aabbccddeeff"
sudo ip macsec add $MACSEC_DEV rx sci ${SERVER_B_MAC}0001 on
sudo ip macsec add $MACSEC_DEV rx sci ${SERVER_B_MAC}0001 sa 0 pn 1 on key 01 $CKN $CAK
5. リンクをオンラインにする
macsec0 インターフェースにIPアドレスを割り当てます。ベースとなる物理インターフェース eth1 は起動している必要がありますが、独自のIPアドレスを持つ必要はありません。
sudo ip addr add 10.0.0.1/24 dev $MACSEC_DEV
sudo ip link set $MACSEC_DEV up
sudo ip link set $PHYS_DEV up
サーバーBでもこれらの手順を繰り返します。サーバーBの rx 設定でサーバーAのMACアドレスを使用するように、SCI値を入れ替えるだけです。
テストとモニタリング
運命の瞬間は、2つのMACsec IPアドレス間での単純な ping です。パケットが流れれば、暗号化は有効である可能性が高いです。リンクの状態を確認するには、以下を実行します。
ip macsec show
out_pkts_encrypted カウンターに注目してください。トラフィックを送信する際にこの値が増加していれば、データは802.1AEフレームでラップされています。
tcpdumpによる検証
トラフィックが実際に読み取れないことを確認するには、物理インターフェース (eth1) で <a href="https://itnotes.dev/ja/linux%e3%81%a7tshark%e3%81%ab%e3%82%88%e3%82%8bdeep-pcap%e8%a7%a3%e6%9e%90%ef%bc%9a%e3%83%97%e3%83%ad%e3%83%88%e3%82%b3%e3%83%ab%e3%81%ae%e3%83%95%e3%82%a3%e3%83%ab%e3%82%bf%e3%83%aa%e3%83%b3%e3%82%b0/">tcpdump</a> を実行します。macsec0 インターフェースをスニッフィングしないでください。カーネルはそこで復号されたデータを表示してしまうからです。
sudo tcpdump -i eth1 -nn -e
EtherType 0x88e5 を探してください。これが表示されれば、ペイロードは暗号化されています。もし eth1 上で標準的なIPまたはTCPヘッダーが見える場合は、トラフィックが漏洩しており、暗号化が機能していません。
パフォーマンスの実態
現代のハードウェアでは、パフォーマンスへの影響はわずかです。中価格帯のXeonの1コアで、ソフトウェアMACsecを約15%のCPU使用率で10Gbps以上処理できることがよくあります。しかし、40Gbpsや100Gbpsのリンクでは、ソフトウェア処理は困難になります。そのような高帯域幅のシナリオでは、Intel X710やMellanox ConnectXシリーズなどのハードウェアオフロードをサポートするNICを使用して、暗号化処理をCPUから完全にオフロードすることをお勧めします。
設定の永続化
手動コマンドは再起動後に消失します。MACsecリンクを永続化するには、systemd-networkdを使用します。これにより、起動時にMACsecスタックを自動的に初期化する .netdev および .network ファイルを定義できます。あるいは、設定スクリプトを実行する単純なsystemdサービスを作成することも、メンテナンスサイクルを通じてリンクの安全性を維持するための信頼できる方法です。
MACsecは、多くの管理者がつい見落としがちな強力な低レイヤーツールです。これを導入することは、単にコンプライアンスのチェックボックスを埋めるだけでなく、最も直接的な形式の侵入に対してネットワークの物理的境界を根本的に強化することに繋がります。

