5.6. インスタンスのメモリーを暗号化するための AMD SEV コンピュートノードの設定
この機能は、このリリースでは テクノロジープレビュー として提供しているため、Red Hat では全面的にはサポートしていません。これは、テスト用途にのみご利用いただく機能です。実稼働環境にはデプロイしないでください。テクノロジープレビュー機能の詳細は、対象範囲の詳細 を参照してください。
AMD が提供する Secure Encrypted Virtualization (SEV) は、実行中の仮想マシンインスタンスが使用している DRAM のデータを保護します。SEV は、各インスタンスのメモリーを一意の鍵で暗号化します。
クラウドユーザーは、メモリーの暗号化が有効な SEV 対応コンピュートノード上で動作するインスタンスを作成することができます。
この機能は、2nd Gen AMD EPYC™ 7002 Series ("Rome") から利用できます。
クラウドユーザーがメモリーの暗号化を使用するインスタンスを作成できるようにするには、以下のタスクを実施する必要があります。
- メモリーの暗号化用に AMD SEV コンピュートノードを指定する。
- メモリーの暗号化用にコンピュートノードを設定する。
- データプレーンをデプロイします。
- メモリーを暗号化してインスタンスを起動するためのフレーバーまたはイメージを作成する。
AMD SEV ハードウェアが制限されている場合は、ホストアグリゲートを設定して AMD SEV コンピュートノードでのスケジューリングを最適化することもできます。メモリーの暗号化を要求するインスタンスのみを AMD SEV コンピュートノードにスケジュールするには、AMD SEV ハードウェアを持つコンピュートノードのホストアグリゲートを作成し、Compute スケジューラーがメモリーの暗号化を要求するインスタンスのみをホストアグリゲートに配置するように設定します。
詳細は、Creating and managing host aggregates および Filtering by isolating host aggregates を参照してください。
5.6.1. Secure Encrypted Virtualization (SEV) リンクのコピーリンクがクリップボードにコピーされました!
AMD が提供する Secure Encrypted Virtualization (SEV) は、動作中の仮想マシンインスタンスが使用している DRAM のデータを保護します。SEV は、各インスタンスのメモリーを一意の鍵で暗号化します。
SEV は、不揮発性メモリーテクノロジー (NVDIMM) を使用する際にセキュリティーを強化します。ハードドライブと同様に、NVDIMM チップはデータが保存されたままシステムから物理的に取り外すことができるためです。暗号化しないと、機密データ、パスワード、またはシークレットキー等の保存された情報が危険にさらされる可能性があります。
詳細は、AMD Secure Encrypted Virtualization (SEV) のドキュメントを参照してください。
メモリー暗号化を使用したインスタンスには、以下のような制限があります。
- メモリー暗号化を使用するインスタンスのライブマイグレーションや、インスタンスを一時停止および再開することはできません。
- PCI パススルーを使用して、メモリーの暗号化を使用するインスタンス上のデバイスに直接アクセスすることはできません。
kernel-4.18.0-115.el8 (RHEL-8.1.0) 以前の Red Hat Enterprise Linux (RHEL) カーネルでメモリー暗号化を使用するインスタンスのブートディスクとして
virtio-blkを使用することはできません。注記virtio-scsiまたはSATAをブートディスクとして使用することができます。また、ブートディスク以外の用途にvirtio-blkを使用することができます。- 暗号化されたインスタンスで実行されているオペレーティングシステムは、SEV をサポートしている必要があります。詳細は、Red Hat ナレッジベースのソリューション Enabling AMD Secure Encrypted Virtualization in RHEL 8 を参照してください。
- SEV をサポートするマシンでは、暗号鍵を格納するためのメモリーコントローラーのスロット数に制限があります。動作中のメモリーが暗号化された各インスタンスは、これらのスロットの 1 つを使用します。したがって、同時に実行できるメモリー暗号化インスタンスの数は、メモリーコントローラーのスロット数に制限されます。たとえば、1st Gen AMD EPYC™ 7001 Series ("Naples") の場合、制限は 16 で、2nd Gen AMD EPYC™ 7002 Series ("Rome") では上限は 255 です。
- メモリー暗号化を使用するインスタンスの RAM ページの固定Compute サービスはこれらのページをスワップすることができないため、メモリーが暗号化されたインスタンスをホストするコンピュートノードでメモリーをオーバーコミットすることはできません。
- NUMA ノードが複数あるインスタンスでは、メモリーの暗号化を使用することはできません。
5.6.2. メモリー暗号化用 AMD SEV コンピュートノードの指定 リンクのコピーリンクがクリップボードにコピーされました!
メモリーの暗号化を使用するインスタンス用に AMD SEV コンピュートノードを指定するには、AMD SEV ロールを設定するための新規ノードセットを作成し、メモリーの暗号化のためにコンピュートノードをタグ付けするための AMD SEV リソースクラスを持つベアメタルノードを設定する必要があります。
次の手順は、まだプロビジョニングされていない新しいデータプレーンノードに適用されます。すでにプロビジョニングされている既存のノードにリソースクラスを割り当てるには、スケールダウン手順を使用してノードをプロビジョニング解除してから、スケールアップ手順を使用して新しいリソースクラスの割り当てでノードを再プロビジョニングする必要があります。
詳細は、Red Hat OpenStack Services on OpenShift デプロイメントのカスタマイズ の 機能またはワークロード用のノードセットの設定 を参照してください。
5.6.3. メモリー暗号化用 AMD SEV コンピュートノードの設定 リンクのコピーリンクがクリップボードにコピーされました!
クラウドユーザーがメモリーの暗号化を使用するインスタンスを作成できるようにするには、AMD SEV ハードウェアを持つコンピュートノードを設定する必要があります。
ノードセット全体のみ設定できます。ノードセット内のノードのサブセットを再設定することはサポートされていません。ノードセット内のノードのサブセットを再設定する必要がある場合は、ノードセットをスケールダウンし、以前に削除したノードから新しいノードセットを作成する必要があります。
前提条件
-
ocコマンドラインツールがワークステーションにインストールされている。 -
cluster-admin権限を持つユーザーとして、Red Hat OpenStack Services on OpenShift (RHOSO) にログインしている。 -
CPU ピニングを設定するノードを定義する
OpenStackDataPlaneNodeSetCR を選択した。OpenStackDataPlaneNodeSetCR 作成の詳細は、Red Hat OpenStack Services on OpenShift のデプロイ ガイドの 事前プロビジョニングされたノードを使用した OpenStackDataPlaneNodeSet CR の作成 を参照してください。 デプロイメントには、SEV に対応する AMD ハードウェア (AMD EPYC CPU 等) 上で実行されるコンピュートノードが含まれている必要があります。以下のコマンドを使用して、デプロイメントが SEV に対応しているかどうか判断することができます。
$ lscpu | grep sev
手順
nova-extra-config.yamlという名前の ConfigMap CR を作成または更新し、[libvirt]の下にあるパラメーターの値を設定します。apiVersion: v1 kind: ConfigMap metadata: name: nova-extra-config namespace: openstack data: 30-nova-amd-sev.conf: | [libvirt] num_memory_encrypted_guests = 15注記libvirt/num_memory_encrypted_guestsパラメーターのデフォルト値は none です。カスタム値を設定しない場合、AMD SEV コンピュートノードは、ノードが同時にホストできるメモリーが暗号化されたインスタンスの数に制限を設けません。代わりに、ハードウェアが、AMD SEV コンピュートノードが同時にホストできるメモリーが暗号化されたインスタンス数の最大値を決定します。この場合、メモリーが暗号化されたインスタンスの一部が起動に失敗する可能性があります。注記Q35 マシンタイプはデフォルトのマシンタイプであり、SEV に必要です。
-
AMD SEV コンピュートノードのカーネルパラメーターを設定するには、更新するノードセットの
OpenStackDataPlaneNodeSetCR 定義ファイル (例:my_data_plane_node_set.yaml) を開きます。 必要なネットワーク設定を追加するか、
ansibleVarsの下のedpm_kernel_argsで既存の設定を変更します。apiVersion: dataplane.openstack.org/v1beta1 kind: OpenStackDataPlaneNodeSet metadata: name: my-data-plane-node-set spec: ... nodeTemplate: ... ansible: ansibleVars: edpm_kernel_args: "kvm_amd.sev=1"オプション: ホストメモリーを暗号化するには、
edpm_kernel_argsにmem_encrypt=onを追加します。警告デバイスドライバーがメモリー暗号化をサポートしていることを確認してください。
edpm_kernel_args: "kvm_amd.sev=1 mem_encrypt=on"新しい
OpenStackDataPlaneDeploymentCR を作成し、データプレーンノード上のサービスを設定してデータプレーンをデプロイし、ワークステーション上のcompute_amd_sev_deploy.yamlという名前のファイルに保存します。apiVersion: dataplane.openstack.org/v1beta1 kind: OpenStackDataPlaneDeployment metadata: name: openstack-edpm-amd-sevcompute_amd_sev_deploy.yamlで、デプロイするすべてのOpenStackDataPlaneNodeSetCR を含めるようにnodeSetsを指定します。前提条件として選択したOpenStackDataPlaneNodeSetCR が含まれていることを確認してください。このOpenStackDataPlaneNodeSetCR は、メモリー暗号化に指定するノードを定義します。警告デプロイメントに複数のノードセットがある場合、NodeSet と DataPlaneServices がどのように設定されているかにより、
nova-extra-config.yamlConfigMap への変更が複数のノードセットに直接影響する可能性があります。ノードセットがnova-extra-config.yamlConfigMap を使用しているために再設定の影響を受けるかを確認するには、次の手順を実行します。- ノードセットのサービスリストを確認し、nova を指す DataPlaneService の名前を見つけます。
DataPlaneService の
edpmServiceTypeフィールドの値がnovaに設定されていることを確認します。DataPlaneService の dataSources リストに
nova-extra-configという名前の configMapRef が含まれている場合、このノードセットはその ConfigMap を使用するため、ConfigMap に加えた設定変更の影響を受けます。影響を受けるノードセットの一部を再設定しない場合は、これらのノードセットの別の ConfigMap を指す新しい DataPlaneService を作成する必要があります。
apiVersion: dataplane.openstack.org/v1beta1 kind: OpenStackDataPlaneDeployment metadata: name: openstack-edpm-amd-sev spec: nodeSets: - openstack-edpm - compute-amd-sev - my-data-plane-node-set - ... - <nodeSet_name>-
<nodeSet_name>を、データプレーンデプロイメントに含める OpenStackDataPlaneNodeSet CR の名前に置き換えます。
-
compute_amd_sev_deploy.yamlデプロイメントファイルを保存します。 データプレーンをデプロイします。
$ oc create -f compute_amd_sev_deploy.yamlデータプレーンがデプロイされていることを確認します。
$ oc get openstackdataplanenodeset NAME STATUS MESSAGE openstack-edpm True Deployedopenstackclientのリモートシェルにアクセスし、デプロイされたコンピュートノードがコントロールプレーンに表示されることを確認します。$ oc rsh -n openstack openstackclient $ openstack hypervisor list
5.6.4. メモリー暗号化用のイメージの作成 リンクのコピーリンクがクリップボードにコピーされました!
データプレーンに AMD SEV コンピュートノードが含まれる場合、AMD SEV インスタンスイメージを作成することができます。クラウドユーザーはこのイメージを使用して、メモリーが暗号化されたインスタンスを起動することができます。
クラウド上で openstack クライアントコマンドを実行するには、clouds.yaml ファイルに詳細が記載されているクラウドの名前を指定する必要があります。次のいずれかの方法を使用して、クラウドの名前を指定できます。
各コマンドで
--os-cloudオプションを使用します。$ openstack flavor list --os-cloud <cloud_name>複数のクラウドにアクセスする場合は、このオプションを使用します。
bashrcファイルにクラウド名の環境変数を作成します。`export OS_CLOUD=<cloud_name>`
前提条件
-
管理者がプロジェクトを作成し、管理者からクラウドにアクセスするための
clouds.yamlファイルが提供されている。 -
python-openstackclientパッケージがインストールされている。
手順
メモリー暗号化用の新規イメージの作成
$ openstack image create ... \ --property hw_firmware_type=uefi amd-sev-image注記既存のイメージを使用する場合、イメージの
hw_firmware_type属性がuefiに設定されている必要があります。イメージに属性
hw_mem_encryption=Trueを追加して、イメージで AMD SEV のメモリー暗号化を有効にします。$ openstack image set \ --property hw_mem_encryption=True amd-sev-imageヒントフレーバーでメモリー暗号化を有効にすることができます。詳細は、Creating a flavor for memory encryption を参照してください。
5.6.5. メモリー暗号化用のフレーバーの作成 リンクのコピーリンクがクリップボードにコピーされました!
データプレーンに AMD SEV コンピュートノードが含まれる場合、1 つまたは複数の AMD SEV フレーバーを作成することができます。クラウドユーザーはこのイメージを使用して、メモリーが暗号化されたインスタンスを起動することができます。
前提条件
-
ワークステーションに
ocコマンドラインツールがインストール済みである。 -
cluster-admin権限を持つユーザーとして、RHOSO コントロールプレーンにアクセスできるワークステーションにログオン済みである。
AMD SEV フレーバーは、hw_mem_encryption 属性がイメージで設定されていない場合にのみ必要です。
手順
ワークステーションから OpenStackClient Pod のリモートシェルにアクセスします。
$ oc rsh -n openstack openstackclientメモリー暗号化用のフレーバーを作成します。
$ openstack flavor create --vcpus 1 --ram 512 --disk 2 \ --property hw:mem_encryption=True m1.small-amd-sevopenstackclient Pod を終了します。
$ exit
5.6.6. メモリーが暗号化されたインスタンスの起動 リンクのコピーリンクがクリップボードにコピーされました!
メモリーの暗号化を有効にして AMD SEV コンピュートノードでインスタンスを起動できることを確認するには、メモリー暗号化フレーバーまたはイメージを使用してインスタンスを作成します。
クラウド上で openstack クライアントコマンドを実行するには、clouds.yaml ファイルに詳細が記載されているクラウドの名前を指定する必要があります。次のいずれかの方法を使用して、クラウドの名前を指定できます。
各コマンドで
--os-cloudオプションを使用します。$ openstack flavor list --os-cloud <cloud_name>複数のクラウドにアクセスする場合は、このオプションを使用します。
bashrcファイルにクラウド名の環境変数を作成します。`export OS_CLOUD=<cloud_name>`
前提条件
-
管理者がプロジェクトを作成し、管理者からクラウドにアクセスするための
clouds.yamlファイルが提供されている。 -
python-openstackclientパッケージがインストールされている。
手順
AMD SEV フレーバーまたはイメージを使用してインスタンスを作成します。以下の例では、メモリー暗号化用のフレーバーの作成 で作成したフレーバーおよび メモリー暗号化用のイメージの作成 で作成したイメージを使用してインスタンスを作成します。
$ openstack server create --flavor m1.small-amd-sev \ --image amd-sev-image amd-sev-instance- クラウドユーザーとしてインスタンスにログインします。
インスタンスがメモリーの暗号化を使用していることを確認するには、インスタンスから以下のコマンドを入力します。
$ dmesg | grep -i sev AMD Secure Encrypted Virtualization (SEV) active