OpenVINO™ セキュリティー・アドオン#

このガイドでは、OpenVINO™ セキュリティー・アドオンを使用して、OpenVINO™ ツールキットで作成されたモデルを作成、配布、使用する手順を説明します:

  • モデル開発者: モデル開発者は、独立系ソフトウェア・ベンダーと対話して、モデルへのユーザーアクセスを制御します。このドキュメントでは、OpenVINO™ セキュリティー・アドオンを使用してハードウェアと仮想マシンをセットアップし、OpenVINO™ モデルへのアクセス制御を定義し、アクセス制御されたモデルをユーザーに提供する方法を説明します。

  • 独立系ソフトウェア・ベンダー: OpenVINO™ セキュリティー・アドオンを使用して、顧客 (ユーザー) に提供するアクセス制御モデルのライセンスを検証する手順については、このガイドを使用してください。

  • ユーザー: このドキュメントには、OpenVINO™ セキュリティー・アドオンを介して制御されたモデルにアクセスしてする必要があるエンドユーザー向けの手順が含まれています。

このリリースでは、1 人がモデル開発者と独立系ソフトウェア・ベンダーの両方の役割を果たします。したがって、このドキュメントでは、これら 2 つのロール用に 1 つのシステムを構成し、ユーザーロール用に 1 つのシステムを構成する手順を説明します。このドキュメントでは、同じ人物がモデル開発者、独立系ソフトウェア・ベンダー、およびユーザーの役割を果たす方法も提供し、ユーザーの観点から OpenVINO™ セキュリティー・アドオンがどのように機能するかを確認できるようにします。

概要#

OpenVINO™ セキュリティー・アドオンは、インテル® アーキテクチャー上の OpenVINO™ モデルサーバーと連携して動作します。OpenVINO™ セキュリティー・アドオンと OpenVINO™ モデルサーバーを併用すると、モデル開発者と独立系ソフトウェア・ベンダーが安全なパッケージングと安全なモデル実行を使用して OpenVINO™ モデルへのアクセス制御を可能にし、割り当てられた制限内でモデルユーザーが推論を実行できるようになります。

OpenVINO™ セキュリティー・アドオンは、カーネルベースの仮想マシン (KVM) で実行される 3 つのコンポーネントで構成されています。これらのコンポーネントは、分離された環境でセキュリティーが重要な操作を実行する方法を提供します。3 つのコンポーネントの概要は次のとおりです。それぞれの三角線をクリックすると詳細が表示されます。

OpenVINO™ セキュリティー・アドオン・ツール: モデル開発者や独立系ソフトウェア・ベンダーは、OpenVINO™ セキュリティー・アドオン・ツール (ovsatool) を使用して、アクセス制御されたモデルとマスターライセンスを生成できます。
  • モデル開発者は、OpenVINO™ ツールキットの出力からアクセス制御されたモデルを生成します。アクセス制御されたモデルは、モデルの中間表現 (IR) ファイルを使用して、モデルユーザーに配布されるアクセス制御された出力ファイルアーカイブを作成します。また、追加のセキュリティーなしでアーカイブファイルを長期保存したり、バックアップすることもできます。

  • モデル開発者は、OpenVINO™ セキュリティー・アドオン・ツール (ovsatool) を使用して、アクセス制御されたモデルの暗号キーと関連物を生成および管理します。暗号化マテリアルは、仮想マシン (VM) 環境でのみ使用できます。OpenVINO™ セキュリティー・アドオン・キー管理システムを使用すると、モデル開発者は外部の認証局を取得して、キーストアに追加する証明書を生成できます。

  • モデル開発者は、アクセス制御モデル用にユーザー固有のライセンスを JSON 形式ファイルで生成します。モデル開発者は、グローバルまたはユーザー固有のライセンスを定義し、ライセンスにポリシーを添付できます。例えば、モデル開発者はモデルに時間制限を追加したり、ユーザーがモデルを実行できる回数を制限したりできます。

OpenVINO™ セキュリティー・アドオンのライセンスサービス: OpenVINO™ セキュリティー・アドオン・ライセンス・サービスを使用して、ユーザー・パラメーターを検証します。
  • 独立系ソフトウェア・ベンダーは、OpenVINO™ セキュリティー・アドオン・ライセンス・サービスをホストしており、ユーザーがアクセス制御されたモデルをモデルサーバーにロードしようとすると、ライセンス検証要求に応答します。ライセンスは OpenVINO™ セキュリティー・アドオン・ライセンス・サービスに登録されます。

  • ユーザーがモデルをロードすると、OpenVINO™ セキュリティー・アドオン・ランタイムはライセンスサービスに接続して、ライセンスが有効であり、モデル開発者が OpenVINO™ セキュリティー・アドオン・ツール (ovsatool) で定義したパラメーターの範囲内にあることを確認します。ユーザーは、インターネット経由で独立系ソフトウェア・ベンダーのライセンスサービスにアクセスできる必要があります。

OpenVINO™ セキュリティー・アドオン・ランタイム: ユーザーは、OpenVINO™ セキュリティー・アドオン・ランタイムを仮想マシンにインストールして使用します。
  • ユーザーは、仮想マシンで OpenVINO™ セキュリティー・アドオン・ランタイムのコンポーネントをホストします。

  • ユーザーは、OpenVINO™ セキュリティー・アドオンの外部から、アクセス制御されたモデルを OpenVINO™ モデルサーバー構成ファイルに追加します。OpenVINO™ モデルサーバーはモデルをメモリーにロードしようとします。現時点では、OpenVINO™ セキュリティー・アドオン・ランタイムのコンポーネントは、アクセス制御モデルのユーザーライセンスを、独立系ソフトウェア・ベンダーが提供するライセンスサービスに保存されている情報と照合して検証します。

  • ライセンスが正常に検証されると、OpenVINO™ モデルサーバーはモデルをロードし、推論要求を処理します。

OpenVINO™ セキュリティー・アドオンがモデルの開発とデプロイに使用する場所

../../_images/ovsa_diagram.svg

このドキュメントでは、SWTPM (ゲスト VM で使用される vTPM) と HW TPM (ホスト上の TPM) の間のバインディングについて説明します。

インストールについて#

モデル開発者、独立系ソフトウェア・ベンダー、およびユーザーは、それぞれ物理ハードウェア・マシンとカーネルベースの仮想マシン (KVM) を準備する必要があります。さらに、その役割ごとにゲスト仮想マシン (ゲスト VM) を準備します。

例:

  • 1 人がモデル開発者と独立系ソフトウェア・ベンダーの両方を務める場合、2 つのゲスト VM を準備しなければなりません。両方のゲスト VM は、同じ物理ハードウェア (ホストマシン) 上に存在し、そのホストマシン上の同じ KVM の下に存在できます。

  • 同様に 1 人が 3 つの役割すべてを担当する場合、3 つのゲスト VM を準備する必要があります。3 つのゲスト VM はすべて、同じホストマシン上に存在し、そのホストマシン上の同じ KVM の下に存在できます。

各マシンの目的

マシン

目的

ホストマシン カーネルベースの仮想マシン (KVM) ゲスト VM

KVM とゲスト VM 共有がセットアップされる物理ハードウェア。OpenVINO™ セキュリティー・アドオンは、セキュリティーが重要な操作に対して分離された環境を提供するため、この仮想マシンで実行されます。モデル開発者はゲスト VM を使用して、完成したモデルのアクセス制御を有効にします。独立系ソフトウェア・プロバイダーは、ゲスト VM を使用してライセンスサービスをホストします。ユーザーはゲスト VM を使用してライセンスサービスに接続し、アクセス制御モデルを実行します。

必要条件#

ハードウェア

  • インテル® Core™ またはインテル® Xeon® プロセッサー

オペレーティング・システム、ファームウェア、およびソフトウェア

  • ホストマシンの Ubuntu* Linux* 18.04。

  • TPM バージョン 2.0 準拠の Discrete Trusted Platform Module (dTPM) または Firmware Trusted Platform Module (fTPM) が必要です。

  • セキュアブートを有効にします。

その他

  • 独立系ソフトウェア・ベンダーは、デプロイ用の楕円曲線暗号 (ECC) 証明書をサポートするオンライン証明書ステータスプロトコル (OCSP) を実装する認証局 (CA) にアクセスできる必要があります。

  • このドキュメントの例では、自己署名証明書を使用します。

ホストマシンを準備する#

このセクションは、モデル開発者と独立系ソフトウェア・ベンダーを組み合わせた役割と、個別ユーザーの役割を対象としています。

ステップ 1: ホストマシン上でパッケージをセットアップ#

このステップは、前提条件を満たすインテル® Core™ またはインテル® Xeon® プロセッサー・マシンで開始してください。

ステップ 1 ~ 11 を手動で実行する代わりに、OpenVINO™ セキュリティー・アドオン・リポジトリーの Scripts/reference ディレクトリーにあるスクリプト install_host_deps.sh を実行できます。問題を検出すると、スクリプトはエラーメッセージを表示して停止します。エラーによりスクリプトが停止した場合、エラーの原因となった問題を修正し、スクリプトを再起動てください。スクリプトは数分間実行され、進行状況に関する情報が報告されます。

  1. トラステッド・プラットフォーム・モジュール (TPM) サポートのテスト:

    dmesg | grep -i TPM

    出力には、カーネル・ブート・ログ内の TPM の可用性が示されます。TPM サポートが利用可能であることを示すために、次のデバイスを検索します:

    • /dev/tpm0

    • /dev/tpmrm0

    この情報が表示されない場合、システムは OpenVINO™ セキュリティー・アドオンを使用する前提条件が満たされていません。

  2. BIOS でハードウェアの仮想化サポートが有効になっていることを確認します:

    $ kvm-ok

    出力には次のように表示されます: INFO: /dev/kvm exists KVM acceleration can be used

    表示が異なる場合は、BIOS 設定を変更してハードウェア仮想化を有効にしてください。

    kvm-ok コマンドが見つからない場合は、インストールします:

    sudo apt install -y cpu-checker
  3. カーネルベースの仮想マシン (KVM) および QEMU パッケージをインストールしてください。

    sudo apt install qemu qemu-kvm libvirt-bin bridge-utils virt-manager
  4. QEMU のバージョンを確認します:

    qemu-system-x86_64 --version

    2.12.0 より前の QEMU バージョンを示している場合は、QEMU ウェブサイトから最新の QEMU バージョンをダウンロードおよびコンパイルしてインストールします。

  5. libtpm パッケージのビルドとインストール。

  6. swtpm パッケージのビルドとインストール。

  7. swtpm パッケージを $PATH 環境変数に追加します。

  8. ソフトウェア・ツール tpm2-tss をインストールします。インストール情報については、こちらを参照してください。

  9. ソフトウェア・ツール tpm2-abmrd をインストールします。インストール情報については、こちらを参照してください。

  10. tpm2-tools をインストールします。インストール情報については、こちらを参照してください。

  11. Docker パッケージ をインストールします。

    install_host_deps.sh スクリプトの使用にかかわりなく、ステップ 12 を完了して、ホストマシン上でのパッケージのセットアップを完了します。

  12. プロキシーの背後で実行している場合は、Docker のプロキシーを設定します。

以下のものがインストールされ、使用可能です:
* カーネルベースの仮想マシン (KVM)
* QEMU
* SW-TPM
* HW-TPM サポート
* Docker

ネットワーク用にホストマシンを構成する準備ができました。

ステップ 2: ホストマシン上でネットワークをセットアップ#

このステップは、モデル開発者と独立系ソフトウェア・ベンダーの役割を組み合わせたものです。モデルユーザー VM が別の物理ホストで実行される場合、そのホストに対しても次のステップを繰り返します。

このステップでは、2 つのネットワーク・ブリッジを準備します:

  • KVM がインターネット経由でアクセスできるグローバル IP アドレス。これは、ユーザーのマシン上の OpenVINO™ セキュリティー・アドオン・ランタイム・ソフトウェアが有効なライセンスを持っていることを確認するのに使用するアドレスです。

  • ゲスト VM と QEMU ホスト・オペレーティング・システム間の通信を提供するホスト専用ローカルアドレス。

このステップの例では、次の名前を使用します。実際の構成では別の名前が使用される場合があります:

  • 50-cloud-init.yaml 設定ファイル名の例として。

  • eno1 ネットワーク・インターフェイス名の例として。

  • br0 ブリッジ名の例として。

  • virbr0 ブリッジ名の例として。

  1. ネットワーク構成ファイルを開いて編集します。このファイルは /etc/netplan に次のような名前であります: 50-cloud-init.yaml

  2. ファイル内で次の行を探します:

    network: 
      ethernets: 
        eno1: 
          dhcp4: true 
          dhcp-identifier: mac 
      version: 2
  3. 既存の回線を変更し、br0 ネットワーク・ブリッジを追加します。この変更により、外部ネットワークへのアクセスが可能になります:

    network: 
      ethernets: 
        eno1: dhcp4: false 
      bridges: 
        br0: 
          interfaces: [Eno1]eno1] 
          dhcp4: yes 
            dhcp-identifier: mac 
      version: 2
  4. ネットワーク構成ファイルを保存して閉じます。

  5. 2 つのコマンドを実行して、更新されたネットワーク構成ファイルをアクティブ化します。SSH を使用している場合、これらのコマンドを実行するとネットワーク接続が失われる可能性があります。その場合、ネットワークに再接続します。

    sudo netplan generate
    sudo netplan apply
     
    ブリッジが作成され、新しいブリッジに IP アドレスが割り当てられます。
  6. 新しいブリッジを確認します:

    ip a | grep br0

    出力は次のようになり、有効な IP アドレスが表示されます:

    4: br0:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000inet 123.123.123.123/<mask> brd 321.321.321.321 scope global dynamic br0
  7. br0-qemu-ifup という名前のスクリプトを作成して、br0 インターフェイスを起動します。スクリプトに次の内容を追加します:

    #!/bin/sh 
    nic=$1 
    if [ -f /etc/default/qemu-kvm ]; then 
      ./etc/default/qemu-kvm 
    fi 
    switch=br0 
    ifconfig $nic 0.0.0.0 up 
    brctl addif ${switch} $nic
  8. br0-qemu-ifdown という名前のスクリプトを作成して、br0 インターフェイスを停止します。スクリプトに次の内容を追加します:

    #!/bin/sh 
    nic=$1 
    if [ -f /etc/default/qemu-kvm ]; then 
      ./etc/default/qemu-kvm 
    fi 
    switch=br0 
    brctl delif $switch $nic 
    ifconfig $nic 0.0.0.0 down
  9. virbr0-qemu-ifup という名前のスクリプトを作成して、virbr0 インターフェイスを起動します。スクリプトに次の内容を追加します:

    #!/bin/sh 
    nic=$1 
    if [ -f /etc/default/qemu-kvm ]; then 
      ./etc/default/qemu-kvm 
    fi 
    switch=virbr0 
    ifconfig $nic 0.0.0.0 up 
    brctl addif ${switch} $nic
  10. virbr0-qemu-ifdown という名前のスクリプトを作成して、virbr0 インターフェイスを停止します。スクリプトに次の内容を追加します:

    #!/bin/sh 
    nic=$1 
    if [ -f /etc/default/qemu-kvm ]; then 
      ./etc/default/qemu-kvm 
    fi 
    switch=virbr0 
    brctl delif $switch $nic 
    ifconfig $nic 0.0.0.0 down

QEMU ネットワーク構成の詳細については、QEMU のドキュメントを参照してください。

ネットワークはホストマシン上に設定されます。ステップ 3 に進み、モデル開発者と独立系ソフトウェア・ベンダーの役割を組み合わせたゲスト VM を準備します。

ステップ 3: OpenVINO™ セキュリティー・アドオンをクローン#

OpenVINO™ セキュリティー・アドオンをダウンロードします。

ステップ 4: モデル開発者と独立系ソフトウェア・ベンダーのロールを組み合わせて 1 つのゲスト VM をセットアップ#

役割ごとに、ゲスト VM 仮想マシンを準備する必要があります。このリリースでは、モデル開発者ロールと独立系ソフトウェア・ベンダーの役割が組み合わされているため、これらのステップでは、ovsa_isv という 1 つのゲスト VM をセットアップするように指示されています。

ホストマシンでこれらのステップを開始します。

オプションとして、virsh と仮想マシン・マネージャーを使用してゲスト VM を作成および起動できます。この手順の詳細は、libvirtd のドキュメントを参照してください。

  1. Ubuntu 18.0464 ビット PC (AMD64) コンピューター用サーバー のインストール ISO イメージをダウンロードします。

  2. モデル開発者および独立系ソフトウェア・ベンダーの役割を持つゲスト VM として機能する空の仮想ディスクイメージを作成します:

    sudo qemu-img create -f qcow2 <path>/ovsa_isv_dev_vm_disk.qcow2 20G
  3. ゲスト VM に Ubuntu 18.04 をインストールします。ゲスト VM に ovsa_isv という名前を付けます:

    sudo qemu-system-x86_64 -m 8192 -enable-kvm \ 
    -cpu host \ 
    -drive if=virtio,file=<path-to-disk-image>/ovsa_isv_dev_vm_disk.qcow2,cache=none \ 
    -cdrom <path-to-iso-image>/ubuntu-18.04.5-live-server-amd64.iso \ 
    -device e1000,netdev=hostnet1,mac=52:54:00:d1:66:5f \ 
    -netdev tap,id=hostnet1,script=<path-to-scripts>/virbr0-qemu-ifup,downscript=<path-to-scripts>/virbr0-qemu-ifdown \ 
    -vnc :1
  4. VNC クライアントを <host-ip-address>:1 で接続します

  5. 画面の指示に従って、ゲスト VM のインストールを完了します。VM に次の名前を付けます: ovsa_isv_dev

  6. ゲスト VM をシャットダウンします。

  7. cdrom イメージのオプションを削除した後、ゲスト VM を再起動します:

    sudo qemu-system-x86_64 -m 8192 -enable-kvm \ 
    -cpu host \ 
    -drive if=virtio,file=<path-to-disk-image>/ovsa_isv_dev_vm_disk.qcow2,cache=none \ 
    -device e1000,netdev=hostnet1,mac=52:54:00:d1:66:5f \ 
    -netdev tap,id=hostnet1,script=<path-to-scripts>/virbr0-qemu-ifup,downscript=<path-to-scripts>/virbr0-qemu-ifdown \ 
    -vnc :1
  8. 必要な追加のソフトウェアをインストールするには、次のオプションのいずれかを選択します:

    • オプション 1: スクリプトを使用して追加のソフトウェアをインストール
      1. スクリプト install_guest_deps.sh を OVSA リポジトリーの Scripts/reference directory ディレクトリーからゲスト VM にコピーします。

      2. スクリプトを実行します。

      3. ゲスト VM をシャットダウンします。

    • オプション 2追加のソフトウェアを手動でインストール

      1. ソフトウェア・ツール tpm2-tss をインストールします。インストール情報については、こちらを参照してください。
      2. ソフトウェア・ツール tpm2-abmrd をインストールします。インストール情報については、こちらを参照してください。
      3. tpm2-tools をインストールします。インストール情報については、こちらを参照してください。
      4. Docker パッケージ をインストールします。
      5. ゲスト VM をシャットダウンします。

  9. ホスト上で、仮想 TPM デバイスをサポートするディレクトリーを作成し、その証明書を提供します。root のみがこのディレクトリーに対する読み取り/書き込み権限を持つ必要があります:

    
    sudo mkdir -p /var/OVSA/ 
    sudo mkdir /var/OVSA/vtpm 
    sudo mkdir /var/OVSA/vtpm/vtpm_isv_dev 
    
    export XDG_CONFIG_HOME=~/.config 
    /usr/share/swtpm/swtpm-create-user-config-files 
    swtpm_setup --tpmstate /var/OVSA/vtpm/vtpm_isv_dev --create-ek-cert --create-platform-cert --overwrite --tpm2 --pcr-banks - 
    .. note::
    手順 10 と 11 では、コマンドを手動で実行する代わりに、OpenVINO™ セキュリティー・アドオン・リポジトリーの ``Scripts/reference`` ディレクトリーにある ``start_ovsa_isv_dev_vm.sh`` スクリプトをコピーして編集できます。スクリプトを使用する場合は、モデル開発者であるか、独立系ソフトウェア・ベンダーであるかに関係なく、ファイル名に ``isv`` が含まれるスクリプトを選択します。スクリプトを編集して、正しいディレクトリーの場所を指定し、各ゲスト VM の ``vnc`` を増やします。
  10. ホスト上で vTPM を開始し、HW TPM データを NVRAM に書き込み、QEMU の vTPM を再起動します:

     sudo swtpm socket --tpm2 --server port=8280 \ 
                      --ctrl type=tcp,port=8281 \ 
                      --flags not-need-init --tpmstate dir=/var/OVSA/vtpm/vtpm_isv_dev & 
    
    sudo tpm2_startup --clear -T swtpm:port=8280 
    sudo tpm2_startup -T swtpm:port=8280 
    python3 <path to Security-Addon source>/Scripts/host/OVSA_write_hwquote_swtpm_nvram.py 8280 
    sudo pkill -f vtpm_isv_dev 
    
    swtpm socket --tpmstate dir=/var/OVSA/vtpm/vtpm_isv_dev \ 
      --tpm2 \ 
      --ctrl type=unixio,path=/var/OVSA/vtpm/vtpm_isv_dev/swtpm-sock \ 
      --log level=20
  11. ゲスト VM を起動します:

    sudo qemu-system-x86_64 \ 
     -cpu host \ 
     -enable-kvm \ 
     -m 8192 \ 
     -smp 8,sockets=1,cores=8,threads=1 \ 
     -device e1000,netdev=hostnet0,mac=52:54:00:d1:66:6f \ 
     -netdev tap,id=hostnet0,script=<path-to-scripts>/br0-qemu-ifup,downscript=<path-to-scripts>/br0-qemu-ifdown \ 
     -device e1000,netdev=hostnet1,mac=52:54:00:d1:66:5f \ 
     -netdev tap,id=hostnet1,script=<path-to-scripts>/virbr0-qemu-ifup,downscript=<path-to-scripts>/virbr0-qemu-ifdown \ 
     -drive if=virtio,file=<path-to-disk-image>/ovsa_isv_dev_vm_disk.qcow2,cache=none \ 
     -chardev socket,id=chrtpm,path=/var/OVSA/vtpm/vtpm_isv_dev/swtpm-sock \ 
     -tpmdev emulator,id=tpm0,chardev=chrtpm \ 
     -device tpm-tis,tpmdev=tpm0 \ 
     -vnc :1

    コマンドで QEMU ランタイムオプションを使用して、このゲスト VM に割り当てられたメモリー量または CPU を変更します。

  12. VNC クライアントを使用して、次のゲスト VM にログオンします: <host-ip-address>:1

ステップ 5: ユーザーロール用に 1 つのゲスト VM をセットアップ#

  1. ユーザーの役割を持つゲスト VM を作成するには、次のオプションのいずれかを選択します:

    オプション 1: ovsa_isv_dev_vm_disk.qcow2 ディスクイメージをコピーして名前を変更します

    1. ovsa_isv_dev_vm_disk.qcow2 ディスクイメージを ovsa_runtime_vm_disk.qcow2 という名前の新しいイメージにコピーします。ステップ 4ovsa_isv_dev_vm_disk.qcow2 ディスクイメージを作成しました。

    2. 新しいイメージをブートします。

    3. ホスト名を ovsa_isv_dev から ovsa_runtime に変更します。

    sudo hostnamectl set-hostname ovsa_runtime
    1. 新しいイメージの ovsa_isv_dev のすべてのインスタンスを ovsa_runtime に置き換えます。

    sudo nano /etc/hosts
    1. /etc/machine-id を変更します:

    sudo rm /etc/machine-id systemd-machine-id-setup
    1. ゲスト VM をシャットダウンします。

    オプション 2: ゲスト VM を手動で作成します

    1. 空の仮想ディスクイメージを作成します:

    sudo qemu-img create -f qcow2 <path>/ovsa_ovsa_runtime_vm_disk.qcow2 20G
    1. ゲスト VM に Ubuntu 18.04 をインストールします。ゲスト VM に ovsa_runtime という名前を付けます:

    sudo qemu-system-x86_64 -m 8192 -enable-kvm \ 
    -cpu host \ 
    -drive if=virtio,file=<path-to-disk-image>/ovsa_ovsa_runtime_vm_disk.qcow2,cache=none \ 
    -cdrom <path-to-iso-image>/ubuntu-18.04.5-live-server-amd64.iso \ 
    -device e1000,netdev=hostnet1,mac=52:54:00:d1:66:5f \ 
    -netdev tap,id=hostnet1,script=<path-to-scripts>/virbr0-qemu-ifup, downscript=<path-to-scripts>/virbr0-qemu-ifdown \ 
    -vnc :2
    1. VNC クライアントを <host-ip-address>:2 で接続します。

    2. 画面の指示に従って、ゲスト VM のインストールを完了します。ゲスト VM に ovsa_runtime という名前を付けます。

    3. ゲスト VM をシャットダウンします。

    4. ゲスト VM を再起動します:

    sudo qemu-system-x86_64 -m 8192 -enable-kvm \ 
    -cpu host \ 
    -drive if=virtio,file=<path-to-disk-image>/ovsa_ovsa_runtime_vm_disk.qcow2,cache=none \ 
    -device e1000,netdev=hostnet1,mac=52:54:00:d1:66:5f \ 
    -netdev tap,id=hostnet1,script=<path-to-scripts>/virbr0-qemu-ifup, downscript=<path-to-scripts>/virbr0-qemu-ifdown \ 
    -vnc :2
    1. 必要な追加のソフトウェアをインストールするには、次のオプションのいずれかを選択します:

      オプション 1: スクリプトを使用して追加のソフトウェアをインストール
      1. スクリプト install_guest_deps.sh を OVSA リポジトリーの Scripts/reference ディレクトリーからゲスト VM にコピーします。
      2. スクリプトを実行します。
      3. ゲスト VM をシャットダウンします。

      オプション 2: 追加のソフトウェアを手動でインストール
      1. ソフトウェア・ツール tpm2-tss をインストールします。インストール情報については、ここを参照してください。
      2. tpm2-abmrd ソフトウェア・ツールインストールします。インストール情報については、ここを参照してください。
      3. tpm2-tools をインストールします。インストール情報については、こちらを参照してください。
      4. Docker パッケージ をインストールします。
      5. ゲスト VM をシャットダウンします。

  2. 仮想 TPM デバイスをサポートするディレクトリーを作成し、その証明書を提供します。root のみがこのディレクトリーに対する読み取り/書き込み権限を持つ必要があります:

     sudo mkdir /var/OVSA/vtpm/vtpm_runtime 
    
    export XDG_CONFIG_HOME=~/.config /usr/share/swtpm/swtpm-create-user-config-files 
    swtpm_setup --tpmstate /var/OVSA/vtpm/vtpm_runtime --create-ek-cert --create-platform-cert --overwrite --tpm2 --pcr-banks - 
    
    .. note:: 
    手順 3 と 4 では、コマンドを手動で実行する代わりに、OpenVINO™ セキュリティー・アドオン・リポジトリーの ``Scripts/reference`` ディレクトリーにある ``start_ovsa_runtime_vm.sh`` スクリプトをコピーして編集できます。スクリプトを編集して、正しいディレクトリーの場所を指定し、各ゲスト VM の ``vnc`` を増やします。つまり、同じホストマシン上に 3 番目のゲスト VM を作成する場合は、``-vnc :2````-vnc :3`` に変更します。
  3. vTPM を開始し、HW TPM データを NVRAM に書き込み、QEMU の vTPM を再起動します:

    sudo swtpm socket --tpm2 --server port=8380 \ 
                      --ctrl type=tcp,port=8381 \ 
                      --flags not-need-init --tpmstate dir=/var/OVSA/vtpm/vtpm_runtime & 
    
    sudo tpm2_startup --clear -T swtpm:port=8380 
    sudo tpm2_startup -T swtpm:port=8380 
    python3 <path to Security-Addon source>/Scripts/host/OVSA_write_hwquote_swtpm_nvram.py 8380 
    sudo pkill -f vtpm_runtime 
    
    swtpm socket --tpmstate dir=/var/OVSA/vtpm/vtpm_runtime \ 
    --tpm2 \ 
    --ctrl type=unixio,path=/var/OVSA/vtpm/vtpm_runtime/swtpm-sock \ 
    --log level=20
  4. 新しいターミナルでゲスト VM を起動します:

    sudo qemu-system-x86_64 \ 
     -cpu host \ 
     -enable-kvm \ -m 8192 \ 
     -smp 8,sockets=1,cores=8,threads=1 \ 
     -device e1000,netdev=hostnet2,mac=52:54:00:d1:67:6f \ 
     -netdev tap,id=hostnet2,script=<path-to-scripts>/br0-qemu-ifup,downscript=<path-to-scripts>/br0-qemu-ifdown \ 
     -device e1000,netdev=hostnet3,mac=52:54:00:d1:67:5f \ 
     -netdev tap,id=hostnet3,script=<path-to-scripts>/virbr0-qemu-ifup,downscript=<path-to-scripts>/virbr0-qemu-ifdown \ 
     -drive if=virtio,file=<path-to-disk-image>/ovsa_runtime_vm_disk.qcow2,cache=none \ 
     -chardev socket,id=chrtpm,path=/var/OVSA/vtpm/vtpm_runtime/swtpm-sock \ 
     -tpmdev emulator,id=tpm0,chardev=chrtpm \ 
     -device tpm-tis,tpmdev=tpm0 \ 
     -vnc :2

    コマンドで QEMU ランタイムオプションを使用して、このゲスト VM に割り当てられたメモリー量または CPU を変更します。

  5. VNC クライアントを使用して、<host-ip-address>:<x> のゲスト VM にログオンします。ここで、<x>start_ovsa_isv_vm.sh またはステップ 8 の vnc 番号に対応します。

OpenVINO™ セキュリティー・アドオンのソフトウェアを構築してインストールする方法#

以下の手順に従って、OpenVINO™ セキュリティー・アドオンをホストおよび別の VM でビルドしてインストールします。

ステップ 1: OpenVINO™ モデルサーバーのイメージをビルド#

OpenVINO™ セキュリティー・アドオンのビルドは、OpenVINO™ モデルサーバーの Docker コンテナに依存します。まず、ホスト上で OpenVINO™ モデルサーバーをダウンロードしてビルドします。

  1. OpenVINO™ モデルサーバー・ソフトウェアをダウンロード

  2. OpenVINO™ モデルサーバーのイメージをビルド

    git clone https://github.com/openvinotoolkit/model_server.git 
    cd model_server 
    make docker_build

ステップ 2: すべてのロールに必要なソフトウェアをビルド#

このステップは、モデル開発者と独立系ソフトウェア・ベンダー、およびユーザーの役割を組み合わせたものです

  1. 前に複製したトップレベルの OpenVINO™ セキュリティー・アドオンのソース・ディレクトリーに移動します。

    cd security_addon
  2. OpenVINO™ セキュリティー・アドオンをビルド:

    make clean all 
    sudo -s make package 
    ``` 
    
    次のパッケージが ``release_files`` ディレクトリーの下に作成されます: 
    - ``ovsa-kvm-host.tar.gz``: ホストマシンファイル - ``ovsa-developer.tar.gz``: モデル開発者と独立系ソフトウェア開発者向け - ``ovsa-model-hosting.tar.gz``: ユーザー向け

ステップ 3: ホスト・ソフトウェアのインストール#

このステップは、モデル開発者、独立系ソフトウェア・ベンダー、およびユーザーの役割を合わせたものです。

  1. release_files ディレクトリーに移動します:

    cd release_files
  2. パスをセットアップ:

    export OVSA_RELEASE_PATH=$PWD
  3. OpenVINO™ セキュリティー・アドオン・ソフトウェアをホストマシンにインストールします:

    cd $OVSA_RELEASE_PATH 
    tar xvfz ovsa-kvm-host.tar.gz 
    cd ovsa-kvm-host 
    ./install.sh

複数のホストマシンを使用している場合、それぞれのホストマシンでステップ 3 を繰り返します。

ステップ 4: OpenVINO™ セキュリティー・アドオンのモデル開発者/ISV コンポーネントのインストール#

このステップは、モデル開発者と独立系ソフトウェア・ベンダーの役割を組み合わせたものです。ゲスト VM への参照は ovsa_isv_dev です。

  1. <user> としてゲスト VM にログオンします。

  2. ホーム・ディレクトリーに OpenVINO™ セキュリティー・アドオン・ディレクトリーを作成します

    mkdir -p ~/OVSA
  3. ゲスト VM の外部のホストマシンに移動します

  4. ovsa-developer.tar.gzrelease_files からゲスト VM にコピーします:

    cd $OVSA_RELEASE_PATH 
    scp ovsa-developer.tar.gz username@<isv-developer-vm-ip-address>:/<username-home-directory>/OVSA
  5. ゲスト VM に移動します:

  6. ovsa ユーザーを作成します

    sudo useradd -m ovsa 
    sudo passwd ovsa
  7. ソフトウェアをゲスト VM にインストールします:

    cd ~/OVSA 
    tar xvfz ovsa-developer.tar.gz 
    cd ovsa-developer 
    sudo ./install.sh
  8. 別のターミナルで ovsa ユーザーとしてライセンスサーバーを起動します。

    source /opt/ovsa/scripts/setupvars.sh 
    cd /opt/ovsa/bin 
    ./license_server

    ファイアウォールの内側にいる場合は、プロキシー構成を確認して設定し、ライセンスサーバーが証明書を検証できることを確認してください。

ステップ 5: OpenVINO™ セキュリティー・アドオンのモデルをホスティングするコンポーネントのインストール#

このステップはユーザー向けです。ゲスト VM への参照は ovsa_runtime です。

モデル・ホスティング・コンポーネントは、OpenVINO™ モデルサーバーの NGINX Docker をベースとした OpenVINO™ セキュリティー・アドオン・ランタイム Docker コンテナをインストールし、アクセス制御されたモデルをホストします。

  1. <user> としてゲスト VM にログオンします。

  2. ホーム・ディレクトリーに OpenVINO™ セキュリティー・アドオン・ディレクトリーを作成します

    mkdir -p ~/OVSA
  3. ホストマシン上で、ovsa-model-hosting.tar.gz を release_files からゲスト VM にコピーします:

    cd $OVSA_RELEASE_PATH 
    scp ovsa-model-hosting.tar.gz username@<runtime-vm-ip-address>:/<username-home-directory>/OVSA
  4. ゲスト VM に移動します:

  5. ovsa ユーザーを作成します

    sudo useradd -m ovsa 
    sudo passwd ovsa 
    sudo usermod -aG docker ovsa
  6. ソフトウェアをゲスト VM にインストールします:

    cd ~/OVSA 
    tar xvfz ovsa-model-hosting.tar.gz 
    cd ovsa-model-hosting 
    sudo ./install.sh

OpenVINO™ セキュリティー・アドオンの使用方法#

このセクションでは、モデル開発者/独立系ソフトウェア・ベンダーとユーザー間の対話が必要です。すべての役割は、このセクションを開始する前に、該当するすべてのセットアップ手順インストール手順を完了する必要があります。

このドキュメントでは、例として face-detection-retail-0004 モデルを使用します。

次の図は、モデル開発者、独立系ソフトウェア・ベンダー、およびユーザーの間との対話を示しています。

ヒント

モデル開発者/独立系ソフトウェア・ベンダーとユーザーの役割は仮想マシンに関連しており、1 人が役割に必要な複数のタスクを実行する場合があります。このドキュメントでは、モデル開発者と独立系ソフトウェア・ベンダーのタスクが結合され、ovsa_isv というゲスト VM が使用されます。すべての役割を同じホストマシン上にセットアップすることもできます。

../../_images/ovsa_example.svg

モデル開発者向け手順#

モデル開発者はモデルを作成し、アクセス制御を定義し、ユーザーライセンスを作成します。モデルが作成され、アクセス制御が有効になり、ライセンスの準備が完了したら、モデル開発者はモデルユーザーと共有する前にライセンスの詳細を独立系ソフトウェア・ベンダーに提供します。

ゲスト VM への参照は ovsa_isv_dev です。ゲスト VM に ovsa ユーザーとしてログオンします。

ステップ 1: 成果物のディレクトリーをセットアップ#

artifacts という名前のディレクトリーを作成します。このディレクトリーには、ライセンスの作成に必要なアーティファクトが保存されます:

mkdir -p ~/OVSA/artefacts 
cd ~/OVSA/artefacts 
export OVSA_DEV_ARTEFACTS=$PWD 
source /opt/ovsa/scripts/setupvars.sh

ステップ 2: キーストアを作成し証明書を追加#

  1. 証明書を要求するためのファイルを作成します:

    この例では、デモ用途で自己署名証明書を使用します。運用環境では、CSR ファイルを使用して CA 署名付き証明書を要求します。

    cd $OVSA_DEV_ARTEFACTS 
    /opt/ovsa/bin/ovsatool keygen -storekey -t ECDSA -n Intel -k isv_keystore -r isv_keystore.csr -e "/C=IN/CN=localhost"

    キー・ストア・ファイルとともに以下の 2 つのファイルが作成されます:
    - isv_keystore.csr 証明書署名要求 (CSR)
    - isv_keystore.csr.crt 自己署名証明書

    運用環境では、isv_keystore.csr を CA に送信して、CA 署名付き証明書を要求します。

  1. 証明書をキーストアに追加します

    /opt/ovsa/bin/ovsatool keygen -storecert -c isv_keystore.csr.crt -k isv_keystore

ステップ 3: モデルを作成#

この例では、curl を使用して、OpenVINO Open Model Zoo から face-detection-retail-004 モデルをダウンロードします。ファイアウォールの内側にいる場合は、プロキシー構成を確認して設定してください。

Open Model Zoo からモデルをダウンロード:

curl --create-dirs https://download.01.org/opencv/2021/openvinotoolkit/2021.1/open_../legacy-features/model-zoo/models_bin/1/face-detection-retail-0004/FP32/face-detection-retail-0004.xml https://download.01.org/opencv/2021/openvinotoolkit/2021.1/open_../legacy-features/model-zoo/models_bin/1/face-detection-retail-0004/FP32/face-detection-retail-0004.bin -o model/face-detection-retail-0004.xml -o model/face-detection-retail-0004.bin

モデルは OVSA_DEV_ARTEFACTS/model ディレクトリーにダウンロードされます

ステップ 4: モデルのアクセス制御を定義し、マスターライセンスを作成#

モデルのアクセス制御とマスターライセンスを定義して有効にします:

uuid=$(uuidgen) 
/opt/ovsa/bin/ovsatool controlAccess -i model/face-detection-retail-0004.xml model/face-detection-retail-0004.bin -n "face detection" -d "face detection retail" -v 0004 -p face_detection_model.dat -m face_detection_model.masterlic -k isv_keystore -g $uuid

face-detection-retail-0004 モデルの中間表現ファイルは face_detection_model.dat として暗号化され、マスターライセンスは次のように生成されます。

ステップ 5: ランタイム参照 TCB の作成#

ランタイム参照 TCB を使用して、アクセス制御モデルと特定のランタイムの顧客ライセンスを作成します。

ランタイムの参照 TCB を生成します

/opt/ovsa/bin/ovsaruntime gen-tcb-signature -n "Face Detect @ Runtime VM" -v "1.0" -f face_detect_runtime_vm.tcb -k isv_keystore

ステップ 6: アクセス制御されたモデルおよびランタイム参照 TCB を公開#

アクセス制御モデルはユーザーと共有する準備ができており、参照 TCB はライセンスチェックを実行する準備ができています。

ステップ 7: ユーザーリクエストを受信#

  1. アクセス制御されたモデルにアクセスするユーザーからアーティファクトを取得します:

    • 顧客のキーストアからの顧客証明書。

    • ユーザーがモデルにアクセスする期間など、ライセンスの運用に適用されるその他の情報

  2. カスタマーライセンス構成を作成します。

     cd $OVSA_DEV_ARTEFACTS 
    /opt/ovsa/bin/ovsatool licgen -t TimeLimit -l30 -n "Time Limit License Config" -v 1.0 -u "<isv-developer-vm-ip-address>:<license_server-port>" /opt/ovsa/certs/server.crt -k isv_keystore -o 30daylicense.config 
    
    .. note:: 
    パラメーター /opt/ovsa/certs/server.crt には、ライセンスサーバーが使用する証明書が含まれています。サーバー証明書は顧客ライセンスに追加され、使用中に検証されます。`OpenVINO™ セキュリティー・アドオン・ライセンスサーバー証明書のピニング <https://github.com/openvinotoolkit/security_addon/blob/master/docs/ovsa_license_server_cert_pinning.md>` を参照してください
  3. カスタマーライセンスを作成します。

    cd $OVSA_DEV_ARTEFACTS 
    /opt/ovsa/bin/ovsatool sale -m face_detection_model.masterlic -k isv_keystore -l 30daylicense.config -t face_detect_runtime_vm.tcb -p custkeystore.csr.crt -c face_detection_model.lic
  4. ライセンスを使用してライセンスサーバーのデータベースを更新します。

    cd /opt/ovsa/DB 
    python3 ovsa_store_customer_lic_cert_db.py ovsa.db $OVSA_DEV_ARTEFACTS/face_detection_model.lic $OVSA_DEV_ARTEFACTS/custkeystore.csr.crt
  5. 次のファイルをユーザーに提供します:

    • face_detection_model.dat

    • face_detection_model.lic

モデルユーザーの手順#

ゲスト VM への参照は ovsa_rumtime です。ゲスト VM に ovsa ユーザーとしてログオンします。

ステップ 1: 成果物のディレクトリーのセットアップ#

  1. artifacts という名前のディレクトリーを作成します。このディレクトリーには、ライセンスの作成に必要なアーティファクトが保存されます:

    mkdir -p ~/OVSA/artefacts 
    cd ~/OVSA/artefacts 
    export OVSA_RUNTIME_ARTEFACTS=$PWD 
    source /opt/ovsa/scripts/setupvars.sh

ステップ 2: CA 署名付き証明書をキーストアに追加#

  1. 顧客キー・ストア・ファイルを生成します:

    cd $OVSA_RUNTIME_ARTEFACTS 
    /opt/ovsa/bin/ovsatool keygen -storekey -t ECDSA -n Intel -k custkeystore -r custkeystore.csr -e "/C=IN/CN=localhost"

    キー・ストア・ファイルとともに以下の 2 つのファイルが作成されます:
    - custkeystore.csr 証明書署名要求 (CSR)
    - custkeystore.csr.crt` 自己署名証明書

  1. custkeystore.csr を CA に送信して、CA 署名付き証明書を要求します。

  2. 証明書をキーストアに追加します:

    /opt/ovsa/bin/ovsatool keygen -storecert -c custkeystore.csr.crt -k custkeystore

ステップ 3: モデル開発者にアクセス制御されたモデルを要求#

この例では、scp を使用して、同じホストマシン上の ovsa_runtime ゲスト VM と ovsa_dev ゲスト VM 間でデータを共有します。

  1. モデルの必要性をモデル開発者に伝えます。開発者は、キーストアからの証明書とその他の情報を必要とします。この例では、必要とされるモデルが利用可能な時間を使用します。

  2. モデルユーザーの証明書を開発者に提供する必要があります:

    cd $OVSA_RUNTIME_ARTEFACTS 
    scp custkeystore.csr.crt username@<developer-vm-ip-address>:/<username-home-directory>/OVSA/artefacts

ステップ 4: アクセス制御されたモデルを受信して​​ OpenVINO™ モデルサーバーにロード#

  1. モデルを次の名前のファイルとして受け取ります:

    • face_detection_model.dat

    • face_detection_model.lic

    cd $OVSA_RUNTIME_ARTEFACTS 
    scp username@<developer-vm-ip-address>:/<username-home-directory>/OVSA/artefacts/face_detection_model.dat . 
    scp username@<developer-vm-ip-address>:/<username-home-directory>/OVSA/artefacts/face_detection_model.lic .
  2. 環境の準備:

    cd $OVSA_RUNTIME_ARTEFACTS/.. 
    cp /opt/ovsa/example_runtime ovms -r 
    cd ovms 
    mkdir -vp model/fd/1

    $OVSA_RUNTIME_ARTEFACTS/../ovms ディレクトリーには、モデルサーバーを起動するスクリプトとサンプル構成 JSON ファイルが含まれています。

  3. モデル開発者からアーティファクトをコピーします:

    cd $OVSA_RUNTIME_ARTEFACTS/../ovms 
    cp $OVSA_RUNTIME_ARTEFACTS/face_detection_model.dat model/fd/1/. 
    cp $OVSA_RUNTIME_ARTEFACTS/face_detection_model.lic model/fd/1/. 
    cp $OVSA_RUNTIME_ARTEFACTS/custkeystore model/fd/1/.
  4. モデル開発者から受け取ったアクセス制御されたモデル・アーティファクト名を含めるように、sample.json の名前を変更して編集します。ファイルは次のようになります:

    { 
    "custom_loader_config_list":[ 
       { 
          "config":{ 
             "loader_name":"ovsa", 
             "library_path": "/ovsa-runtime/lib/libovsaruntime.so" 
          } 
       } 
    ], 
    "model_config_list":[ 
       { 
          "config":{ 
             "name":"controlled-access-model", 
             "base_path":"/sampleloader/model/fd", 
             "custom_loader_options": {"loader_name": "ovsa", "keystore": "custkeystore", "controlled_access_file": "face_detection_model"} 
          } 
       } 
    ] 
    }

ステップ 5: NGINX モデルサーバーの開始#

NGINX モデルサーバーは、アクセス制御されたモデルを公開します。

./start_secure_ovsa_model_server.sh

NGINX インターフェイスの詳細については、こちらを参照してください。

ステップ 6: 推論実行の準備#

  1. 別の端末からゲスト VM にログオンします。

  2. セットアップ用の Python 依存関係をインストールします。例:

    sudo apt install pip3 
    pip3 install cmake 
    pip3 install scikit-build 
    pip3 install opencv-python 
    pip3 install futures==3.1.1 
    pip3 install tensorflow-serving-api==1.14.0
  3. face_detection.py を次の example_client からコピーします: /opt/ovsa/example_client

    cd ~/OVSA/ovms 
    cp /opt/ovsa/example_client/* .
  4. 推論用にサンプル画像をコピーします。推論用のサンプルイメージを含むイメージ・ディレクトリーが作成されます。

    curl --create-dirs https://raw.githubusercontent.com/openvinotoolkit/model_server/master/example_client/images/people/people1.jpeg -o images/people1.jpeg

ステップ 7: 推論の実行#

face_detection.py スクリプトを実行します:

python3 face_detection.py --grpc_port 3335 --batch_size 1 --width 300 --height 300 --input_images_dir images --output_dir results --tls --server_cert /var/OVSA/Modelserver/server.pem --client_cert /var/OVSA/Modelserver/client.pem --client_key /var/OVSA/Modelserver/client.key --model_name controlled-access-model

まとめ#

ここでは以下のことを行いました:

  • マシンごとに 1 つの KVM を使用して 1 つ以上のコンピューター (ホストマシン) をセットアップし、ホストマシン上に 1 つ以上の仮想マシン (ゲスト VM) をセットアップしました

  • OpenVINO™ セキュリティー・アドオンをインストールしました

  • OpenVINO™ セキュリティー・アドオンと連携するために OpenVINO™ モデルサーバーを使用しました

  • モデル開発者または独立系ソフトウェア・ベンダーとして、管理されたモデルにアクセスし、モデルのライセンスを準備しました。

  • モデル開発者または独立系ソフトウェア・ベンダーは、ライセンスサーバーを準備して実行し、ユーザーがアクセス制御モデルを使用する有効なライセンスを持っているか確認しました。

  • ユーザーとして、アクセス制御されたモデルとそのモデルのライセンスを取得するため、モデル開発者または独立系ソフトウェア・ベンダーに情報を提供しました。

  • ユーザーとして、ライセンスを取得し、制御されたモデルを実行できるホストサーバーをセットアップして起動しました。

  • ユーザーとして、アクセス制御されたモデルをロードしてモデルのライセンスを検証し、そのモデルを使用して推論を実行しました。

関連情報#

詳細は、次のリンクを参照してください: