| 改訂履歴 | |
|---|---|
| 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 の設定が更新されていないものと考えられます。
VM ホストサーバ 側で設定作業を行い、 AMD Secure Processor の初期化を行ったあとは、 libvirt フレームワークで AMD SEV-SNP による保護のある仮想マシンを作成し、インストールすることができます。インストールの手順は通常と同じで、 第9章 「ゲストのインストール」 に示している手順でインストールを行うことができます。ただし、仮想 CD-ROM ドライブによる ISO イメージからのインストールには対応していません。その他の詳しい制限事項については、制限事項の章をお読みください。
なお、仮想 CD-ROM 以外にも、 AMD SEV-SNP で保護した仮想マシンの場合、 VM ホストサーバ が提供する TPM デバイスは利用できません。インストール時の設定に含まれている場合は、これを取り除いてください。このほか、 SEV-SNP で保護した仮想マシンは再起動にも対応していません。そのため、インストール中に再起動が必要となる場合は、いったんシャットダウンするように設定してください。その他の詳しい制限事項については、制限事項の章をお読みください。
また 9.1項 「GUI ベースのゲストインストール」 では、 virt-manager を利用した GUI ベースの仮想マシンインストールの手順を説明しています。なお、 AMD SEV-SNP を有効化するには、 新しい仮想マシンの作成 の最後で 完了 を押す前に、 インストールの前に設定をカスタマイズする を選択する必要があることに注意してください。 VM ゲスト の設定ダイアログが表示されたら、 メモリー を選んで Enable launch security のチェックボックスを選択して 適用 を押します。あとは インストールの開始 を選択するだけで、 9.1項 「GUI ベースのゲストインストール」 で示した手順でインストールを行うことができます。
このほか 9.2項 「virt-install によるコマンドラインからのインストール」 では、 virt-install による仮想マシンインストールを説明しています。 AMD SEV-SNP を有効化したい場合は、 --launchSecurity オプションを指定してください。下記は 例9.2「virt-install コマンドラインの例」 でのインストールの際、 AMD SEV-SNP による保護を追加した場合の例です:
> virt-install --connect qemu:///system --virt-type kvm \
--name sle15sp7 --memory 4096 --disk size=60 --location /path/to/iso --graphics vnc \
--os-variant sle15sp7 --boot uefi --events on_reboot=destroy --launchSecurity type=sev-snpなお、 --launchSecurity に関する詳細については、 https://libvirt.org/formatdomain.html#launch-security にある Domain XML format マニュアル内の Launch Security の章をお読みください。
仮想マシンの実行状態だけではコンフィデンシャル・コンピューティングが有効化されているかどうかがわかりません。代わりに仮想マシン内で確認する方法がいくつか提供されています。
カーネルのログには、仮想マシン内での 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
SEV-SNP を有効化した VM ゲスト を動作させた場合、下記の制限があることに注意してください。
SEV-SNP で保護された VM 内で動作させるオペレーティングシステムは、 SEV-SNP に対応していなければなりません。 SUSE Linux Enterprise Server 15 SP6 またはそれ以降のバージョンであれば、 SEV-SNP に対応しています。
SEV-SNP で保護された VM ゲスト の場合、 virt-install で --cdrom オプションを指定したインストールは実施できません。代わりに --location オプションをお使いください。なお、 --location オプションに関する説明については、 virt-install のマニュアルページをお読みください。
SEV-SNP で保護された VM ゲスト では、仮想 CPU 数は最大 255 個までの対応となります。
SEV-SNP で保護された VM ゲスト は Secure Boot との互換性がありません。 Secure Boot サポートが有効化された UEFI ファームウエアを使用すると、 SEV-SNP 対応の VM ゲスト が動作しなくなります。
SEV-SNP で保護された VM ゲスト は、 VM ホストサーバ の提供する TPM デバイスを使用できません。これは TPM デバイスを擬似する場合と、パススルーする場合の両方に当てはまります。
SEV-SNP で保護された VM ゲスト では、ホストデバイスのパススルー (PCI パススルー) を使用することができません。
SEV-SNP で保護された VM ゲスト では、メモリバルーン機能には対応しません。
SEV-SNP で保護された VM ゲスト では、メモリや仮想 CPU のホットプラグには対応しません。
SEV-SNP で保護された VM ゲスト では、 huge page 機能には対応しません。
SEV-SNP で保護された VM ゲスト では、 reboot や shutdown -r now で再起動を行うことができません。再起動はいったんシャットダウンしてから起動し直す方式になります。
VM ゲスト のメモリ内容の保存と復元 (つまり VM ゲスト の状態保存) には対応していません。言い換えると、 SEV-SNP で保護された VM ゲスト ではスナップショット機能が利用できないばかりか、ライブマイグレーションにも対応できません。 SEV-SNP を別のホストに移行したい場合は、いったんシャットダウンして移行し、移行先で起動し直す手順が必要になります。
これらの制限事項は様々なハードウエアやファームウェア、およびソフトウエアの特定レイヤが原因となって発生しているもので、将来的に解決できるかもしれません。