在 ARM 模板中检索当前版本的秘密
Retrieving current version in ARM template for secret
我得到了这个名为 "StorageConnectionString" 的秘密,它从 ARM 插入到我的 Key Vault 中:
{
"type": "Microsoft.KeyVault/vaults/secrets",
"name": "[concat(variables('keyVaultName-v'),'/','StorageConnectionString')]",
"apiVersion": "2018-02-14",
"properties": {
"contentType": "text/plain",
"value": "OmittedStorageConntionString"
},
"dependsOn": [
"[resourceId('Microsoft.KeyVault/vaults', variables('keyVaultName-v'))]"
]
}
有什么方法可以从 ARM 引用并获取插入的密钥的当前版本(或只是版本 ID)的 url?我想从此处提到的环境变量中引用它:"Sourcing Application Settings from Key Vault" 部分下的 https://azure.microsoft.com/en-us/blog/simplifying-security-for-serverless-and-web-apps-with-azure-functions-and-app-service/。我想在我的 Azure 函数中设置环境设置 @Microsoft.KeyVault(SecretUri=secret_uri_with_version)
。
如果这不可能,是否有另一种方法来设置连接字符串?
这个问题是我最后的选择,就在我发布这个之后,我在这里找到了答案:https://docs.microsoft.com/en-us/azure/app-service/app-service-key-vault-references#reference-syntax(在文档中)"[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('storageConnectionStringResourceId')).secretUriWithVersion, ')')]"
.
编辑
按照前面提到的 i,您实际上可以在 ARM 模板中引用秘密,并获得 url 到包含版本的秘密。
创建密文:
{
"type": "Microsoft.KeyVault/vaults/secrets",
"name": "[concat(variables('keyVaultName-v'),'/', variables('queueStorageConnectionStringSecretName-v'))]",
"apiVersion": "2018-02-14",
"properties": {
"value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('queueStorageName-v'), ';AccountKey=', listKeys(variables('storageAccountResourceId'),'2015-05-01-preview').key1)]"
}
然后你可以在你的函数应用程序中引用它
{
"name": "StorageQueueConnectionString",
"value": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('queueStorageConnectionStringSecretNameResourceId-v')).secretUriWithVersion, ')')]"
}
然后,在您的函数中,您可以在绑定中引用 StorageQueueConnectionString
[Queue("queueName", Connection ="StorageQueueConnectionString")]
ICollector<string> outputQueueItem
这样,您就不必在环境变量(或代码)中引用连接字符串,使您的应用程序更加安全。此示例需要函数应用程序和保管库之间的系统分配(或用户分配)标识。我目前正在尝试跳出保险库,并且我制作了一些可以在此处找到的代码:https://github.com/mslot/Microservices。代码不漂亮!我正在尝试很多与密钥保管库和不同 Azure 实体之间的绑定相关的事情。
外部编辑:
您必须使用秘密的完整 resourceId:
resourceId('sub','rg','Microsoft.KeyVault/vaults/secrets','vault_name','secret_name')
要重现的最小模板:
{
"$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [],
"outputs": {
"collection": {
"type": "string",
"value": "[reference('/subscriptions/xxx/resourceGroups/yyy/providers/Microsoft.KeyVault/vaults/zzz/secrets/www', '2018-02-14').secretUriWithVersion]"
}
}
}
接受的答案是正确的,但我根本不想将版本号硬编码到我的应用程序设置中——这似乎违背了集中秘密管理的目的。
为避免这种情况,不使用 .secretUriWithVersion
,而是使用 .secretUri
的 属性
完整用法:
"value": "[concat('@Microsoft.KeyVault(SecretUri=', reference(resourceId(resourceGroup().name, 'Microsoft.KeyVault/vaults/secrets', variables('keyVaultName'), 'mySecretName'), '2015-06-01').secretUri, ')')]"
我得到了这个名为 "StorageConnectionString" 的秘密,它从 ARM 插入到我的 Key Vault 中:
{
"type": "Microsoft.KeyVault/vaults/secrets",
"name": "[concat(variables('keyVaultName-v'),'/','StorageConnectionString')]",
"apiVersion": "2018-02-14",
"properties": {
"contentType": "text/plain",
"value": "OmittedStorageConntionString"
},
"dependsOn": [
"[resourceId('Microsoft.KeyVault/vaults', variables('keyVaultName-v'))]"
]
}
有什么方法可以从 ARM 引用并获取插入的密钥的当前版本(或只是版本 ID)的 url?我想从此处提到的环境变量中引用它:"Sourcing Application Settings from Key Vault" 部分下的 https://azure.microsoft.com/en-us/blog/simplifying-security-for-serverless-and-web-apps-with-azure-functions-and-app-service/。我想在我的 Azure 函数中设置环境设置 @Microsoft.KeyVault(SecretUri=secret_uri_with_version)
。
如果这不可能,是否有另一种方法来设置连接字符串?
这个问题是我最后的选择,就在我发布这个之后,我在这里找到了答案:https://docs.microsoft.com/en-us/azure/app-service/app-service-key-vault-references#reference-syntax(在文档中)"[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('storageConnectionStringResourceId')).secretUriWithVersion, ')')]"
.
编辑 按照前面提到的 i,您实际上可以在 ARM 模板中引用秘密,并获得 url 到包含版本的秘密。
创建密文:
{
"type": "Microsoft.KeyVault/vaults/secrets",
"name": "[concat(variables('keyVaultName-v'),'/', variables('queueStorageConnectionStringSecretName-v'))]",
"apiVersion": "2018-02-14",
"properties": {
"value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('queueStorageName-v'), ';AccountKey=', listKeys(variables('storageAccountResourceId'),'2015-05-01-preview').key1)]"
}
然后你可以在你的函数应用程序中引用它
{
"name": "StorageQueueConnectionString",
"value": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('queueStorageConnectionStringSecretNameResourceId-v')).secretUriWithVersion, ')')]"
}
然后,在您的函数中,您可以在绑定中引用 StorageQueueConnectionString
[Queue("queueName", Connection ="StorageQueueConnectionString")]
ICollector<string> outputQueueItem
这样,您就不必在环境变量(或代码)中引用连接字符串,使您的应用程序更加安全。此示例需要函数应用程序和保管库之间的系统分配(或用户分配)标识。我目前正在尝试跳出保险库,并且我制作了一些可以在此处找到的代码:https://github.com/mslot/Microservices。代码不漂亮!我正在尝试很多与密钥保管库和不同 Azure 实体之间的绑定相关的事情。
外部编辑:
您必须使用秘密的完整 resourceId:
resourceId('sub','rg','Microsoft.KeyVault/vaults/secrets','vault_name','secret_name')
要重现的最小模板:
{
"$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [],
"outputs": {
"collection": {
"type": "string",
"value": "[reference('/subscriptions/xxx/resourceGroups/yyy/providers/Microsoft.KeyVault/vaults/zzz/secrets/www', '2018-02-14').secretUriWithVersion]"
}
}
}
接受的答案是正确的,但我根本不想将版本号硬编码到我的应用程序设置中——这似乎违背了集中秘密管理的目的。
为避免这种情况,不使用 .secretUriWithVersion
,而是使用 .secretUri
完整用法:
"value": "[concat('@Microsoft.KeyVault(SecretUri=', reference(resourceId(resourceGroup().name, 'Microsoft.KeyVault/vaults/secrets', variables('keyVaultName'), 'mySecretName'), '2015-06-01').secretUri, ')')]"