クライアントは、トレーニング済みモデルと、安全な接続を確立するために使用されるTLS証明書を暗号化します。 次に、クライアントは、暗号化されたファイルをSGX暗号化コンピューティング環境にアップロードする。 Alibaba Cloud仮想SGX (vSGX) ECSインスタンスを認証し、クラウド上で実行されるTensorFlow Serving推論サービスの整合性とクラウドベースのSGX暗号化コンピューティング環境の実現可能性を確保するために、クライアントがデプロイされているのと同じElastic Compute service (ECS) インスタンスにキーサービスがデプロイされます。 vSGXインスタンスが認証されると、クライアントはインスタンスで実行されるTensorFlow Serving推論サービスにキーを送信します。 このトピックでは、クライアントをデプロイする方法について説明します。 クライアントをデプロイするために実行できる操作には、SGX暗号化コンピューティング環境の構築、暗号化モデルの作成、gRPC Transport Layer Security (TLS) 証明書の作成などがあります。
手順
クライアントインスタンスを作成し、インスタンス上にSGX暗号化コンピューティング環境を構築します。
クライアントインスタンスを作成し、インスタンスへのアクセスまたはインスタンスからのアクセスを制御するセキュリティグループルールを設定します。
クライアントがデプロイされるインスタンスは、次の要件を満たす必要があります。
インスタンスタイプ: クライアントはSGX環境で実行する必要はありません。 ビジネス要件を満たすインスタンスタイプを選択できます。 2 vCPUと4 GiBのメモリを持つインスタンスタイプを選択することを推奨します。
イメージ: Alibaba Cloud Linux 3.2104 LTS 64ビットイメージを選択します。
パブリックIPアドレス: パブリックIPv4アドレスの割り当てを選択します。
セキュリティグループ: ポート4433を開くルールがあるセキュリティグループを選択します。
説明クライアントとvSGXクライアントが同じECSインスタンスにデプロイされている場合、選択したセキュリティグループにポート4433を開くためのルールを含める必要はありません。
ECS インスタンスにログインします。
詳細については、「Workbenchを使用したSSH経由のLinuxインスタンスへの接続」をご参照ください。
依存関係をインストールします。
sudo yum install -y wget git python3-pip python3 -m pip install --user -U pip -i https://mirrors.aliyun.com/pypi/simple/ python3 -m pip install --user virtualenv -i https://mirrors.aliyun.com/pypi/simple/
Docker Community Edition (Docker-CE) をインストールします。
詳細については、「Dockerのインストール」をご参照ください。
Docker-CEのインストール後、Docker-CEを非rootユーザーとして使用するには、
sudo usermod -aG docker $user
コマンドを実行して、非rootユーザーをDockerグループに追加し、非rootユーザーとしてインスタンスに再ログインします。説明Docker-CEをインストールする必要があります。 podman-dockerを使用すると、非互換性の問題が発生する可能性があります。
作業ディレクトリに切り替え、TensorFlow Servingスクリプトコードをダウンロードしてから、argparse、aiohttp、tensorflowなどの必要なソフトウェアパッケージをインストールします。
重要ソフトウェアパッケージのインストールには長い時間が必要である。
git clone https://gitee.com/cloud_cc/confidential-computing.git export CC_DIR=$(realpath ./confidential-computing) # Create a virtual environment to prevent the Python dependencies from being contaminated. python3 -m virtualenv venv && source venv/bin/activate python3 -m pip install -r ${CC_DIR}/Tensorflow_Serving/client/requirements.txt --trusted-host mirrors.cloud.aliyuncs.com -i https://mirrors.cloud.aliyuncs.com/pypi/simple/
TensorFlow_Serving/clientディレクトリに移動し、トレーニング済みモデルをダウンロードします。
source venv/bin/activate cd ${CC_DIR}/Tensorflow_Serving/client ./download_model.sh
ダウンロードしたトレーニング済みモデルのファイルは、models/resnet50-v15-fp32ディレクトリに保存されます。
モデル形式を変換します。
トレーニング済みモデルファイルの形式を変換して、ファイルがTensorFlow Servingと互換性があることを確認する必要があります。
python3 ./model_graph_to_saved_model.py --import_path `pwd -P`/models/resnet50-v15-fp32/resnet50-v15-fp32.pb --export_dir `pwd -P`/models/resnet50-v15-fp32 --model_version 1 --inputs input --outputs predict
変換されたモデルファイルは、models/resnet50-v15-fp32/1/saved_model.pbファイルとして保存されます。
説明モデル形式を変換すると、
「ダイナミックライブラリ 'libcudart.so.11.0」
に関連するエラーログが生成される場合があります。 この問題は無視できます。gRPC TLS証明書を作成します。
この例では、gRPC TLSを使用してクライアントとTensorFlow Serving間の接続を確立し、TensorFlow Servingドメイン名を設定して、単方向TLSキーと安全な通信チャネルを確立するための証明書を作成します。
generate_twoway_ssl_config.shスクリプトを実行して、サーバーとクライアントの証明書を含むssl_configureフォルダーを作成します。
service_domain_name=grpc.tf-serving.service.com client_domain_name=client.tf-serving.service.com ./generate_twoway_ssl_config.sh ${service_domain_name} ${client_domain_name}
暗号化モデルを作成します。
SGX SDK v1.9以降のバージョンには、セキュアなファイルI/O機能が付属しています。 安全なファイルI/O機能は、Intel Protected file System Libraryという名前のコンポーネントで提供され、開発者はエンクレーブ内でI/O操作を安全に実行できます。
SGX SDKは保証できます:
ユーザーデータの機密性。 データ漏洩を防ぐため、すべてのユーザーデータは暗号化され、ディスクに書き込まれます。
ユーザーデータの整合性。 すべてのユーザーデータは、ディスクから読み取られ、検証済みメッセージ認証コード (MAC) を使用してデータ改ざんを検出することによって復号されます。
一致したファイル名。 既存のファイルを開く前に、ファイルのメタデータをチェックして、作成時のファイルの名前がファイルオープン操作に提供された名前と同じであることを確認します。
この例で使用されているLibOS Gramineは、セキュアなファイルI/O機能に基づいた参照ツールを提供します。 参照ツールを使用して、ファイルを暗号化および復号できます。 構成オプションsgx.protected_files.file_mode=file_nameは、参照ツールで復号化する暗号化されたファイルを指定できるように、LibOS Gramineが提供するテンプレート構成ファイルで定義されています。
TensorFlow Servingは、models/resnet50-v15-fp32/1/saved_model.pbパスからモデルを読み込み、files/wrap-keyディレクトリに格納されているキーを使用してモデルファイルを暗号化します。 長さが128文字のパスワードを指定することもできます。 ファイルが暗号化されている場合とファイルが使用されている場合のファイルのパスは、パスマッチング規則を満たすために同じでなければなりません。 gramine-sgx-pf-cryptツールで次のコマンドを実行して、モデルファイルを暗号化します。
mkdir plaintext/ mv models/resnet50-v15-fp32/1/saved_model.pb plaintext/ LD_LIBRARY_PATH=./libs ./gramine-sgx-pf-crypt encrypt -w files/wrap-key -i plaintext/saved_model.pb -o models/resnet50-v15-fp32/1/saved_model.pb
キー认证サービスを开始します。
この例では、LibOS Gramineが提供するsecret_prov_server_dcapをリモート証明サービスとして使用して、下層のSGX Data Center attestation Primitives (DCAP) の引用検証ライブラリを呼び出してSGXエンクレーブ引用を検証します。 次に、secret_prov_server_dcapは、信頼できるコンピューティングベース (TCB) や証明書失効リスト (CRL) などの見積もり検証データをAlibaba Cloud Provisioning certificate Caching Service (PCCS) に提供します。 リモート認証サービスがSGXエンクレーブ引用が信頼されていると判断した後、TensorFlow Serving推論サービスは、現在のディレクトリのfiles/wrap-keyからリモートアプリケーションにキーを送信します。 この例では、リモートアプリケーションは、vSGX環境のLibOS Gramineです。 LibOS Gramineが推論サービスからキーを受信すると、LibOS Gramineは暗号化されたモデルファイルとTLS構成ファイルを復号化します。
secret_prov_serverディレクトリに切り替えます。
cd ${CC_DIR}/Tensorflow_Serving/docker/secret_prov
キー认证サービスのイメージを使用します。
次のいずれかの方法で、キー认证サービスのイメージを使用できます。
鍵認証サービスのイメージをダウンロードします。
docker pull registry.cn-beijing.aliyuncs.com/tee_sgx/secret_prov_server:v1
スクリプトを使用して画像をコンパイルします。
image_tag="v1" ./build_secret_prov_image.sh $image_tag
キー认证サービスを开始します。
image_tag="registry.cn-beijing.aliyuncs.com/tee_sgx/secret_prov_server:v1" # If you created an image, set $image_tag to the tag of the image. container_id=$(./run_secret_prov.sh -i $image_tag|tail -n1) # You can also run the docker ps command to view all container instances that are running.
サービスが開始されると、バックグラウンドで実行され、リモート認証要求を待機します。 サービスがリモートエンドからリモート認証要求を受信し、リモートエンドが信頼されていることを判断するために要求を認証した後、サービスはリモートエンドにキーを送信します。
secret_prov_serverログを表示します。
docker logs -f $container_id
次のコマンド出力は、リモート認証要求が受信されたことを示します。
次のステップ
クライアントがデプロイされた後、vSGXクライアントが推論サービスを開始し、リモート認証要求を送信するのを待ちます。 vSGXクライアントのデプロイ方法については、「手順2: vSGXクライアントをデプロイしてTensorFlow Serving推論サービスを実行する」をご参照ください。