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/netplan50-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]
           dhcp4: yes
                dhcp-identifier: mac
      version: 2
    
  4. ネットワーク構成ファイルを保存して閉じます。

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

    sudo netplan generate
    
    sudo netplan apply
    
    A bridge is created and an IP address is assigned to the new bridge.
    
  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 ディレクトリーからゲスト 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::
    
       For steps 10 and 11, you can copy and edit the script named ``start_ovsa_isv_dev_vm.sh`` in the ``Scripts/reference`` directory in the OpenVINO™ Security Add-on repository instead of manually running the commands. If using the script, select the script with ``isv`` in the file name regardless of whether you are playing the role of the Model Developer or the role of the Independent Software Vendor. Edit the script to point to the correct directory locations and increment ``vnc`` for each Guest VM.
    
  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. ステップ 4 で作成した ovsa_isv_dev_vm_disk.qcow2 ディスクイメージを ovsa_runtime_vm_disk.qcow2 という名前の新しいイメージにコピーします。

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

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

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

      sudo nano /etc/hosts
      
    5. /etc/machine-id を変更します。

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

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

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

      sudo qemu-img create -f qcow2 <path>/ovsa_ovsa_runtime_vm_disk.qcow2 20G
      
    2. ゲスト 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
      
    3. VNC クライアントを <host-ip-address>:2 で接続します。

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

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

    6. ゲスト 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
      
    7. 必要な追加のソフトウェアをインストールするには、次のオプションのいずれかを選択します。

      オプション 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::
    
       For steps 3 and 4, you can copy and edit the script named ``start_ovsa_runtime_vm.sh`` in the ``Scripts/reference`` directory in the OpenVINO™ Security Add-on repository instead of manually running the commands. Edit the script to point to the correct directory locations and increment ``vnc`` for each Guest VM. This means that if you are creating a third Guest VM on the same Host Machine, change ``-vnc :2`` to ``-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
    ```
    The following packages are created under the ``release_files`` directory:
    - ``ovsa-kvm-host.tar.gz``: Host Machine file
    - ``ovsa-developer.tar.gz``: For the Model Developer and the Independent Software Developer
    - ``ovsa-model-hosting.tar.gz``: For the User
    

ステップ 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 - 自己署名証明書
  2. 運用環境では、isv_keystore.csr を CA に送信して、CA 署名付き証明書を要求します。

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

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

ステップ 3: モデルの作成

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

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 として暗号化され、マスターライセンスは face_detection_model.masterlic に生成されます。

ステップ 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::
    
       The parameter /opt/ovsa/certs/server.crt  contains the certificate used by the License Server. The server certificate will be added to the customer license and validated during use. Refer to `OpenVINO™ Security Add-on License Server Certificate Pinning <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/opt/ovsa/example_client の 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™ モデルサーバーを使用しました。
  • モデル開発者または独立系ソフトウェア・ベンダーとして、管理されたモデルにアクセスし、モデルのライセンスを準備しました。
  • モデル開発者または独立系ソフトウェア・ベンダーは、ライセンスサーバーを準備して実行し、ユーザーがアクセス制御モデルを使用する有効なライセンスを持っているか確認しました。
  • ユーザーとして、アクセス制御されたモデルとそのモデルのライセンスを取得するため、モデル開発者または独立系ソフトウェア・ベンダーに情報を提供しました。
  • ユーザーとして、ライセンスを取得し、制御されたモデルを実行できるホストサーバーをセットアップして起動しました。
  • ユーザーとして、アクセス制御されたモデルをロードしてモデルのライセンスを検証し、そのモデルを使用して推論を実行しました。

関連情報

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