Young Leaves

BicepパラメーターファイルでAzure Key Vaultのシークレットを利用する

Bicep のパラメーターファイルを使う時、パスワードなどのシークレットをどのように扱うか迷いますよね?今回はAzure Key Vault のシークレットをBicep のパラメーターファイルを使いAzure SQL Database の作成を行います。

実施環境

Azure CLI

2.61.0

Bicep CLI

0.27.1

前提条件

  • Azure CLI 実行用のCloud Shell が作成済みであること

Bicep でシークレットを扱う時

Bicep でAzure リソースを作成する時、データベースの認証情報など他の人に知られたくない機密情報を扱うことがあります。Bicep テンプレートファイルやパラメーターファイルで平文の文字列を記載すれば動作しますが、セキュリティ面で非推奨となります。また本来権限のない人に機密情報が見られてしまう、意図しない変更でトラブルとなる、攻撃を受けてシークレットが流出する、などのリスクができてしまいます。

このようなケースの時のためにBicep ではgetSecret というAzure Key Vault のキーコンテナーからシークレットを取得できる関数があります。Key Vault を利用するため、RBAC で閲覧できる人を制限したり、アクセスポリシーでシークレットの操作を制限したりできるため、よりセキュアなBicep ファイルを作成できます。

今回の構成

今回はBicep パラメーターファイルでAzure Key Vault のシークレットを使いAzure SQL Database を作成します。シークレットの扱いをメインとしているため、モジュール化は行わず1つのテンプレートファイルで作成します。ファイル構成は以下の通りとなります。

.
├── main.bicep
└── main.bicepparam

リソースグループの作成

初めに各種変数の定義とBicep デプロイ用のリソースグループを作成します。

# 変数を定義する
RESOURCE_GROUP_NAME="rg-biceptest"
KEY_VAULT_NAME="kv-biceptest"
LOCATION="japaneast"
TEMPLATE_FILE_NAME="main.bicep"
PARAMETER_FILE_NAME="main.bicepparam"

# リソースグループを作成する
az group create --name $RESOURCE_GROUP_NAME --location $LOCATION

Azure Key Vault の作成、シークレットの作成

リソースグループ作成後、シークレット格納用のAzure Key Vault を作成します。Bicep (ARM) からキーコンテナーを利用する場合、「--enabled-for-template-deployment true」のオプションを付与し作成します。サブスクリプションID、オブジェクトID、サービスプリンシパル名はEntra ID などで確認しておいてください。

# Key Vaultを作成する
az keyvault create \
    --name $KEY_VAULT_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --location $LOCATION \
    --enabled-for-template-deployment true

# ユーザーにKey Vault管理者のロールを付与する
# これが無いとポリシーの設定などでエラーとなる
az role assignment create \
    --assignee-object-id <Azure CLI実行ユーザーのオブジェクトID> \
    --role "Key Vault Administrator" \
    --scope "/subscriptions/<サブスクリプションID>/resourceGroups/rg-biceptest/providers/Microsoft.KeyVault/vaults/kv-biceptest"

# Key Vaultのアクセスポリシーを設定する
az keyvault set-policy \
  --upn <ユーザープリンシパル名> \
  --name $KEY_VAULT_NAME \
  --secret-permissions set delete get list

# Key Vaultにデータベースユーザー名、パスワードのシークレットを作成する
az keyvault secret set \
    --vault-name $KEY_VAULT_NAME \
    --name "sqlserveradmin" \
    --value "sqladmin"

az keyvault secret set \
    --vault-name $KEY_VAULT_NAME \
    --name "sqladminpassword" \
    --value "Wp@3h8-ge0Tc"

Bicep パラメーターファイルの作成

Key Vault の作成、シークレット作成後、Bicep パラメーターファイルを作成します。Bicep パラメーターファイルからKey Vault のシークレットを取得するにはgetSecret 関数を使い取得します。getSecret 関数では以下を指定します。シークレットのバージョンは省略可能なため、今回は省略して記載します。

  • サブスクリプションID
  • リソースグループ名
  • Key Vault 名
  • シークレット名
  • シークレットのバージョン (省略可能)
using 'main.bicep'

param location = 'japaneast'
param sqlServerName = 'sql-biceptest'
param sqlServerAdminLogin = getSecret('<サブスクリプションID>', 'rg-biceptest', 'kv-biceptest', 'sqlserveradmin')
param sqlServerAdminPassword = getSecret('<サブスクリプションID>', 'rg-biceptest', 'kv-biceptest', 'sqladminpassword')
param sqlDatabaseName = 'sqldb-biceptest'
param sqlDatabaseSkuName = {
  name: 'Standard'
  tier: 'Standard'
}

Bicep テンプレートファイルの作成

Bicep パラメーターファイル作成後、Azure SQL Database 用のBicep テンプレートファイルを作成します。

@description('Azureリソースのリージョン')
param location string

@description('SQL Server名')
param sqlServerName string

@description('SQL Serverのユーザー名')
@secure()
param sqlServerAdminLogin string

@description('SQL Serverのパスワード')
@secure()
param sqlServerAdminPassword string

@description('SQL Database名')
param sqlDatabaseName string

@description('SQL DatabaseのSKU名')
param sqlDatabaseSkuName object

resource sqlServer 'Microsoft.Sql/servers@2023-08-01-preview' = {
  name: sqlServerName
  location: location
  properties: {
    administratorLogin: sqlServerAdminLogin
    administratorLoginPassword: sqlServerAdminPassword
  }
}

resource sqlDatabase 'Microsoft.Sql/servers/databases@2023-08-01-preview' = {
  parent: sqlServer
  name: sqlDatabaseName
  location: location
  sku: sqlDatabaseSkuName
}

Bicep テンプレートファイルのデプロイ、確認

Bicep テンプレートファイル作成後、リソースグループにデプロイします。

# Bicepテンプレートファイルのデプロイ結果を確認する
az deployment group what-if --resource-group $RESOURCE_GROUP_NAME --template-file $TEMPLATE_FILE_NAME --parameters $PARAMETER_FILE_NAME

# リソースグループにデプロイする
az deployment group create --resource-group $RESOURCE_GROUP_NAME --template-file $TEMPLATE_FILE_NAME --parameters $PARAMETER_FILE_NAME

デプロイ後、該当リソースグループにAzure SQL Database が作成されたことを確認します。Azure Portal からSQL Server のFirewall で自身のIP アドレスを許可し、Azure SQL Database のクエリエディターからユーザー名、パスワードでログインできることを確認します。

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

動作確認後、リソースグループを削除します。今回はKey Vault が含まれているためリソースグループごと削除します。

# リソースグループを削除する
az group delete --resource-group $RESOURCE_GROUP_NAME

まとめ

  • Bicep のテンプレートファイルやパラメーターファイルではgetSecret 関数を使うことでAzure Key Vault からシークレットを取得できる
  • getSecret 関数ではサブスクリプションID、リソースグループ名、Key Vault 名、シークレット名、シークレットのバージョンを指定する

参考資料