| 改訂履歴 | |
|---|---|
| 2025-06-12 | |
AMD 社が提供する Secure Encrypted Virtualization-Secure Nested Paging (SEV-SNP) を使用することで、お使いの仮想マシンに対するセキュリティを強化することができます。 AMD SEV-SNP 機能は仮想マシンをホストシステムや他の仮想マシンから切り離し、データやコードの保護を提供する仕組みです。この機能ではデータを暗号化するほか、仮想マシン内で実行するコードやデータを検出して追跡する仕組みを備えています。この仕組みにより仮想マシンを分離することができますので、たとえ仮想マシンが不正侵入された場合であっても、他の仮想マシンやホストマシンに影響が無いようにすることができます。
本章では、お使いの AMD EPYC サーバで openSUSE Leap 15.7 を利用した際に、 AMD SEV-SNP 機能を有効化するための手順を説明しています。
AMD SEV-SNP 仮想マシンを実行するには、 AMD 社の EPYC (第 3 世代もしくはそれ以降) を搭載したシステムが必要となります。また、 BIOS 設定でコンフィデンシャル・コンピューティング機能を有効化する設定が提供されている必要もあります。
AMD SEV-SNP を有効化した VM ゲスト を動作させるには、まず VM ホストサーバ 側において設定調整を実施する必要があります。 SUSE Linux Enterprise Server 15 SP7 では、既定の IOMMU はパススルーに設定されていますが、 AMD SEV-SNP を使用するには非パススルーモードに設定しなければなりません。これは、暗号化された VM ゲスト からメモリを介して物理デバイスにアクセスしてしまうと、データの整合性が損なわれる危険性があるためです。なお、任意でインストールする snphost ツールを利用するには、 MSR カーネルモジュールが必要となります。
msr モジュールを起動時に読み込むように設定するには、下記のように実行します:
>sudoecho "msr" > /etc/modules-load.d/msr.conf
openSUSE Leap 15.7 で IOMMU の設定を無効化するには、 /etc/default/grub ファイルを開いて、 GRUB_CMDLINE_LINUX_DEFAULT 変数内に iommu=nopt を追加します。
設定変更後はブートローダの設定を更新します。下記のコマンドを実行してください:
>sudo;update-bootloader
あとはシステムを再起動することで、 Confidential Compute Module が有効化されたカーネルを起動することができます。なお、ブートローダ側の設定で既定のカーネルとして選択されていない場合は、起動メニューで選択しておいてください。
VM ホストサーバ のインストールと設定が正しくできているかどうかを確認するには、 dmesg もしくは任意でインストールする snphost ツールを使用します。
また、カーネルの起動時に AMD Secure Processor の初期化結果が出力されていることを確認します。下記のようにコマンドを実行して確認してください:
>sudodmesg | grep -i ccp[ 10.103166] ccp 0000:42:00.1: enabling device (0000 -> 0002) [ 10.114951] ccp 0000:42:00.1: no command queues available [ 10.127137] ccp 0000:42:00.1: sev enabled [ 10.133152] ccp 0000:42:00.1: psp enabled [ 10.240817] ccp 0000:42:00.1: SEV firmware update successful [ 11.128307] ccp 0000:42:00.1: SEV API:1.55 build:8 [ 11.135057] ccp 0000:42:00.1: SEV-SNP API:1.55 build:8
上記のように SEV-SNP API のバージョン文字列が表示されていれば、 AMD Secure Processor の準備ができたことになります。なお、上記のように表示されていない場合は、 BIOS 設定が正しくないか、 IOMMU の設定が更新されていないものと考えられます。
Confidential Compute Module が有効化されたカーネルを利用して起動し、 AMD セキュリティプロセッサが初期化されていれば、あとは libvirt フレームワーク内で仮想マシンを実行することで、 AMD SEV-SNP で保護された仮想マシンを起動することができます。
libvirt では新しい仮想マシンを設定するにあたって複数の方法が提供されています。本文書では、 virt-manager グラフィカルユーザインターフェイスを利用してディスクイメージの作成から仮想マシンの作成までを実施するものとします。
virt-manager を利用して AMD EPYC ホストに接続し、新しい仮想マシンを作成します。
新しい仮想マシンの作成ウインドウ内では、それぞれ下記を選択します:
まずはインストールしたいオペレーティングシステムを選択します。
ISO イメージまたは CD-ROM インストールメディアを選択します。
メモリや CPU の設定を実施します。
あとは必要なストレージ設定を実施します。
手順の 5 番目では、設定内容を確認したあと、 インストールの前に設定をカスタマイズする を選択します。
完了 を押します。
仮想マシンの設定ウインドウでは、 XML タブを選択します。
XML タブでは libvirt が使用する仮想マシンの XML 設定を直接編集することができます。
AMD SEV-SNP で仮想マシンを保護するには、下記のようにして os セクション内で適切なファームウエアを選択する必要があります:
loader 内で OVMF の SEV 対応版を設定してください。
また、 launchSecurity セクションを追加する必要があります。 AMD SEV-SNP の場合は、下記のようになります:
設定が終わったら 適用 を押し、 詳細 タブを選択します。
左側の一覧で を選択して、 CPU の 種類 を に変更します:
適用 ボタンを押し、 インストールの開始 を押します。
これにより仮想マシンを起動することができます。後は必要に応じてインストールを実施してください。インストール後は再度仮想マシンを起動して、 AMD SEV-SNP による保護が動作しているかどうかを確認します。
仮想マシンの実行状態だけではコンフィデンシャル・コンピューティングが有効化されているかどうかがわかりません。代わりに仮想マシン内で確認する方法がいくつか提供されています。
カーネルのログには、仮想マシン内での AMD メモリ暗号化機能に関するメッセージが出力されます。カーネルのログを確認するには、下記のようなコマンドを実行します:
>sudodmesg | grep -i sev-snp[ 1.986186] Memory Encryption Features active: AMD SEV SEV-ES SEV-SNP
カーネルログ内にメモリの暗号化機能として SEV-SNP が表示されていれば、コンフィデンシャル・コンピューティングが動作していて、仮想マシンに対してそれが有効化されていることがわかります。
仮想マシン内から SEV-SNP 機能が有効化されているかどうかを確認したい場合は、任意でインストールできる snpguest ツールを使用します。 snphost ツールと同様に、 snpguest では MSR カーネルモジュールが必要となります。仮想マシン内でメモリ暗号化機能の状態を確認するには、下記のようなコマンドを実行します:
>sudomodprobe msr && snpguest ok[ PASS ] - SEV: ENABLED [ PASS ] - SEV-ES: ENABLED [ PASS ] - SNP: ENABLED
AMD SEV-SNP 環境でセキュリティを証明するための、暗号方式として安全な方法もあります。
SEV-SNP の有効化が確認できたら、あとは認証処理を行うことで仮想マシンの機密性を確立することができるようになります。この認証処理は暗号処理をベースにした認証で、階層構造による証明関係を構築することで、検証済みのファームウエアや TCB レベルを使用した、正規の AMD ハードウエアであることを証明します。
認証処理に際しては、 snpguest と snphost というツールを使用します。
ゲスト内で snpguest ツールを使用することで、認証ワークフローを実行することができます。この処理では認証レポートを生成し、それぞれの AMD 証明書の連鎖にアクセスして、正しいプラットフォーム鍵で電子的に署名されていることを検証します。
まずは認証レポートと対応する要求ファイルを生成します。 --random フラグを指定することで、唯一性を保証するための乱数データを含めることができます:
>sudosnpguest report attestation-report.bin request-file.bin --random
次に鍵配布サービス (KDS) から AMD CA と ASK の各証明書を DER 形式で取得します。ここで、 genoa の箇所にはプロセッサモデルを指定します (モデルが異なる場合は変更してください):
>sudosnpguest fetch ca der genoa ./certs-kds
さらに生成された認証レポートを利用して、 Versioned Chip Endorsement Key (VCEK) を取得します:
>sudosnpguest fetch vcek der genoa ./certs-kds attestation-report.bin
取得した証明書を利用して、認証レポートを検証します:
>sudosnpguest verify attestation ./certs-kds attestation-report.binReported TCB Boot Loader from certificate matches the attestation report. Reported TCB TEE from certificate matches the attestation report. Reported TCB SNP from certificate matches the attestation report. Reported TCB Microcode from certificate matches the attestation report. Chip ID from certificate matches the attestation report. VEK signed the Attestation Report!
なお、 snpguest certificates コマンドを利用した拡張型の認証ワークフローは QEMU 側の機能に依存して動作するものですが、こちらは現時点では利用できません。
ホスト側では、必要に応じてゲスト側の認証レポートを検証するための AMD 証明書連鎖を取得および検証することができます。
AMD 社の鍵配布サービス (KDS) から AMD CA と ASK の各証明書を取得します:
>sudosnphost fetch ca pem ./certs
次に、プラットフォームに対応した Chip Endorsement Certificate (VCEK または VLEK) を取得します:
>sudosnphost fetch vek pem ./certs
取得した証明書の連鎖の正当性を検証します:
>sudosnphost verify ./certs• = self signed, ⬑ = signs, •̷ = invalid self sign, ⬑̸ = invalid signs ARK • ARK ⬑ ASK ASK ⬑ VCEK