管理 Azure 容器應用程式中的祕密
Azure 容器應用程式可讓您的應用程式安全地儲存敏感性組態值。 一旦祕密在應用程式層級定義,安全值即可供容器應用程式中的修訂版本使用。 此外,您還可以在級別規則內參考受保護的值。 如需將祕密與 Dapr 使用的資訊,請參閱 Dapr 整合。
- 秘密的適用範圍是應用程式,不包含應用程式的任何特定修訂版本。
- 新的修訂不會透過新增、移除或變更秘密來產生。
- 每個應用程式修訂版本都可以參考一或多個秘密。
- 多個修訂版本可以參考相同的秘密。
更新或刪除的秘密不會自動影響您應用程式中現有的修訂。 當秘密更新或刪除時,您可以使用下列兩種方式之一回應變更:
- 新增修訂版本。
- 重新啟動現有的修訂版本。
在刪除秘密之前,請先部署不再參考舊密碼的新修訂版本。 然後停用參考秘密的所有修訂。
定義秘密
祕密定義為一組名稱/值組。 每個祕密的值會直接指定,或指定為 Azure Key Vault 中儲存祕密的參考。
注意
避免直接在生產環境中指定秘密的值。 請改用 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
參數傳送的祕密物件。
$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
的環境變數。
參考 Key Vault 中的祕密
定義祕密時,您會建立 Azure Key Vault 中所儲存祕密的參考。 容器應用程式會自動從 Key Vault 擷取祕密值,並讓它可以在容器應用程式中當成祕密使用。
若要參考 Key Vault 中的祕密,您必須先在容器應用程式中啟用受控識別,並授與 Key Vault 祕密的身分識別存取權。
若在容器應用程式中啟用受控識別,請參閱受控識別。
若要授予 Key Vault 祕密的存取權,針對您所建立的受控識別在 Key Vault 中建立存取原則。 啟用此原則的 [取得] 祕密使用權限。
前往 Azure 入口網站的容器應用程式。
在「設定」區段下,選取「鎖定」。
在「系統指派」索引標籤中選取「開啟」。
選取「儲存」以啟用系統指派的受控識別。
在「設定」區段中,選取「祕密」。
選取新增。
在「新增祕密」窗格上,輸入下列資訊:
- 名稱:祕密名稱。
- 類型:選取「Key Vault 參考」。
- Key Vault 祕密 URL:Key Vault 中祕密的 URI。
- 身分識別:用來從 Key Vault 擷取祕密的身分識別。
選取 [新增]。
秘密的定義位於 resources.properties.configuration.secrets
區段中的應用程式層級。
"resources": [
{
...
"properties": {
"configuration": {
"secrets": [
{
"name": "queue-connection-string",
"keyVaultUrl": "<KEY-VAULT-SECRET-URI>",
"identity": "system"
}],
}
}
}
此處的 secrets
陣列中會宣告佇列儲存體帳戶的連接字串。 其值會使用指定的身分識別自動從 Key Vault 擷取。 若要使用使用者受控識別,請將 system
取代為身分識別的資源 ID。
將 <KEY-VAULT-SECRET-URI>
取代為 Key Vault 中的祕密 URI。
當您建立容器應用程式時,會使用 --secrets
參數來定義祕密。
- 此參數接受以空格分隔的名稱/值組集合。
- 等號 (
=
) 會分隔每個配對。
- 若要指定 Key Vault 參考,請使用格式
<SECRET_NAME>=keyvaultref:<KEY_VAULT_SECRET_URI>,identityref:<MANAGED_IDENTITY_ID>
。 例如: queue-connection-string=keyvaultref:https://mykeyvault.vault.azure.net/secrets/queuereader,identityref:/subscriptions/ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0/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>
取代為 Key Vault 中的祕密 URI。 將 <USER_ASSIGNED_IDENTITY_ID>
取代為使用者指派身分識別的資源 ID。
注意
使用者指派的身分識別必須具有在 Key Vault 中讀取祕密的存取權。 系統指派的身分識別無法與建立命令搭配使用,因為建立容器應用程式之後才可使用。
PowerShell 不支援祕密 Key Vault 參考。
Key Vault 祕密 URI 和祕密輪替
Key Vault 祕密 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"
},
"key_vault_secret_uri": {
"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",
"keyVaultUrl": "[parameters('key_vault_secret_uri')",
"identity": "system"
}]
},
"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 \
--user-assigned "<USER_ASSIGNED_IDENTITY_ID>" \
--secrets "queue-connection-string=keyvaultref:<KEY_VAULT_SECRET_URI>,identityref:<USER_ASSIGNED_IDENTITY_ID>" \
--env-vars "QueueName=myqueue" "ConnectionString=secretref:queue-connection-string"
在這裡,名為 connection-string
的環境變數會從應用層級 queue-connection-string
秘密取得其值。
PowerShell 不支援祕密 Key Vault 參考。
在此範例中,您會使用 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。
在掛接路徑下輸入 /mnt/secrets。
選取 [儲存]。
選取「建立」來建立磁碟區掛接的新修訂。
在此範例中,將會在應用程式等級宣告兩個祕密。 這些祕密會掛接在名為 Secret
類型的磁碟區 mysecrets
中。 請確定已在路徑 /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"
},
"key_vault_secret_uri": {
"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",
"keyVaultUrl": "[parameters('key_vault_secret_uri')",
"identity": "system"
},
{
"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
檔案名稱,只載入 mysecrets
磁碟區掛接中的 queue-connection-string
祕密。
{
"properties": {
...
"configuration": {
...
"secrets": [
{
"name": "queue-connection-string",
"keyVaultUrl": "[parameters('key_vault_secret_uri')",
"identity": "system"
},
{
"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
的檔案讀取祕密。
在此範例中,將會在應用程式等級宣告兩個祕密。 這些祕密會掛接在名為 Secret
類型的磁碟區 mysecrets
中。 請確定已在路徑 /mnt/secrets
掛接磁碟區。 然後,應用程式可以將祕密讀取為參考磁碟區掛接中的檔案。
az containerapp create \
--resource-group "my-resource-group" \
--name myQueueApp \
--environment "my-environment-name" \
--image demos/myQueueApp:v1 \
--user-assigned "<USER_ASSIGNED_IDENTITY_ID>" \
--secrets "queue-connection-string=keyvaultref:<KEY_VAULT_SECRET_URI>,identityref:<USER_ASSIGNED_IDENTITY_ID>" "api-key=$API_KEY" \
--secret-volume-mount "/mnt/secrets"
若要載入特定祕密,並在掛接的磁碟區內指定其路徑,請使用 YAML 定義您的應用程式。
下一步