ProxmoxでAMD SEVを構成する:ホストが乗っ取られても仮想マシンのデータを保護する

Virtualization tutorial - IT technology blog
Virtualization tutorial - IT technology blog

なぜファイアウォールとパスワードだけでは仮想マシンの保護に不十分なのか?

最悪のシナリオを想像してみてください。攻撃者が物理サーバー(ホスト)のroot権限を奪取したとします。この時、仮想マシン(VM)内部のファイアウォールやディスク暗号化などのセキュリティメカニズムはすべて無力化されます。最高の管理者権限を持つ攻撃者は、VMのRAM全体を簡単にダンプし、パスワードやSSHキー、処理中の取引データなどを抽出できてしまいます。

AMD SEV (Secure Encrypted Virtualization) は、このようなシナリオを阻止するために誕生しました。ソフトウェア層(ハイパーバイザー)を信頼する代わりに、ハードウェアを信頼します。AMD CPUは各VM의メモリを個別のキーで暗号化します。たとえシステム管理者に悪意があったとしても、RAMの中身は無意味なデータの塊にしか見えません。

私は自宅で約12台のVMを搭載した小規模なProxmoxクラスターを運用しています。以前はあまり気にしていませんでしたが、VMエスケープ(仮想マシン脱出)の脆弱性について読んだ後、暗号通貨ノードや顧客情報を含むデータベースを運用する場合、メモリ層のセキュリティは必須であると痛感しました。

システム要件:すべてのCPUで動作するわけではない

SEVを導入するには、ハードウェアとソフトウェアの同期した連携が必要です。これはエミュレーションで有効にできる機能ではありません。

1. 対応ハードウェア

  • CPU: AMD EPYC(7001シリーズ以降)またはRyzen Proシリーズが必須です。一般的なRyzenシリーズ(5600X、5900Xなど)は、通常ハードウェアレベルでこの機能がロックされていることに注意してください。
  • マザーボード: チップセットが対応しており、BIOSにSEVを有効にするオプションがある必要があります。TyanやSupermicroなどのサーバー向けマザーボードは、ゲーミング向けよりもサポートが充実していることが多いです。
  • RAM: 少し余裕を持つ必要があります。SEVを有効にすると、RAM共有機能(Memory Ballooning)が完全に無効化されます。

2. 対応ソフトウェア

  • ハイパーバイザー: Proxmox VE 7.2以降が、現在最も安定した選択肢です。
  • ゲストOS: 仮想マシンはKernel 4.15以降を使用することを推奨します。Ubuntu 20.04/22.04やDebian 11/12などのディストリビューションは良好にサポートされています。

ProxmoxホストでAMD SEVを有効化する手順

まず、BIOS/UEFIに入り、Advanced > CPU ConfigurationSMESEV を有効にします。その後、SSH経由でProxmoxの設定を行います。

ステップ1:Linuxカーネルの設定

デフォルトでは、Proxmoxはリソース節約のためにSEVを自動的に有効にしません。grubファイルを編集する必要があります。

nano /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT の行を探し、パラメータ kvm_amd.sev=1 を追加します。この行は以下のようになります。

GRUB_CMDLINE_LINUX_DEFAULT="quiet rw kvm_amd.sev=1"

保存して設定を更新し、サーバーを再起動します。

update-grub
reboot

ステップ2:SEVステータスの確認

再起動後、以下のコマンドを使用してモジュールが正常にロードされたか確認します。

cat /sys/module/kvm_amd/parameters/sev

1 と表示されれば、準備完了です。同時にいくつのセキュアVMを実行できるか確認するには、次のコマンドを使用します。

dmesg | grep -i sev

例えば、sev: 15 ASIDs available というメッセージは、CPUが最大15台の暗号化仮想マシンを同時サポートしていることを意味します。最新のEPYCシリーズでは、数百のASIDをサポートしているものもあります。

暗号化を有効にするための仮想マシン(ゲスト)の設定

現在、ProxmoxのWebインターフェースにはSEVの切り替えボタンがありません。設定ファイルを手動で編集する必要があります。

ステップ1:VM設定ファイルの特定

VMの設定ファイルを開きます(例:IDが101の場合):

nano /etc/pve/qemu-server/101.conf

ステップ2:セキュリティパラメータの追加

SEVを動作させるには、VMでチップセット q35 とBIOS OVMF を使用する必要があります。ファイルに以下の行を追加します。

machine: q35
bios: ovmf
balloon: 0
args: -object sev-guest,id=sev0,cbitpos=47,reduced-phys-bits=1 -machine memory-encryption=sev0

技術解説:

  • cbitpos: RAMアドレス内の暗号化ビットの位置です。EPYC CPUでは通常 47 です。ホスト上で cpuid -1 | grep -i sev コマンドを実行して正確に確認できます。
  • reduced-phys-bits: 暗号化ビットのためにスペースを確保するため、通常は 1 に設定します。

仮想マシン内部からの成果確認

VMを起動してコンソールにログインします。以下のコマンドを実行して、セキュリティ層が機能していることを確認します。

dmesg | grep -i sev

AMD Secure Encrypted Virtualization (SEV) active という行が表示されれば成功です。これで、VMのRAM内のデータは他の環境から完全に隔離されました。

パフォーマンス評価

私の実際のテストでは、SEVを有効にすることでRAMのレイテンシが約2〜4%増加しました。CPUはデータの継続的な暗号化/復号化のために、わずかに処理サイクルを消費します。しかし、Webサーバーやデータベースなどのタスクでは、この違いを目視で認識することはほとんど不可能です。

重要な注意事項

SEVの導入は常にスムーズにいくとは限りません。以下の点に注意してください。

  1. スナップショットとライブマイグレーション: 実行中の仮想マシンの移動(ライブマイグレーション)はより複雑になり、クラスター全体で一貫したSEV構成が必要になります。
  2. メモリのエラー: VMが起動しない場合、その原因の90%は ballooning をオフにし忘れていることです。SEVでは RAMを完全に固定(Pinned)する必要があります。
  3. バックアップ: ディスク上のデータはSEVの影響を受けません(それはLUKSやVeraCryptの役割です)。SEVはRAM内の「稼働中」のデータのみを保護します。

AMD SEVを構成することで、インフラストラクチャレベルからZero Trust環境を構築できます。攻撃者が物理サーバーに接触したとしても、あなたのデータは彼らが決して触れることのできない安全な領域に留まります。

Share: