Azure Key Vault から読み取ることによって、ARM テンプレート内のシークレットを管理する
"コードとしてのインフラストラクチャ" (IaC) は、人が読むことのできるテキスト ファイルとしてインフラストラクチャの要件を記述することを意味します。 Azure Resource Manager (ARM) テンプレートは IaC の 1 つの形式です。
アプリケーションのコードと同じように、Git などのバージョン管理システムでインフラストラクチャのコードを管理できます。 これにより、他のユーザーと共同作業を行ったり、発展に合わせてインフラストラクチャの要件に行われた変更をトレースしたりすることができます。
アプリケーションのコードと同様に、パスワードや API キーなどの機密情報を ARM テンプレートにハードコーディングしないようにする必要があります。 そうしないと、リポジトリの読み取りアクセス権を持つすべてのユーザーが、このシークレット情報にアクセスできるようになります。
組織内の承認されたユーザーだけが機密情報にアクセスできるようにする必要がありますが、ARM テンプレートでもこの情報が必要です。 Azure Key Vault は、機密情報を保護するための 1 つの方法です。
Azure Key Vault は機密情報を保護するのに役立つ
Azure Key Vault は、セキュリティで保護されたシークレットのストアとして機能するクラウド サービスです。 Key Vault を使用すると、コンテナーと呼ばれるセキュリティで保護されたコンテナーを複数作成できます。 これらのコンテナーは、ハードウェア セキュリティ モジュール (HSM) によってサポートされています。 コンテナーでは、アプリケーション シークレットを一元的に保管することで、セキュリティ情報が過って失われる可能性が低くなります。 また、コンテナーによって、その中に格納されているすべてのものへのアクセスが制御され、ログされます。
キー コンテナーには、キーとシークレットの両方を格納できます。 多くの機能を備えているので、シークレットの管理に適した選択肢ですが、デプロイ プロセスに使用するのに適した選択肢でもあります。
ロールベースのアクセス制御。 さまざまなロールを使ってキー コンテナーを管理できるので、アプリだけでなく、さまざまなレベルの管理者が確実に使用できるようにすることができます。
ユーザーとアプリの許可。 特定のユーザーとアプリの両方がキー コンテナーにアクセスできるようにキー コンテナーを構成することができます。 アプリの場合は、"サービス プリンシパル" を作成します。 実際、サービス プリンシパルだけがアクセスできるようにキー コンテナーを構成することができます。
Note
サービス プリンシパルは、アプリケーション、ホステッド サービス、自動ツールを使用して Azure リソースにアクセスするために作成された ID です。 限られたアクセス権を持つロールまたはロールのサブセットをプリンシパルに割り当てるだけで、リソースへのアクセスを制限します。 この方法を使用すると、何かがアクセスできるリソースとその範囲を、より細かく制御できます。
ARM テンプレートと対話できる。 ARM テンプレートのデプロイ時に、キー コンテナーから読み取ることができます。 これを機能させるには若干の構成が必要です。 これについては次のセクションで詳しく説明します。
権限の構成
資格情報を格納するサービスとして、Key Vault を選択しました。 そこから、たとえば、仮想マシンのパスワードを設定できるように、デプロイの間にシークレットを読み取れるようにします。
デプロイ時に読み取れるように Key Vault を設定するには、いくつかの構成手順を実行する必要があります。 手順は次のとおりです。
デプロイに対してキー コンテナーを有効にします。 デプロイ時に Key Vault から読み取ることを許可する必要があります。 この設定は、作成時に渡すことも、後で修正することもできます。
ユーザーには、リソース グループでのデプロイ アクセス許可が必要です。 これは、他のデプロイと同じです。 ただし、自分でリソース グループを作成していない場合は、ロールを割り当てることでそれにデプロイできるようにすることができます。
ユーザーには、キー コンテナーへの適切なアクセス権が必要です。 デプロイ時に読み取りを行うには、キー コンテナーへの適切なアクセス権が必要です。 キー コンテナーを作成するときに、すべてのシークレット、キー、証明書を管理するための権限をユーザーに付与するアクセス ポリシーが作成されます。
デプロイ用にキー コンテナーを構成する
ARM テンプレートのデプロイ時に資格情報を読み取れるように、Key Vault のインスタンスを構成します。
デプロイ用に Key Vault を有効にするには、その Key Vault のインスタンスの作成時に渡すか、後で修正することができる設定があります。 PowerShell では、それは -EnabledForTemplateDeployment
という名前のスイッチです。 Azure CLI では、それは --enabled-for-template-deployment
という名前の引数であり、値 true
を渡す必要があります。
Note
Azure CLI の場合はさらに、値が true
のブール値を渡す必要があります。
ユーザーには、Key Vault とリソース グループに対するデプロイ アクセス許可が必要である
デプロイとキー コンテナーからのシークレットの読み取りを試みる前に、必ず "デプロイ アクセス許可" を得る必要があります。 このアクセス許可を付与するロールが 2 つあります。
Owner
:自分でキー コンテナーを作成した場合は、自動的にこのロールが割り当てられます。Contributor
:このロールにより、すべてのシークレットを管理するためのアクセス権が付与されます。 自分でキー コンテナーを作成しなかった場合、最も簡単な方法は、Contributor
ロールを自分に付与することです。
もう 1 つの選択肢は、カスタム ロールを作成して割り当て、そのロールに Microsoft.KeyVault/vaults/deploy/action アクセス許可が確実に含まれるようにすることです。
デプロイ パラメーター ファイルを構成する
デプロイ時に各パラメーターと対応する値をキーと値のペアとして指定する代わりに、パラメーター ファイルを使用することができます。
このパラメーター ファイルでは、対象となるキー コンテナーと、そのキー コンテナー内のシークレットを指定します。 これを行うには、パラメーターを変更してから、このパラメーターを使用するように展開テンプレートを更新します。
Note
このテンプレートには、キー コンテナーやそのシークレットの概念はありません。 作成しようとしている構成はパラメーター ファイル内で行われます。
パラメーター用にキー コンテナーとシークレットを構成する
パラメーター ファイル内、および特定のパラメーターで、デプロイ アクセス許可があるキー コンテナーを指定します。 次に、対象のシークレットを指定します。 シークレットは名前で指定します。 デプロイ時に、この構成がシークレットの値に解決されます。 次に示すのは、myPassword
というパラメーターで、特定のキー コンテナーと、databaseSecret
というシークレットを使用するように構成されています。
"myPassword" : {
"reference": {
"keyVault": {
"id": "/subscriptions/<subscription-id>/resourceGroups/<rg-name>/providers/Microsoft.KeyVault/vaults/<vault-name>",
"secretName": "databaseSecret"
}
}
}
上記の JSON では、キー コンテナーに完全な ID を指定し、シークレット databaseSecret
を要求します。 その後、このシークレットの値が抽出され、myPassword
パラメーターに割り当てられます。
リソースのパスワードにパラメーターを割り当てる
この手順はキー コンテナーには関連していません。 シークレットの値がキー コンテナーから読み取られるように構成されたパラメーターが目的のリソースで使用されることを保証します。 次に示すのは、テンプレート ファイル内の VM の短いスニペットで、パラメーター myPassword
から読み取られる adminPassword
要素が示されています。 その後、シークレットの値はデプロイ時にキー コンテナーから読み取られて、adminPassword
要素に割り当てられます。
{
"osProfile": {
"adminPassword": "[parameters('myPassword')]"
}
}