Key Vaultでシークレットを管理する手順

2022年11月3日

今回はキーコンテナで設定した内容をAzure Functionsで確認する手順となります。Key Vaultを登録して、正しくKey Vaultが登録できたか気になることがあると思います。一度設定して確認しておけば、必要な時にすぐに設定できるので、一度はやってみることをお勧めします。

大きく以下の流れとなります。

・キーコンテナーの作成

・シークレットの登録

・Azure FunctionsのマネージドIDをオンにしてプリンシパルIDを記録しておく

・キーコンテナーのアクセスポリシーを設定して、プリンシパルIDを使って紐づける

・Functionsの構成情報をKey Vaultから取得するように設定する。

キーコンテナーの作成

Key Vaultを設定するためには、まずキーコンテナが必要となります。キーコンテナーと検索欄に打ち込んで探します。

キーコンテナーを作成します。

項目を埋めていきます。

こんな情報で入力してます。

デプロイが完了しました。

シークレットの作成

作成したキーコンテナーからシークレットを作成します。
本来はパスワードとかをシークレットとして登録しますが、今回は実験目的なので適当な値を入力すればいいです。

生成インポートを押します。

シークレットの作成は以下のような感じで。
シークレット値はAzure Functionsでレスポンスに含めて表示するようにします。
今回はhellow keyvaultとしました。

シークレット識別子が知りたいので、作成したシークレットの中身を確認します。

現在のバージョンのところをクリックして展開します。

シークレット識別子をメモしておきます。
構成情報でKey Vaultを使うときにこの識別子が必要となります。

Key Vaultを参照するためには、おまじないのような文字列を構成情報に設定してあげる必要があります。以下のような文字列となります。

@Microsoft.KeyVault(SecretUri=シークレット識別子)

今回の値だと以下を設定します。

@Microsoft.KeyVault(SecretUri=https://keyvault-from-functions.vault.azure.net/secrets/sample1/)

メモしておいたシークレット識別子には、後ろの部分にトークンみたいな文字列がついています。その部分を省いて上記のようにsample1/で区切ると、最新のシークレットのバージョンを取得してくれます。

特定のバージョンを指定したい場合は、後ろのトークンみたいな文字列も一緒に記載してあげる必要があります。

ここの書き方については、以下リンクの参照構文に詳しくあります。

https://learn.microsoft.com/ja-jp/azure/app-service/app-service-key-vault-references?tabs=azure-cli

Azure Functionsの設定

以下で作ったFunctionsを使っていきます。

作成したFunctionsのIDからシステム割り当てのマネージドIDの状態をオンにします

オブジェクト (プリンシパル) IDをメモしておきます。プリンシパルIDはキーコンテナーのアクセスポリシー紐付けで使用します。

以下をコピーします。

キーコンテナーのアクセスポリシーを作成する

キーコンテナーのアクセスポリシーからポリシーを作成します。

今回は読み取りだけしたいので取得だけにチェックを入れておきます。

メモしておいたオブジェクト (プリンシパル) IDを入力して選択する。

この内容で作成します。

以下のようにアクセスポリシーが作成されました。

Functionsの構成情報を設定

Key Vaultを設定します。

Azure Functionsで構成情報を表示するようにしています。以下リポジトリのKeyVaultSample1に実装しています。

https://github.com/xiaotiantakumi/azfunc-keyvault-sample

シークレット識別子で記載したやつを値に設定します。

これでKey Vaultの値が表示されるようになりました。

キーコンテナのアクセスポリシで正しく権限を設定していない場合

例えば、アクセスポリシーを以下のように設定します。

削除だけにアクセス許可を与えるということは、Key Vaultからの読込みアクセスがないということです。この状態でアクセスすると、KeyVaultの設定値がそのまま出るだけとなります。

ところで、アクセスポリシーを変更して保存してもすぐにKeyVaultの値に反映されませんでした。
今度またこの件について記事を書こうと思いますが、最大24時間KeyVaultの値はキャッシュされており、すぐに変更されません。設定した状態を反映させたい場合は、今回の場合で言うと、Functionsの構成情報を上書きすればいいです。

例えば、以下のように何かしらの構成情報の値を変更すればOKです。(KeyVaultを設定した構成情報の更新が必要というわけではないです。)