VM を安全に起動する

このドキュメントでは、Google Distributed Cloud(GDC)エアギャップの仮想マシン(VM)インスタンスでセキュアブートまたは仮想化トラステッド プラットフォーム モジュール(vTPM)を有効にする方法について説明します。

このドキュメントは、GDC 環境の VM でセキュアブートと vTPM を構成するプラットフォーム管理者またはアプリケーション オペレーター グループのデベロッパーを対象としています。詳細については、GDC エアギャップ ドキュメントの対象読者をご覧ください。

セキュアブートについて

セキュアブートは、すべてのブート コンポーネントのデジタル署名を検証し、検証が失敗した場合にプロセスを停止することで、システムが正規のソフトウェアのみを実行することを保証する機能です。Unified Extensible Firmware Interface(UEFI)ファームウェアを使用して、メーカーがシステム ファームウェア、ブートローダー、読み込まれたバイナリへの署名に使用する証明書と鍵を管理します。

ブートごとに、UEFI ファームウェアは、各コンポーネントのデジタル署名を、保存されている承認済みの鍵と照合し、署名されていないコンポーネントや不適切に署名されたコンポーネントをブロックします。VM インスタンスでセキュアブートを有効にするには、VM の shieldConfig.bootType フィールドを uefi に、shieldConfig.enableSecureBoot を true に設定する必要があります。

UEFI の公式ドキュメントについては、https://uefi.org/sites/default/files/resources/UEFI_Secure_Boot_in_Modern_Computer_Security_Solutions_2013.pdf をご覧ください。

仮想トラステッド プラットフォーム モジュールについて

vTPM は、システム アクセスの認証に使用される鍵と証明書を保護する専用の仮想コンピュータ チップです。vTPM の詳細については、https://trustedcomputinggroup.org/trusted-platform-module-tpm-summary/ をご覧ください。

また、vTPM を使用してシールドやシーリングによって機密保護することもできます。シールされたストレージの詳細については、https://en.wikipedia.org/wiki/Trusted_Computing#SEALED-STORAGE をご覧ください。そのために vTPM を使用する方法については、Go 言語の GitHub にある Go-TPM プロジェクト(https://github.com/google/go-tpm)の例をご覧ください。

始める前に

gdcloud コマンドライン インターフェース(CLI)コマンドを使用するには、gdcloud CLI をダウンロード、インストール、構成していることを確認してください。Distributed Cloud のすべてのコマンドは gdcloud または kubectl CLI を使用し、オペレーティング システム(OS)環境を必要とします。

kubeconfig ファイルのパスを取得する

Management API サーバーに対してコマンドを実行するには、次のリソースが必要です。

  1. Management API サーバーの kubeconfig ファイルがない場合は、ログインして生成します。

  2. これらの手順では、MANAGEMENT_API_SERVER を Management API サーバーの kubeconfig ファイルのパスに置き換えます。

IAM ロールをリクエストする

VM でセキュアブートまたは vTPM を有効にするために必要な権限を取得するには、IAM プロジェクト管理者に仮想マシン プロジェクト管理者(project-vm-admin)ロールを付与するよう依頼してください。

すべての VM ロールは、VM が存在するプロジェクトの Namespace にバインドする必要があります。手順に沿ってアクセス権を確認します。

セキュアブートを有効にする

VM のセキュアブートを有効にします。プロジェクトの Namespace(PROJECT_NAMESPACE)にある VM_NAME という VM の場合は、次の手順を使用します。

  1. パッチを適用する前に、VM が実行中の場合は停止します。VM の実行中に shieldConfig にパッチを適用しようとすると、API から Forbidden エラー(Changes to shieldConfig are not allowed while the VM is running)が返されます。手順については、VM を停止するをご覧ください。

  2. VM カスタム リソースを更新して、セキュアブートを有効にします。

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT_NAMESPACE \
      patch virtualmachines.virtualmachine.gdc.goog VM_NAME \
      --type merge --patch $'
    spec:
      shieldConfig:
        bootType: uefi
        enableSecureBoot: true
    '
    

    次の変数を置き換えます。

    • MANAGEMENT_API_SERVER: 管理 API サーバーの kubeconfig ファイル。
    • PROJECT_NAMESPACE: VM が存在するプロジェクトの名前空間。
    • VM_NAME: VM の名前。
  3. パッチを正常に適用したら、VM を起動する手順に沿って VM を起動します。

  4. セキュアブートが有効になっていることを確認します。VM への SSH 接続を確立し、次のコマンドを実行します。

    mokutil --sb-state
    

    セキュアブートが正常に有効になっている場合、コマンドは SecureBoot enabled を返します。

    mokutil ツールでセキュアブートが有効になっていないことが報告された場合は、セキュアブート構成のトラブルシューティングの手順に沿って操作します。

セキュアブート構成のトラブルシューティング

  1. エディタで VM カスタム リソースを開きます。

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT_NAMESPACE \
      edit virtualmachines.virtualmachine.gdc.goog VM_NAME
    

    次の変数を置き換えます。

    • MANAGEMENT_API_SERVER: 管理 API サーバーの kubeconfig ファイル。
    • PROJECT_NAMESPACE: VM が存在するプロジェクトの名前空間。
    • VM_NAME: VM の名前。
  2. セキュアブートを有効にするの spec フィールドに表示されているように、欠落しているフィールドまたは値を探します。これらは必須です。

  3. 不足しているフィールドや誤った値がある場合は、spec を編集して不足しているフィールドを追加し、誤った値を修正します。

  4. ファイルを保存します。

  5. VM を再起動するの手順に沿って操作します。

上記の手順で問題が解決しない場合は、VM のオペレーティング システム(OS)に対応するドキュメントを確認して、OS のバージョンがセキュアブートをサポートしていることを確認します。

vTPM を有効にする

VM の vTPM を有効にします。プロジェクトの名前空間(PROJECT_NAMESPACE)にある VM_NAME という VM の場合は、次の手順を使用します。

  1. パッチを適用する前に、VM が実行中の場合は停止します。VM の実行中に shieldConfig にパッチを適用しようとすると、API から Forbidden エラー(Changes to shieldConfig are not allowed while the VM is running)が返されます。手順については、VM を停止するをご覧ください。

  2. VM カスタム リソースを更新して vTPM を有効にします。

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT_NAMESPACE \
      patch virtualmachines.virtualmachine.gdc.goog VM_NAME \
      --type merge --patch $'
    spec:
      shieldConfig:
        enableVtpm: true
    '
    

    次の変数を置き換えます。

    • MANAGEMENT_API_SERVER: 管理 API サーバーの kubeconfig ファイル。
    • PROJECT_NAMESPACE: VM が存在するプロジェクトの名前空間。
    • VM_NAME: VM の名前。
  3. パッチを正常に適用したら、VM を起動する手順に沿って VM を起動します。

  4. vTPM が有効になっていることを確認します。VM への SSH 接続を確立し、次のコマンドを実行します。

    dmesg | grep -i tpm
    

    vTPM が正常に有効になっている場合、コマンドは ACPI テーブルの一部として TPM モジュールを返します。出力は次のようになります。

    [    7.620985] tpm_tis MSFT0101:00: 2.0 TPM (device-id 0x1, rev-id 1)
    

    ACPI tables に TPM モジュールが表示されない場合は、vTPM 構成のトラブルシューティングの手順に沿って操作します。

vTPM 構成のトラブルシューティング

  1. エディタで VM カスタム リソースを開きます。

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT_NAMESPACE \
      edit virtualmachines.virtualmachine.gdc.goog VM_NAME
    

    次の変数を置き換えます。

    • MANAGEMENT_API_SERVER: 管理 API サーバーの kubeconfig ファイル。
    • PROJECT_NAMESPACE: VM が存在するプロジェクトの名前空間。
    • VM_NAME: VM の名前。
  2. vTPM を有効にするの spec フィールドに表示されているように、欠落しているフィールドまたは値を探します。これらは必須です。

  3. 不足しているフィールドや誤った値がある場合は、spec を編集して不足しているフィールドを追加し、誤った値を修正します。

  4. ファイルを保存します。

  5. VM を再起動するの手順に沿って操作します。

上記の手順で問題が解決しない場合は、VM のオペレーティング システム(OS)に対応するドキュメントを確認して、OS のバージョンが vTPM をサポートしていることを確認します。