Azure 儲存體支援對容器和 Blob 的選擇性匿名公用讀取存取。 根據預設,對您的資料進行匿名存取是永遠不允許的。 除非您明確啟用匿名存取,否則對容器及其 Blob 的所有要求都必須獲得授權。 當您將容器的公用存取層級設定為允許匿名存取時,用戶端不經授權要求即可讀取該容器中的資料。
警告
當容器設定為公用存取時,任何用戶端都可以讀取該容器中的資料。 公用存取會帶來潛在的安全性風險,因此,如果您的案例不需要公用存取,Microsoft 建議您不允許儲存體帳戶的公用存取。 如需詳細資訊,請參閱防止對容器和 Blob 的匿名公用讀取存取。
本文說明如何設定容器及其 Blob 的匿名公用讀取存取權限。 如需有關如何從用戶端應用程式匿名存取 Blob 資料的詳細資訊,請參閱使用 .Net 匿名存取公用容器和 Blob。
關於匿名公用讀取存取權限
根據預設,公用存取您的資料是一律禁止的。 有兩項不同的設定會影響公用存取:
- 允許儲存體帳戶的公用存取。 根據預設,儲存體帳戶允許具有適當權限的使用者啟用容器的公用存取。 除非使用者採取額外步驟來明確設定容器的公用存取設定,否則 Blob 資料不可供公用存取。
- 設定容器的公用存取設定。 根據預設,容器的公用存取是停用的,這表示每個對容器或其資料的要求都需要授權。 只在允許儲存體帳戶進行匿名存取時,具有適當權限的使用者才可以修改容器的公用存取設定以啟用匿名存取。
下表摘要說明這兩項設定如何共同影響容器的公用存取。
|
容器的公用存取層級設定為私用 (預設設定) |
容器的公用存取層級設定為容器 |
容器的公用存取層級設定為 Blob |
| 儲存體帳戶不允許公用存取 |
沒有對儲存體帳戶中任何容器的公用存取權。 |
沒有對儲存體帳戶中任何容器的公用存取權。 儲存體帳戶設定會覆寫容器設定。 |
沒有對儲存體帳戶中任何容器的公用存取權。 儲存體帳戶設定會覆寫容器設定。 |
| 允許儲存體帳戶的公用存取 (預設設定) |
沒有對此容器的公用存取權 (預設設定)。 |
允許對此容器及其 Blob 的公用存取。 |
允許公用存取此容器中的 Blob,但無法存取容器本身。 |
當匿名公用存取獲允許用於儲存體帳戶且針對特定容器進行設定,則讀取該容器中 Blob 的要求會以無 Authorization 標頭的方式傳遞,服務會接受要求,在回應中傳回 Blob 的資料。
允許或不允許儲存體帳戶的公用讀取存取權限
根據預設,儲存體帳戶設定為允許具有適當權限的使用者啟用容器的公用存取。 允許公開存取時,具有適當權限的使用者可以修改容器的公用存取設定,以啟用對該容器中資料的匿名公用存取權。 除非使用者採取額外步驟來明確設定容器的公用存取設定,否則 Blob 資料絕不可供公用存取。
請記住,容器的公用存取一律預設為關閉,若要允許匿名要求就必須進行明確設定。 無論儲存體帳戶上的設定為何,除非具有適當權限的使用者採用此額外步驟來啟用容器的公用存取,否則您的資料永遠不會提供公開存取。
不允許該儲存體帳戶的公用存取會防止對該帳戶中所有容器和 Blob 的匿名存取。 當帳戶不允許公用存取時,您無法設定容器的公用存取設定來允許匿名存取。 為了改善安全性,除非您的案例要求使用者匿名存取 Blob 資源,否則 Microsoft 建議您不要允許對您儲存體帳戶的公用存取。
重要
不允許儲存體帳戶的公用存取會覆寫該儲存體帳戶中所有容器的公用存取設定。 當儲存體帳戶不允許公用存取時,對該帳戶的任何未來匿名要求都將會失敗。 變更此設定之前,請務必了解這可能會對匿名存取您儲存體帳戶中資料的用戶端應用程式造成什麼影響。 如需詳細資訊,請參閱防止對容器和 Blob 的匿名公用讀取存取。
若要允許或不允許儲存體帳戶的公用存取,請設定帳戶的 AllowBlobPublicAccess 屬性。 此屬性適用於使用 Azure Resource Manager 部署模型建立的所有儲存體帳戶。 如需詳細資訊,請參閱儲存體帳戶概觀。
預設不會針對儲存體帳戶設定 AllowBlobPublicAccess 屬性,而且在您明確設定此屬性之前,不會傳回任何值。 當屬性值為 null 或 true 時,儲存體帳戶允許公用存取。
若要允許或不允許 Azure 入口網站中儲存體帳戶的公用存取,請遵循下列步驟:
在 Azure 入口網站中巡覽至您的儲存體帳戶。
尋找設定底下的組態設定。
將 Blob 公用存取設定為已啟用或已停用。
若要允許或不允許使用 PowerShell 對儲存體帳戶進行公用存取,請安裝 Azure PowerShell 4.4.0 版或更新版本。 接下來,為新的或現有的儲存體帳戶設定 AllowBlobPublicAccess 屬性。
下列範例會建立儲存體帳戶,並明確將 AllowBlobPublicAccess 屬性設定為 true。 然後會更新儲存體帳戶,以將 AllowBlobPublicAccess 屬性設定為 false。 此範例也會在每個案例中擷取屬性值。 請記得使用您自己的值來取代括弧中的預留位置值:
$rgName = "<resource-group>"
$accountName = "<storage-account>"
$location = "<location>"
# Create a storage account with AllowBlobPublicAccess set to true (or null).
New-AzStorageAccount -ResourceGroupName $rgName `
-Name $accountName `
-Location $location `
-SkuName Standard_GRS `
-AllowBlobPublicAccess $false
# Read the AllowBlobPublicAccess property for the newly created storage account.
(Get-AzStorageAccount -ResourceGroupName $rgName -Name $accountName).AllowBlobPublicAccess
# Set AllowBlobPublicAccess set to false
Set-AzStorageAccount -ResourceGroupName $rgName `
-Name $accountName `
-AllowBlobPublicAccess $false
# Read the AllowBlobPublicAccess property.
(Get-AzStorageAccount -ResourceGroupName $rgName -Name $accountName).AllowBlobPublicAccess
若要允許或不允許使用 Azure CLI 對儲存體帳戶進行公用存取,請安裝 Azure CLI 2.9.0 版或更新版本。 如需詳細資訊,請參閱 安裝 Azure CLI。 接下來,為新的或現有的儲存體帳戶設定 allowBlobPublicAccess 屬性。
下列範例會建立儲存體帳戶,並明確將 allowBlobPublicAccess 屬性設定為 true。 然後會更新儲存體帳戶,以將 allowBlobPublicAccess 屬性設定為 false。 此範例也會在每個案例中擷取屬性值。 請記得使用您自己的值來取代括弧中的預留位置值:
az storage account create \
--name <storage-account> \
--resource-group <resource-group> \
--kind StorageV2 \
--location <location> \
--allow-blob-public-access true
az storage account show \
--name <storage-account> \
--resource-group <resource-group> \
--query allowBlobPublicAccess \
--output tsv
az storage account update \
--name <storage-account> \
--resource-group <resource-group> \
--allow-blob-public-access false
az storage account show \
--name <storage-account> \
--resource-group <resource-group> \
--query allowBlobPublicAccess \
--output tsv
若要允許或不允許對具有範本的儲存體帳戶公用存取,請建立範本,並將 AllowBlobPublicAccess 屬性設定為 true 或 false。 下列步驟描述如何在 Azure 入口網站中建立範本。
在 Azure 入口網站中,選擇 [建立資源]。
在 [搜尋 Marketplace] 中,輸入範本部署,然後按 ENTER。
選擇 [範本部署 (使用自訂範本部署) (預覽)],選擇 [建立],然後選擇 [在編輯器中建置您自己的範本]。
在範本編輯器中,貼上下列 JSON 以建立新的帳戶,並將 AllowBlobPublicAccess 屬性設定為 true 或 false。 請記得以您自己的值取代角括弧中的預留位置。
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {},
"variables": {
"storageAccountName": "[concat(uniqueString(subscription().subscriptionId), 'template')]"
},
"resources": [
{
"name": "[variables('storageAccountName')]",
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2019-06-01",
"location": "<location>",
"properties": {
"allowBlobPublicAccess": false
},
"dependsOn": [],
"sku": {
"name": "Standard_GRS"
},
"kind": "StorageV2",
"tags": {}
}
]
}
儲存範本。
指定資源群組參數,然後選擇 [檢閱 + 建立] 按鈕來部署範本,並建立已設定 allowBlobPublicAccess 屬性的儲存體帳戶。
注意
不允許儲存體帳戶的公用存取不會影響該儲存體帳戶中裝載的任何靜態網站。 $web容器一律可以公開存取。
在您更新儲存體帳戶的公開存取設定之後,最多可能需要 30 秒的時間,變更才會完全傳播。
當容器設定為匿名公用存取時,讀取該容器中 Blob 的要求不需要獲得授權。 不過,針對儲存體帳戶設定的任何防火牆規則仍有效,而且會封鎖匿名流量。
允許或不允許 Blob 公用存取需要 Azure 儲存體資源提供者的 2019-04-01 版或更新版本。 如需詳細資訊,請參閱 Azure 儲存體資源提供者 REST API。
本節中的範例示範如何藉由讀取儲存體帳戶的 AllowBlobPublicAccess 屬性以判斷目前允許或不允許公用存取。 若要深入了解如何確認帳戶的公用存取設定是否已設定為防止匿名存取,請參閱 補救匿名公用存取。
設定容器的公用存取層級
若要為匿名使用者提供容器及其 Blob 的讀取存取權,請先允許儲存體帳戶的公用存取,然後設定容器的公用存取層級。 如果存取儲存體帳戶的公用存取遭到拒絕,您將無法設定容器的公用存取。
當儲存體帳戶的公用存取受到允許時,您可以為容器設定下列權限:
- 無公用讀取權限︰只能以授權的要求來存取容器和其 Blob。 此選項是所有新建容器的預設選項。
- 僅對 Blob 有公用讀取權限:您可以透過匿名要求讀取容器內的 Blob,但您無法匿名使用容器資料。 匿名用戶端無法列舉容器內的 Blob。
- 容器及其 Blob 的公用讀取存取權限:匿名要求可以讀取除了容器權限設定和容器中繼資料以外的容器和 Blob 資料。 用戶端可以透過匿名要求列舉容器內的 Blob,但無法列舉儲存體帳戶內的容器。
您無法變更個別 Blob 的公用存取層級。 公用存取層級只會在容器層級上進行設定。 您可以在建立容器時設定容器的公用存取層級,也可以更新現有容器上的設定。
若要更新 Azure 入口網站中一或多個現有容器的公用存取層級,請遵循下列步驟:
在 Azure 入口網站中巡覽至您的儲存體帳戶概觀。
在 [資料存放區] 底下的功能表刀鋒視窗上選取 [Blob 容器]。
選取您要設定公用存取層級的容器。
使用 [變更存取層級] 按鈕以顯示公用存取設定。
從 [公用存取層級] 下拉式清單中選取所需的公用存取層級,然後按一下 [確定] 按鈕,將變更套用至選取的容器。
當儲存體帳戶的公用存取不受允許時,無法設定容器的公用存取層級。 如果您嘗試設定容器的公用存取層級,您會看到設定已停用,因為帳戶的公用存取不受允許。
若要使用 PowerShell 來更新一或多個容器的公用存取層級,請呼叫 Set-AzStorageContainerAcl 命令。 將您的帳戶金鑰、連接字串或共用存取簽章 (SAS) 傳入,以授權這項作業。 設定容器公用存取層級的設定容器 ACL 作業不支援 Azure AD 的授權。 如需詳細資訊,請參閱呼叫 Blob 和佇列資料作業的權限。
下列範例會建立公用存取已停用的容器,然後更新容器的公用存取設定,以允許匿名存取容器及其 Blob。 請記得使用您自己的值來取代括弧中的預留位置值:
# Set variables.
$rgName = "<resource-group>"
$accountName = "<storage-account>"
# Get context object.
$storageAccount = Get-AzStorageAccount -ResourceGroupName $rgName -Name $accountName
$ctx = $storageAccount.Context
# Create a new container with public access setting set to Off.
$containerName = "<container>"
New-AzStorageContainer -Name $containerName -Permission Off -Context $ctx
# Read the container's public access setting.
Get-AzStorageContainerAcl -Container $containerName -Context $ctx
# Update the container's public access setting to Container.
Set-AzStorageContainerAcl -Container $containerName -Permission Container -Context $ctx
# Read the container's public access setting.
Get-AzStorageContainerAcl -Container $containerName -Context $ctx
當儲存體帳戶的公用存取不受允許時,無法設定容器的公用存取層級。 如果您嘗試設定容器的公用存取層級,Azure 儲存體會傳回錯誤,表示儲存體帳戶上不允許公用存取。
若要使用 Azure CLI 更新一或多個容器的公用存取層級,請呼叫 az storage container set permission 命令。 將您的帳戶金鑰、連接字串或共用存取簽章 (SAS) 傳入,以授權這項作業。 設定容器公用存取層級的設定容器 ACL 作業不支援 Azure AD 的授權。 如需詳細資訊,請參閱呼叫 Blob 和佇列資料作業的權限。
下列範例會建立公用存取已停用的容器,然後更新容器的公用存取設定,以允許匿名存取容器及其 Blob。 請記得使用您自己的值來取代括弧中的預留位置值:
az storage container create \
--name <container-name> \
--account-name <account-name> \
--resource-group <resource-group>
--public-access off \
--account-key <account-key> \
--auth-mode key
az storage container show-permission \
--name <container-name> \
--account-name <account-name> \
--account-key <account-key> \
--auth-mode key
az storage container set-permission \
--name <container-name> \
--account-name <account-name> \
--public-access container \
--account-key <account-key> \
--auth-mode key
az storage container show-permission \
--name <container-name> \
--account-name <account-name> \
--account-key <account-key> \
--auth-mode key
當儲存體帳戶的公用存取不受允許時,無法設定容器的公用存取層級。 如果您嘗試設定容器的公用存取層級,Azure 儲存體會傳回錯誤,表示儲存體帳戶上不允許公用存取。
檢查一組容器的公用存取設定
您可以藉由列出容器並檢查公用存取設定,以檢查一或多個儲存體帳戶中哪些容器已設定為公開存取。 當儲存體帳戶未包含大量容器,或當您在少量的儲存體帳戶之間檢查設定時,此方法是個可行的選項。 但是,如果您嘗試列舉大量的容器,效能可能會受到影響。
下列範例會使用 PowerShell 來取得儲存體帳戶中所有容器的公用存取設定。 請記得使用您自己的值來取代括弧中的預留位置值:
$rgName = "<resource-group>"
$accountName = "<storage-account>"
$storageAccount = Get-AzStorageAccount -ResourceGroupName $rgName -Name $accountName
$ctx = $storageAccount.Context
Get-AzStorageContainer -Context $ctx | Select Name, PublicAccess
功能支援
啟用 Data Lake Storage Gen2、網路檔案系統 (NFS) 3.0 通訊協定,或 SSH 檔案傳輸通訊協定 (SFTP),可能會影響到此功能的支援。
如果您已啟用上述任何功能,請參閱 Azure 儲存體帳戶中的 Blob 儲存體功能支援,以評估此功能的支援。
下一步