Azure App Serviceのアプリケーション設定にパスワードなどを格納していると、Azureポータルあるいはデプロイのコードなどから、それが漏れてしまう危険がある。これを「Key Vault」の「シークレット」で解決する方法のうち、Azure CLIでの手順を説明する。
対象:Azure App Service、Key Vault(キーコンテナー)、Azure CLI
「Azure App Service」上のアプリケーションから認証が必要な別のサービスを利用するために、ID/パスワードなどの秘密情報を「アプリケーション設定」に保存しておき、アプリケーションのコードから参照する。これはよくある実装だろう。
ただ、このように保存している秘密情報は、そのApp Serviceの設定を閲覧できるスタッフならば容易に知ることができる。また、リソースをデプロイしているコードのアプリケーション設定部分には、秘密情報が暗号化されずに露出していることも多いのではないだろうか。
そこでTech TIPS「【Azure Key Vault】App Serviceのアプリケーション設定から『シークレット』な情報が漏れないようにする(Azureポータル編)」では、「Azure Key Vault」(キーコンテナー)とApp Serviceを連携させることで、秘密情報の漏えいを抑える方法を紹介した。
本Tech TIPSでは、Azure CLI(コマンドライン)で同じことを実現する手順を紹介したい。基本的な事柄については前出のTech TIPSで説明しているので、そちらに目を通してから本Tech TIPSを読み進めていただきたい。また、App ServiceとKey Vaultは、同じサブスクリプションであらかじめデプロイ済みとする。
ここからAzure CLIでAzureのリソースを操作していく。あらかじめコマンドプロンプトでAzureへのログイン(az loginコマンド)とサブスクリプションの選択(az account set -sコマンド)をしておくこと。
Key Vaultからシークレットを読み出すには、まず参照元のApp Serviceで「マネージドID」を有効化する必要がある。本Tech TIPSでは、「システム割り当て」「ユーザー割り当て」という2種類のマネージドIDのうち、より簡単に利用できる前者で説明する。
システム割り当てのマネージドIDを有効化するには、以下のように「az webapp identity assign」コマンドを実行する。この作業は1回行えばよい。
az webapp identity assign -n <App Service名> -g <App Serviceリソースグループ名>
上記のコマンドラインを実行すると、以下のようにマネージドIDの「principalId」(プリンシパルID。16進数とハイフンからなるGUIDの一種)が出力されるので、メモしておくこと。この後に説明するKey Vaultへのアクセス許可を設定する際に必要になる。
{
"principalId": "<App ServiceマネージドIDのプリンシパルID>",
"tenantId": "<GUID>",
"type": "SystemAssigned",
"userAssignedIdentities": null
}
プリンシパルIDは、以下のように「az webapp identity show」を実行することで表示できる。
az webapp identity show -n <App Service名> -g <App Serviceリソースグループ名> --query "principalId"
何も表示されない場合は、システム割り当てのマネージドIDがまだ無効のままと考えられる。前述の手順で有効化してみよう。
次に、App ServiceがKey Vaultシークレットを取得できるように、有効化したマネージドIDを使ってアクセス許可を設定する。
本Tech TIPSでは、「コンテナーアクセスポリシー」「Azureロールベースのアクセス制御(Azure RBAC)」という2種類のKey Vaultアクセス制御方式のうち、よりシンプルな前者を選んでいるものとして説明する(Microsoftは後者を推奨している)。
コンテナーアクセスポリシーでApp ServiceにKey Vaultシークレットの取得を許可するには、以下のように「az keyvault set-policy」コマンドを実行する。この作業も1回行えばよい。
az keyvault set-policy -n <Key Vault名> -g <Key Vaultリソースグループ名> --secret-permissions get --object-id <App ServiceマネージドIDのプリンシパルID>
「--secret-permissions」オプションの後には、Key Vaultシークレットに対して許可する操作として、唯一必要な「get(取得)」のみ指定している。複数の場合は、操作内容を表す単語「all」「backup」「delete」「get」「list」「purge」「recover」「restore」「set」を半角スペースで区切りつつ列挙すればよい。
「--object-id」オプションに続く<App ServiceマネージドIDのプリンシパルID>には、メモしておいた前述のApp ServiceマネージドIDのプリンシパルIDを指定すること。
Key Vaultシークレットに秘密情報を保存するには、以下のように「az keyvault secret set」コマンドを実行する。この作業はKey Vaultシークレットごとに1回ずつ行う必要がある。
az keyvault secret set --vault-name <Key Vault名> --name <シークレット名> --value "<パスワードなどの秘密情報>"
<シークレット名>は、半角の英数字およびハイフン、かつ127文字以内で指定する必要がある。
Key Vaultシークレットに保存した秘密情報をApp Serviceのアプリケーション設定から参照(取得)するには、以下のように「az webapp config appsettings set」コマンドを実行して、アプリケーション設定を追加する(同じコマンドラインで既存のKey Vaultシークレットの変更も可能)。
az webapp config appsettings set -n <App Service名> -g <App Serviceリソースグループ名> --settings <アプリケーション設定の名称>="@Microsoft.KeyVault(VaultName=<Key Vault名>;SecretName=<シークレット名>)"
上記のコマンドラインを実行すると、自動的にアプリケーションのリサイクルがかかり、一時的にWebサイト/アプリの応答が途絶することがあるので注意が必要だ。
<アプリケーション設定の名称>は、半角の英数字とピリオド、アンダースコアで指定する必要がある。
アプリケーション設定が複数の場合は、そのキー/バリューの組み合わせをJSONで記述し、そのJSONファイルを以下のように指定する。
az webapp config appsettings set -g <App Serviceリソースグループ名> -n <App Service名> --settings @<アプリケーション設定を記述したJSONファイル名>
JSONの記述内容については、Microsoft Learnの「App Service アプリを構成する」を参照していただきたい。
設定が完了したら、App ServiceからKey Vaultシークレットが正しく参照(取得)できているかどうか確認しよう。基本的には、<アプリケーション設定の名称>と同じ名前の環境変数の内容がKey Vaultシークレットの内容と同じであるかどうかチェックすればよい。
以下ではLinuxベースのApp ServiceにSSHで接続し、「printenv <アプリケーション設定の名称>」と実行して環境変数の内容を表示させている。
参照に失敗していると、前述の「@Microsoft〜」から始まる参照文字列が(展開されることなく)そのまま環境変数の内容として格納されているはずだ。その場合はアプリケーション設定などを再確認すること。
上記の例から分かるように、Key Vaultシークレットへの参照を設定していても、アプリケーションのインスタンス内部で環境変数など参照可能なユーザーには、秘密情報が閲覧されてしまう。本Tech TIPSで紹介している方法では漏えいの危険性を下げることはできても、完全に防ぐことはできない。引き続きアクセス権の制限などに注意を払う必要があるだろう。
認証情報の更新に伴い、Key Vaultシークレットの内容も更新しなければならない場合は、追加時のコマンドラインのうち「--value」オプションの値のみ<更新された秘密情報>に差し替えて実行する。
az keyvault secret set --vault-name <Key Vault名> --name <シークレット名> --value "<更新された秘密情報>"
App Serviceを放置した場合、24時間以内に自動で最新の内容(更新した内容)が反映される。
すぐに反映したいなら、アプリケーション設定を追加したときと全く同じコマンドラインを実行する。
az webapp config appsettings set -n <App Service名> -g <App Serviceリソースグループ名> --settings <アプリケーション設定の名称>="@Microsoft.KeyVault(VaultName=<Key Vault名>;SecretName=<シークレット名>)"
するとアプリケーションのリサイクルとKey Vaultシークレットの再読み出しが実行され、最新のKey Vaultシークレットの内容が反映される。
■関連リンク
Copyright© Digital Advantage Corp. All Rights Reserved.