チュートリアル: Key Vault を使用して PHP App Service からの Cognitive Service 接続をセキュリティで保護する
Azure App Service では、マネージド ID を使用して接続文字列なしでバックエンド サービスに接続できます。これにより接続シークレットを管理する必要がなくなるため、運用環境でのバックエンド接続のセキュリティが維持されます。 マネージド ID をサポートしないため接続シークレットが必要なバックエンド サービスの場合は、Key Vault を使用して接続シークレットを管理できます。 このチュートリアルでは、例として Azure AI サービスを使用して、実際の実行方法を示します。 完了すると、App Service 内に接続シークレットを保存せずに、プログラムで Azure AI サービスを呼び出すアプリが作成されます。
ヒント
Azure AI サービスはマネージド ID による認証をサポートしていますが、このチュートリアルではサブスクリプション キー認証を使用して、マネージド ID をサポートしない Azure サービスに App Services から接続する方法を示します。
このアーキテクチャでは、次のことが行われます。
- Key Vault への接続がマネージド ID によって保護される
- App Service は、アプリケーション設定として Key Vault 参照を使用してシークレットにアクセスする。
- キー コンテナーへのアクセスはこのアプリに制限される。 アプリの共同作成者 (管理者など) は、App Service リソースを完全に制御できる場合がありますが、同時に、Key Vault シークレットにアクセスすることはできません。
- アプリケーション コードが既にアプリ設定を使用して接続シークレットにアクセスしている場合、変更は必要ありません。
学習内容
- マネージド ID を有効にする
- マネージド ID を使用して Key Vault に接続する
- Key Vault 参照を使用する
- Azure AI サービスにアクセスする
前提条件
Azure CLI の環境を準備します。
Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の Bash のクイックスタート」を参照してください。
CLI リファレンス コマンドをローカルで実行する場合、Azure CLI をインストールします。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。
ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、Azure CLI でのサインインに関するページを参照してください。
初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、Azure CLI で拡張機能を使用する方法に関するページを参照してください。
az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。
Azure AI サービスに接続できるアプリを作成する
すべてのリソースを含むリソース グループを作成します。
# Save resource group name as variable for convenience groupName=myKVResourceGroup region=westeurope az group create --name $groupName --location $region
Azure AI サービス リソースを作成します。 <cs-resource-name> を任意の一意の名前で置き換えます。
# Save resource name as 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
Note
--sku F0
は、Free レベルの Azure AI サービス リソースを作成します。 サブスクリプションごとに、1 つの Free レベルTextAnalytics
リソースというクォータに制限されています。 既にクォータを超えている場合は、代わりに--sku S
を使用します。
PHP アプリの構成
サンプル リポジトリをローカルにクローンし、サンプル アプリケーションを App Service にデプロイします。 <app-name> を一意の名前で置き換えます。
# Clone and prepare sample application
git clone https://github.com/Azure-Samples/app-service-language-detector.git
cd app-service-language-detector/php
zip default.zip index.php
# Save app name as variable for convenience
appName=<app-name>
az appservice plan create --resource-group $groupName --name $appName --sku FREE --location $region
az webapp create --resource-group $groupName --plan $appName --name $appName
az webapp deploy --resource-group $groupName --name $appName --src-path ./default.zip
シークレットをアプリ設定として構成する
Azure AI サービスのシークレットを、アプリケーション設定
CS_ACCOUNT_NAME
およびCS_ACCOUNT_KEY
として構成します。# Get subscription key for Cognitive Services 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"
ブラウザーで、
<app-name>.azurewebsites.net
のデプロイ アプリに移動し、さまざまな言語の文字列で言語検出アプリを試します。アプリケーション コードを見ていると、検出結果のデバッグ出力が背景色と同じフォント色で表示される場合があります。 これは、結果の直下の空白を強調表示することで表示できます。
バックエンド接続をセキュリティで保護する
現時点では、接続シークレットはアプリ設定として App Service アプリに格納されています。 この方法では、接続シークレットをアプリケーション コードベースから既にセキュリティで保護できています。 ただし、アプリを管理できる共同作成者はアプリの設定を表示することもできます。 この手順では、自分だけがこれを管理でき、App Service アプリだけがマネージド ID を使用して読み取ることができるように、接続シークレットをキー コンテナーに移動し、アクセスをロックダウンします。
Key Vault を作成します。 <vault-name> を一意の名前で置き換えます。
# Save app name as variable for convenience vaultName=<vault-name> az keyvault create --resource-group $groupName --name $vaultName --location $region --sku standard --enable-rbac-authorization
--enable-rbac-authorization
パラメーターによって、--enable-rbac-authorization
。 この設定では、既定ですべてのアクセス ポリシーのアクセス許可が無効になります。自分に、コンテナーに対する 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
アプリに対してシステム割り当てマネージド ID を有効にし、これにコンテナーの Key Vault Secrets Officer RBAC ロールを付与します。
az webapp identity assign --resource-group $groupName --name $appName --scope $vaultResourceId --role "Key Vault Secrets User"
コンテナーにシークレットとして Azure AI サービス リソース名とサブスクリプション キーを追加し、次の手順のためにその 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)
先ほど、アプリでシークレットをアプリ設定
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)"
ブラウザーで、もう一度
<app-name>.azurewebsites.net
に移動します。 検出結果が返された場合は、キー コンテナー参照を使用して Azure AI サービス エンドポイントに接続しています。
これで、お使いのアプリは、アプリケーション コードを変更することなく、キー コンテナーに格納されたシークレットを使用して Azure AI サービスに接続できました。
リソースをクリーンアップする
前の手順では、リソース グループ内に Azure リソースを作成しました。 これらのリソースが将来必要になると想定していない場合、Cloud Shell で次のコマンドを実行して、リソース グループを削除します。
az group delete --name $groupName
このコマンドの実行には、少し時間がかかる場合があります。