管理 Azure 容器應用程式中的祕密
Azure 容器應用程式可讓您的應用程式安全地儲存敏感性組態值。 一旦在應用層級定義秘密,安全值即可用於容器應用程式中的修訂。 此外,您可以在縮放規則內參考受保護的值。 如需搭配 Dapr 使用秘密的資訊,請參閱 Dapr 整合 。
- 秘密的適用範圍是應用程式,不包含應用程式的任何特定修訂版本。
- 新增、移除或變更秘密不會產生新的修訂。
- 每個應用程式修訂版本都可以參考一或多個秘密。
- 多個修訂版本可以參考相同的秘密。
更新或刪除的秘密不會自動影響您應用程式中現有的修訂。 當秘密更新或刪除時,您可以使用下列兩種方式之一回應變更:
- 新增修訂版本。
- 重新啟動現有的修訂版本。
在刪除秘密之前,請先部署不再參考舊密碼的新修訂版本。 然後停用參考秘密的所有修訂。
定義秘密
秘密會定義為一組名稱/值組。 每個秘密的值會直接指定或指定為儲存在 Azure 金鑰保存庫 中的秘密參考。
在 Container Apps 中儲存秘密值
當您透過入口網站或透過不同的命令列選項定義秘密時。
移至Azure 入口網站 中的 容器應用程式。
在 [設定] 區段底下 ,選取 [ 秘密 ]。
選取新增。
在 [ 新增秘密 內容] 窗格中,輸入下列資訊:
- 名稱 :秘密的名稱。
- 類型 :選取 [容器應用程式秘密 ]。
- 值 :秘密的值。
選取新增。
秘密定義于 區段中應用層級 resources.properties.configuration.secrets
。
"resources": [
{
...
"properties": {
"configuration": {
"secrets": [
{
"name": "queue-connection-string",
"value": "<MY-CONNECTION-STRING-VALUE>"
}],
}
}
}
在這裡,佇列儲存體帳戶的連接字串會在陣列中 secrets
宣告。 在此範例中,您會將 取代 <MY-CONNECTION-STRING-VALUE>
為 連接字串 的值。
當您建立容器應用程式時,會使用 --secrets
參數來定義祕密。
- 此參數接受以空格分隔的名稱/值組集合。
- 每一對都是以等號分隔 (
=
)。
az containerapp create \
--resource-group "my-resource-group" \
--name queuereader \
--environment "my-environment-name" \
--image demos/queuereader:v1 \
--secrets "queue-connection-string=<CONNECTION_STRING>"
在這裡,佇列儲存體帳戶的連接字串會在 參數中 --secrets
宣告。 將 取代 <CONNECTION_STRING>
為您連接字串的值。
當您建立容器應用程式時,秘密會定義為一或多個透過 參數傳遞的 ConfigurationSecrets
Secret 物件。
$EnvId = (Get-AzContainerAppManagedEnv -ResourceGroupName my-resource-group -EnvName my-environment-name).Id
$TemplateObj = New-AzContainerAppTemplateObject -Name queuereader -Image demos/queuereader:v1
$SecretObj = New-AzContainerAppSecretObject -Name queue-connection-string -Value $QueueConnectionString
$ContainerAppArgs = @{
Name = 'my-resource-group'
Location = '<location>'
ResourceGroupName = 'my-resource-group'
ManagedEnvironmentId = $EnvId
TemplateContainer = $TemplateObj
ConfigurationSecret = $SecretObj
}
New-AzContainerApp @ContainerAppArgs
在此,會宣告佇列儲存體帳戶的連接字串。 的值 queue-connection-string
來自名為 $QueueConnectionString
的環境變數。
參考來自金鑰保存庫的秘密
當您定義秘密時,您會建立 Azure 金鑰保存庫中所儲存秘密的參考。 Container Apps 會自動從金鑰保存庫擷取秘密值,並讓它成為容器應用程式中的秘密。
若要參考來自金鑰保存庫的秘密,您必須先在容器應用程式中啟用受控識別,並授與金鑰保存庫秘密的身分識別存取權。
若要在容器應用程式中啟用受控識別,請參閱 受控識別 。
若要授與金鑰保存庫秘密的存取權, 請在 金鑰保存庫中為您所建立的受控識別建立存取 原則。 啟用此原則的「取得」秘密許可權。
移至Azure 入口網站 中的 容器應用程式。
在 [設定] 區段底下 ,選取 [ 身分 識別]。
在 [ 系統指派] 索引 標籤中,選取 [ 開啟 ]。
選取 [ 儲存 ] 以啟用系統指派的受控識別。
在 [設定] 區段底下 ,選取 [ 秘密 ]。
選取新增。
在 [ 新增秘密 內容] 窗格中,輸入下列資訊:
- 名稱 :秘密的名稱。
- 類型 :選取 金鑰保存庫參考 。
- 金鑰保存庫秘密 URL :金鑰保存庫中秘密的 URI。
- 身分 識別:用來從金鑰保存庫擷取秘密的身分識別。
選取新增。
秘密定義于 區段中應用層級 resources.properties.configuration.secrets
。
"resources": [
{
...
"properties": {
"configuration": {
"secrets": [
{
"name": "queue-connection-string",
"keyVaultUrl": "<KEY-VAULT-SECRET-URI>",
"identity": "system"
}],
}
}
}
在這裡,佇列儲存體帳戶的連接字串會在陣列中 secrets
宣告。 使用指定的身分識別,其值會自動從金鑰保存庫擷取。 若要使用使用者受控識別,請將 取代 system
為身分識別的資源識別碼。
將 取代 <KEY-VAULT-SECRET-URI>
為 金鑰保存庫 中秘密的 URI。
當您建立容器應用程式時,會使用 --secrets
參數來定義祕密。
- 此參數接受以空格分隔的名稱/值組集合。
- 每一對都是以等號分隔 (
=
)。
- 若要指定金鑰保存庫參考,請使用 格式
<SECRET_NAME>=keyvaultref:<KEY_VAULT_SECRET_URI>,identityref:<MANAGED_IDENTITY_ID>
。 例如: queue-connection-string=keyvaultref:https://mykeyvault.vault.azure.net/secrets/queuereader,identityref:/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/my-resource-group/providers/Microsoft.ManagedIdentity/userAssignedIdentities/my-identity
。
az containerapp create \
--resource-group "my-resource-group" \
--name queuereader \
--environment "my-environment-name" \
--image demos/queuereader:v1 \
--user-assigned "<USER_ASSIGNED_IDENTITY_ID>" \
--secrets "queue-connection-string=keyvaultref:<KEY_VAULT_SECRET_URI>,identityref:<USER_ASSIGNED_IDENTITY_ID>"
在這裡,佇列儲存體帳戶的連接字串會在 參數中 --secrets
宣告。 將 取代 <KEY_VAULT_SECRET_URI>
為 金鑰保存庫 中秘密的 URI。 將 取代 <USER_ASSIGNED_IDENTITY_ID>
為使用者指派身分識別的資源識別碼。 針對系統指派的身分識別,請使用 system
而不是資源識別碼。
注意
使用者指派的身分識別必須具有讀取金鑰保存庫秘密的存取權。 系統指派的身分識別無法與 create 命令搭配使用,因為建立容器應用程式之後才能使用。
PowerShell 不支援金鑰保存庫參考的秘密。
金鑰保存庫秘密 URI 和秘密輪替
金鑰保存庫秘密 URI 必須具有下列其中一種格式:
https://myvault.vault.azure.net/secrets/mysecret/ec96f02080254f109c51a1f14cdb1931
:參考特定版本的秘密。
https://myvault.vault.azure.net/secrets/mysecret
:參考最新版本的秘密。
如果未在 URI 中指定版本,則應用程式會使用金鑰保存庫中存在的最新版本。 當較新版本可用時,應用程式會在 30 分鐘內自動擷取最新版本。 參考環境變數中秘密的任何使用中修訂都會自動重新開機,以挑選新的值。
若要完整控制使用哪一個秘密版本,請在 URI 中指定版本。
參考環境變數中的秘密
如定義秘密一節所述 ,在應用層級宣告秘密 之後,您可以在容器應用程式中建立新的修訂時,在環境變數中參考它們。 當環境變數參考秘密時,其值會以秘密中定義的值填入。
範例
下列範例展示在應用層級宣告連接字串的應用程式。 此連接會在容器環境變數和縮放規則中參考。
在容器應用程式中定義秘密 之後,您可以在建立新的修訂時,在環境變數中參考它。
移至Azure 入口網站 中的 容器應用程式。
開啟 [ 修訂管理 ] 頁面。
選取 [ 建立新修訂 ]。
在 [ 建立及部署新的修訂 ] 頁面中,選取容器。
在 [ 環境變數] 區段中,選取 [ 新增 ]。
輸入下列資訊:
- 名稱 :環境變數的名稱。
- 來源 :選取 [參考秘密 ]。
- 值 :選取您想要參考的秘密。
選取 [儲存]。
選取 [建立] 以建立新的修訂。
在此範例中,應用程式連接字串會宣告為 queue-connection-string
,並可在組態區段中的其他地方使用。
{
"$schema": "https://schema.management.azure.com/schemas/2019-08-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"location": {
"type": "String"
},
"environment_id": {
"type": "String"
},
"queue-connection-string": {
"type": "String"
}
},
"variables": {},
"resources": [
{
"name": "queuereader",
"type": "Microsoft.App/containerApps",
"apiVersion": "2022-03-01",
"kind": "containerapp",
"location": "[parameters('location')]",
"properties": {
"managedEnvironmentId": "[parameters('environment_id')]",
"configuration": {
"activeRevisionsMode": "single",
"secrets": [
{
"name": "queue-connection-string",
"value": "[parameters('queue-connection-string')]"
}]
},
"template": {
"containers": [
{
"image": "myregistry/myQueueApp:v1",
"name": "myQueueApp",
"env": [
{
"name": "QueueName",
"value": "myqueue"
},
{
"name": "ConnectionString",
"secretRef": "queue-connection-string"
}
]
}
],
"scale": {
"minReplicas": 0,
"maxReplicas": 10,
"rules": [
{
"name": "myqueuerule",
"azureQueue": {
"queueName": "demoqueue",
"queueLength": 100,
"auth": [
{
"secretRef": "queue-connection-string",
"triggerParameter": "connection"
}
]
}
}
]
}
}
}
}]
}
在這裡,名為 connection-string
的環境變數會從應用層級 queue-connection-string
秘密取得其值。 此外,Azure 佇列儲存體調整規則的驗證組態會 queue-connection-string
使用秘密來定義其連線。
若要避免使用 ARM 範本將秘密值認可至原始檔控制,請將秘密值傳遞為 ARM 範本參數。
在此範例中,您會使用 Azure CLI 建立容器應用程式,其中包含環境變數中所參考的秘密。 若要參考 Azure CLI 中環境變數中的秘密,請將其值設定為 secretref:
,後面接續秘密的名稱。
az containerapp create \
--resource-group "my-resource-group" \
--name myQueueApp \
--environment "my-environment-name" \
--image demos/myQueueApp:v1 \
--secrets "queue-connection-string=$CONNECTIONSTRING" \
--env-vars "QueueName=myqueue" "ConnectionString=secretref:queue-connection-string"
在這裡,名為 connection-string
的環境變數會從應用層級 queue-connection-string
秘密取得其值。
在此範例中,您會使用 Azure PowerShell 建立容器,其中包含環境變數中所參考的秘密。 若要在 PowerShell 中參考環境變數中的秘密,請將其值設定為 secretref:
,後面接著秘密的名稱。
$EnvId = (Get-AzContainerAppManagedEnv -ResourceGroupName my-resource-group -EnvName my-environment-name).Id
$SecretObj = New-AzContainerAppSecretObject -Name queue-connection-string -Value $QueueConnectionString
$EnvVarObjQueue = New-AzContainerAppEnvironmentVarObject -Name QueueName -Value myqueue
$EnvVarObjConn = New-AzContainerAppEnvironmentVarObject -Name ConnectionString -SecretRef queue-connection-string -Value secretref
$TemplateObj = New-AzContainerAppTemplateObject -Name myQueueApp -Image demos/myQueueApp:v1 -Env $EnvVarObjQueue, $EnvVarObjConn
$ContainerAppArgs = @{
Name = 'myQueueApp'
Location = '<location>'
ResourceGroupName = 'my-resource-group'
ManagedEnvironmentId = $EnvId
TemplateContainer = $TemplateObj
ConfigurationSecret = $SecretObj
}
New-AzContainerApp @ContainerAppArgs
在這裡,名為 ConnectionString
的環境變數會從應用層級 $QueueConnectionString
秘密取得其值。
在磁片區中掛接秘密
如定義秘密一節所述 ,在應用層級宣告秘密 之後,您可以在容器應用程式中建立新的修訂時,在磁片區掛接中參考它們。 當您在磁片區中掛接秘密時,每個秘密都會掛接為磁片區中的檔案。 檔案名是秘密的名稱,而檔案內容則是秘密的值。 您可以在磁片區掛接中載入所有秘密,也可以載入特定秘密。
範例
在容器應用程式中定義秘密 之後,您可以在建立新的修訂時,在磁片區掛接中參考它。
移至Azure 入口網站 中的 容器應用程式。
開啟 [ 修訂管理 ] 頁面。
選取 [ 建立新修訂 ]。
在 [ 建立及部署新的修訂 ] 頁面中。
選取容器,然後選取 [ 編輯 ]。
在 [ 磁片區掛接] 區段中,展開 [ 秘密] 區 段。
選取 [ 建立新的磁片區 ]。
輸入下列資訊:
- 名稱 :mysecrets
- 掛接 所有秘密:已啟用
注意
如果您想要載入特定秘密,請停用 掛接所有秘密 ,然後選取您想要載入的秘密。
選取新增。
在 [磁片區名稱] 底下 ,選取 [mysecrets ]。
在 [掛接路徑] 下 ,輸入 /mnt/secrets 。
選取 [儲存]。
選取 [建立 ] 以建立具有磁片區掛接的新修訂。
在此範例中,會在應用層級宣告兩個秘密。 這些秘密會掛接在名為 mysecrets
類型的 Secret
磁片區中。 磁片區會掛接在路徑 /mnt/secrets
上。 然後,應用程式可以參考磁片區掛接中的秘密。
{
"$schema": "https://schema.management.azure.com/schemas/2019-08-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"location": {
"type": "String"
},
"environment_id": {
"type": "String"
},
"queue-connection-string": {
"type": "Securestring"
},
"api-key": {
"type": "Securestring"
}
},
"variables": {},
"resources": [
{
"name": "queuereader",
"type": "Microsoft.App/containerApps",
"apiVersion": "2022-11-01-preview",
"kind": "containerapp",
"location": "[parameters('location')]",
"properties": {
"managedEnvironmentId": "[parameters('environment_id')]",
"configuration": {
"activeRevisionsMode": "single",
"secrets": [
{
"name": "queue-connection-string",
"value": "[parameters('queue-connection-string')]"
},
{
"name": "api-key",
"value": "[parameters('api-key')]"
}
]
},
"template": {
"containers": [
{
"image": "myregistry/myQueueApp:v1",
"name": "myQueueApp",
"volumeMounts": [
{
"name": "mysecrets",
"mountPath": "/mnt/secrets"
}
]
}
],
"volumes": [
{
"name": "mysecrets",
"storageType": "Secret"
}
]
}
}
}]
}
若要載入特定秘密,並在掛接的磁片區內指定其路徑,您可以在磁片區物件的陣列中 secrets
定義秘密。 下列範例示範如何使用 的檔案名 connection-string.txt
,只 queue-connection-string
載入磁片區掛接中的 mysecrets
秘密。
{
"properties": {
...
"configuration": {
...
"secrets": [
{
"name": "queue-connection-string",
"value": "[parameters('queue-connection-string')]"
},
{
"name": "api-key",
"value": "[parameters('api-key')]"
}
]
},
"template": {
"containers": [
{
"image": "myregistry/myQueueApp:v1",
"name": "myQueueApp",
"volumeMounts": [
{
"name": "mysecrets",
"mountPath": "/mnt/secrets"
}
]
}
],
"volumes": [
{
"name": "mysecrets",
"storageType": "Secret",
"secrets": [
{
"secretRef": "queue-connection-string",
"path": "connection-string.txt"
}
]
}
]
}
...
}
...
}
在您的應用程式中,您可以從位於 /mnt/secrets/connection-string.txt
的檔案讀取秘密。
在此範例中,會在應用層級宣告兩個秘密。 這些秘密會掛接在名為 mysecrets
類型的 Secret
磁片區中。 磁片區會掛接在路徑 /mnt/secrets
上。 然後,應用程式可以將秘密讀取為磁片區掛接中的檔案。
az containerapp create \
--resource-group "my-resource-group" \
--name myQueueApp \
--environment "my-environment-name" \
--image demos/myQueueApp:v1 \
--secrets "queue-connection-string=$CONNECTIONSTRING" "api-key=$API_KEY" \
--secret-volume-mount "/mnt/secrets"
若要載入特定秘密,並在掛接的磁片區內指定其路徑,請使用 YAML 定義您的應用程式。
下一步