チュートリアル: Key Vault を使用して .NET App Service から Foundry Tools 接続をセキュリティで保護する

Azure App Service では、 マネージド ID を 使用して、接続文字列なしでバックエンド サービスに接続できます。 この方法では、管理する接続シークレットを排除し、運用環境でバックエンド接続をセキュリティで保護します。 完了すると、App Service に接続シークレットを格納せずに Foundry Tools をプログラムで呼び出すアプリが作成されます。

マネージド ID をサポートせず、接続シークレットを必要とするバックエンド サービスの場合は、Azure Key Vault を使用して接続シークレットを管理できます。 このチュートリアルでは、Foundry Tools を例として使用します。 完了すると、App Service 内に接続シークレットを格納せずに Foundry Tools をプログラムで呼び出すアプリが作成されます。

ヒント

Foundry Tools では、マネージド ID を使用した認証がサポートされます。 このチュートリアルでは 、サブスクリプション キー認証 を使用して、App Service からのマネージド ID をサポートしていない Azure サービスに接続する方法を示します。

サービスに接続しているユーザーを示す図。次に、Cognitive Services にアクセスするためにキー コンテナーに接続します。

このアーキテクチャでは、次のことを行います。

  • 管理された ID は、キー ボールトへの接続をセキュリティで保護します。
  • App Service は、 Key Vault 参照 をアプリ設定として使用してシークレットにアクセスします。
  • キー コンテナーへのアクセスはこのアプリに制限される。 管理者などのアプリ共同作成者は、App Service リソースを完全に制御でき、同時に Key Vault シークレットにアクセスできない場合があります。
  • アプリケーション コードが既にアプリ設定を使用して接続シークレットにアクセスしている場合、変更は必要ありません。

このチュートリアルでは、次の情報を学習します。

  • マネージド ID を有効にする
  • マネージド ID を使用してKey Vaultに接続する
  • Key Vault参照を使用する
  • Foundry ツールへのアクセス

前提条件

Azure CLI用に環境を準備します。

  • Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Get started with Azure Cloud Shell」を参照してください。

  • CLI 参照コマンドをローカルで実行する場合は、Azure CLIinstallします。 Windowsまたは macOS で実行している場合は、Docker コンテナーでAzure CLIを実行することを検討してください。 詳細については、「 Docker コンテナーでAzure CLIを実行する方法を参照してください。

    • ローカル インストールを使用している場合は、az login コマンドを使用してAzure CLIにサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、「Azure CLI を使用して Azure に認証する」を参照してください。

    • メッセージが表示されたら、最初に使用するときにAzure CLI拡張機能をインストールします。 拡張機能の詳細については、「Azure CLIを参照してください。

    • az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。

Foundry Tools への接続を使用してアプリを作成する

  1. すべてのリソースを含むリソース グループを作成します。

    # Save the resource group name as a variable for convenience
    groupName=myKVResourceGroup
    region=canadacentral
    
    az group create --name $groupName --location $region
    
  2. Foundry Tools リソースを作成します。 <cs-resource-name> を一意の名前に置き換えます。

    # Save the resource name as a variable for convenience. 
    csResourceName=<cs-resource-name>
    
    az cognitiveservices account create --resource-group $groupName --name $csResourceName --location $region --kind TextAnalytics --sku F0 --custom-domain $csResourceName
    

    注記

    --sku F0 で、無料の Foundry Tools リソースが作成されます。 サブスクリプションごとに、1 つの Free レベル TextAnalytics リソースというクォータに制限されています。 既にクォータを使用している場合は、代わりに --sku S を使用します。

.NET アプリを構成する

サンプル リポジトリをローカルにクローンし、サンプル アプリケーションを App Service にデプロイします。 <app-name> を一意の名前で置き換えます。

# Save the app name as a variable for convenience
appName=<app-name>

# Clone the sample application
git clone https://github.com/Azure-Samples/app-service-language-detector.git
cd app-service-language-detector/dotnet

az webapp up --sku F1 --resource-group $groupName --name $appName --plan $appName --location $region

シークレットをアプリ設定として構成する

  1. Foundry Tools シークレットをアプリ設定 CS_ACCOUNT_NAME および CS_ACCOUNT_KEYとして構成します。

    # Get the subscription key for the Foundry Tools resource
    csKey1=$(az cognitiveservices account keys list --resource-group $groupName --name $csResourceName --query key1 --output tsv)
    
    az webapp config appsettings set --resource-group $groupName --name $appName --settings CS_ACCOUNT_NAME="$csResourceName" CS_ACCOUNT_KEY="$csKey1"
    
  2. ブラウザーで、 <app-name>.azurewebsites.netでデプロイされたアプリに移動します。 さまざまな言語で文字列を入力して、言語検出機能を試してみてください。

    App Service にデプロイされた言語検出アプリを示すスクリーンショット。

    アプリケーション コードを見ると、検出結果のデバッグ出力が背景と同じフォント色になる可能性があります。 結果のすぐ下にある空白を強調表示すると、出力を確認できます。

バックエンド接続をセキュリティで保護する

接続シークレットが App Service アプリのアプリ設定として格納されるようになりました。 この方法では、アプリケーション コードベースから接続シークレットが既にセキュリティで保護されています。 ただし、アプリを管理できる共同作成者はアプリの設定を表示することもできます。 このセクションでは、接続秘密情報をキー ボールトに移動します。 自分だけが管理できるようにアクセスをロックダウンし、App Service アプリのみがマネージド ID を使用して読み取ることができるようにします。

  1. Key Vault を作成します。 <vault-name> を一意の名前で置き換えます。

    # Save the key vault name as a variable for convenience
    vaultName=<vault-name>
    
    az keyvault create --resource-group $groupName --name $vaultName --location $region --sku standard --enable-rbac-authorization
    

    --enable-rbac-authorization パラメーター Azure のロールベースのアクセス制御 (RBAC) をアクセス許可モデルとして設定します。 この設定により、すべてのアクセス ポリシーのアクセス許可が既定で無効になります。

  2. 自分に、コンテナーに対する Key Vault Secrets Officer RBAC ロールを付与します。

    vaultResourceId=$(az keyvault show --name $vaultName --query id --output tsv)
    myId=$(az ad signed-in-user show --query id --output tsv)
    az role assignment create --role "Key Vault Secrets Officer" --assignee-object-id $myId --assignee-principal-type User --scope $vaultResourceId
    
  3. アプリに対してシステム割り当てマネージド ID を有効にし、これにコンテナーの Key Vault Secrets Officer RBAC ロールを付与します。

    az webapp identity assign --resource-group $groupName --name $appName --scope $vaultResourceId --role  "Key Vault Secrets User"
    
  4. Foundry Tools リソース名とサブスクリプション キーをシークレットとしてコンテナーに追加し、次の手順で使用する ID を環境変数として保存します。

    csResourceKVUri=$(az keyvault secret set --vault-name $vaultName --name csresource --value $csResourceName --query id --output tsv)
    csKeyKVUri=$(az keyvault secret set --vault-name $vaultName --name cskey --value $csKey1 --query id --output tsv)
    
  5. 先ほど、アプリでシークレットをアプリ設定 CS_ACCOUNT_NAME および CS_ACCOUNT_KEY として設定しました。 ここでは、代わりにこれらをキー コンテナー参照として設定します。

    az webapp config appsettings set --resource-group $groupName --name $appName --settings CS_ACCOUNT_NAME="@Microsoft.KeyVault(SecretUri=$csResourceKVUri)" CS_ACCOUNT_KEY="@Microsoft.KeyVault(SecretUri=$csKeyKVUri)"
    
  6. ブラウザーで、もう一度 <app-name>.azurewebsites.net に移動します。 検出結果が返された場合は、キー ボールト参照を使用して Foundry Tools エンドポイントに接続します。

これで、アプリはキー コンテナーに保持されているシークレットを使用して Foundry Tools に接続し、アプリケーション コードに変更を加えませんでした。

リソースをクリーンアップする

前の手順では、リソース グループ内にAzureリソースを作成しました。 今後これらのリソースが必要ない場合は、Cloud Shellで次のコマンドを実行してリソース グループを削除します。

az group delete --name $groupName

このコマンドの実行には 1 分かかることがあります。