NGINX によるモデルサーバーの保護

OpenVINO モデル・サーバー・リポジトリーのクローンを作成し、NGINX ディレクトリーに移動します。

git clone https://github.com/openvinotoolkit/model_server.git
cd model_server/extras/nginx-mtls-auth

このディレクトリー内の Dockerfile とスクリプトは、NGINX mTLS モジュールを使用して OpenVINO モデルサーバーの認証と認可を実装する例を示しています。

これにより、GRPC エンドポイントと REST エンドポイントの両方を保護できます。モデルサーバーはサーバー証明書を提示し、RFC 2246 で説明されているように、完全な TLS ハンドシェイク (クライアント証明書認証の成功) を実行するクライアントからの接続のみを許可します。

警告: これには、開発およびテストを目的とした証明書生成の自動化が含まれています。これらは運用環境では使用しないでください。組織のベスト・プラクティスに従ってください。“認証の失敗” を再現しやすくするため、ここで生成された証明書は 1 日で期限切れになります。

警告: NGINX 構成の設定を確認し、組織のポリシーに従って調整します。安全な構成を設定および使用する責任はユーザーにあります。

警告: コンテナのセキュリティーに関する考慮事項に従ってください。

Architecture of OVMS with NGINX

クイックスタート

  1. openvino/model_server イメージが利用可能であることを確認してください。これは、公式リリースまたはローカルである可能性があります。

    docker pull openvino/model_server:latest
    
  2. ./build.sh を実行して、NGINX イメージの追加レイヤーをビルドします。

    ./build.sh
    
  3. ./generate_certs.sh スクリプトを実行します。自己署名証明書が生成されます (テスト用途のみ - サーバー証明書とクライアント証明書の要求と生成は、組織の手順に従ってください)。

    ./generate_certs.sh
    
  4. ターミナル 1 で ./start_secure_model_server.sh スクリプトを実行します。サンプルモデルをダウンロードし、コンテナを起動します。

    ./start_secure_model_server.sh
    
  5. ターミナル 2 で ./test_grpc.sh または ./test_rest.sh スクリプトを実行します。これらは、上記のコンテナに接続し、サンプルの Python クライアントを使用してシステムのテストを試みます。

    ./test_grpc.sh
    ./test_rest.sh
    

注: モデルのダウンロード中と docker build 操作中の両方で、プロキシー設定が正しいことを確認してください。必要に応じて build.sh を調整してください。

注: サーバー証明書を生成する場合、証明書のサブジェクト内の CommonName が、クライアントが使用する OVMS エンドポイントの DNS 名と一致していることを確認してください。

設計

このディレクトリー内の Dockerfile は、既存の OpenVINO モデルサーバーのイメージ上に構築されています。デフォルトの結果イメージ名は、openvino/model_server:nginx-mtls です。

この画像では、ラッパースクリプトがコンテナ対応の init システムによって実行されています (例として dumb-init が選択されています)。これは、暗号化されたエンドポイントのみを透過的に公開しながら、モデルサーバー CLI に互換性のあるコマンドライン・インターフェイスを提供します。開始すると、コマンドライン・オプションを解析し、NGINX とモデルサーバーの両方の実行パラメーターを調整して、両方のプロセスを実行し、その進行状況を追跡します。モデル・サーバー・プロセスは非特権ユーザー ovms として実行されますが、最初は管理アクションの実行に root が使用されます。

--rest_port は通常のモデルサーバーへのデプロイではオプションのパラメーターですが、NGINX mTLS モジュールで実行する場合は必須です。この設定では、gRPC と REST API の両方が mTLS 経由で公開されます。

ラッパーは、モデルサーバーが内部でいくつかのランダムな未割り当てポート上の loopback インターフェイスにバインドしていることを確認します。NGINX 構成は、モデルサーバーのコマンドライン引数で指定されたポートを公開しています。すべての IPv4 インターフェイス (0.0.0.0) のリスニングを行います。

ラッパーは、NGINX またはモデルサーバーのクラッシュも処理し、適切な方法でコンテナを終了します (可能であれば、別の外部サブシステムがコンテナの再起動を行う必要があります)。

参照テストスクリプト: test_grpc.sh および test_rest.sh

これらのサンプル Python クライアントを使用して、mTLS で保護されたモデルサーバーに接続する方法を確認してください。アプリケーションでこれらを設定する方法については、該当する Python クライアントのサンプルファイルを確認してください。