[教學] Azure Blob Storage 使用指南 – 金鑰與存取簽章篇

前一篇已經介紹了如何在 azure portal 後台建立 blob storage,而如果要讓程式或其他人可以直接存取檔案而非透過後台的話,就需要有存取金鑰或是存取簽章,本篇教學如何取得存取金鑰與存取簽章。

相關文章:

[教學] Azure Blob Storage 使用指南 – 創建篇

[教學] Azure Blob Storage 使用指南 – 金鑰與存取簽章篇

[教學] Azure Blob Storage 使用指南 – RESTful API 存取篇

存取金鑰

存與金鑰是每個 storage accoutn 中最重要的,其權限可以用於存取所有 storage account 內所有 container 內容以及簽署出共用存取簽章 (SAS)

要取得金鑰可以在進入 storage 管理頁面後點左邊的 [存取金鑰] 可以取得 storage account 的金鑰 (機碼),每個 storage account 都會有兩把金鑰選擇要用哪一把都可以

共用存取簽章 (shared access signature SAS)

共用存取簽章是透過存取金鑰簽署出來的有期限之簽章,管理員可以依據情境簽署能存取的範圍以及權限,有兩種的類型的簽章:一是 container 等級的簽章,二是 blob 等級的簽章,container 等級的簽章可以對 container 內所有 blob 進行操作,甚至寫資料至 container 內任何位置,而 blob 等級則只能操作指定 container 內指定位置的 blob,在寫入資料也只能寫到該指定位置,下面會教學幾個取得簽章的方法。

※ 存取簽章是透過存取金鑰簽署出來的,所以當管理員存取金鑰在後台重新產生新的金鑰後,舊的金鑰所簽署的簽章會馬上失效並且無法再使用。

權限說明

在簽署簽章時,需要設定該簽章能夠使用的權限,相關說明如下:

權限 簡寫 解釋 適用於簽章權限等級
Read r 讀取 container 資料或 blob 內容 Blob, Container
Write w 寫入 blob 至 container 內的資料夾或寫入至 blob Blob, Container
Delete d 刪除 container 內的 blob 檔案 Blob, Container
List l 列出 container 中資料夾內容 Container
Add a 對 blob 結尾附加內容 Blob, Container
Create c 建立新的 blob (但是不能夠對已經存在的 blob修改) Blob, Container

透過 portal 後台取得共用存取簽章 – storage account 等級權限

要取得 container 等級的共用存取簽章(SAS)可以在進入 storage 管理頁面後點左邊的 [共用存取簽章],設定要該簽章能夠使用的權限範圍以及簽章有效時間

點擊 [產生 SAS 與連結字串] 可以取得存取簽章

其權限依據設定最大可以對所有 container 中所有 blob 資料進行存取以及刪除

透過 portal 後台取得共用存取簽章 – blob 檔案等級權限

如果只想讓使用者存取單一檔案 (blob),則可以進入點左方的容器 (container)

然後點想要的容器

接著對點擊想要簽署的檔案

點擊 [產生 SAS]

接著設定要簽署的權限後點 [產生SAS權杖與URL]

Blob SAS 權杖便是共用存取簽章

透過程式產生 SAS

而如果是要做成程式服務的話,可能會依臨時需求產生一個期限較短的簽章,下面教學如何透過程式產生簽章 (這邊使用官方 SDK 內的函數產生,如果想要自己撰寫產生的程式碼可以參考官方產生的演算法:Create a user delegation SAS)

PHP 版本:

安裝套件:

composer require microsoft/azure-storage-blob

產生 sas token 的 code (container 等級)

use MicrosoftAzure\Storage\Blob\BlobSharedAccessSignatureHelper;
use MicrosoftAzure\Storage\Blob\Internal\BlobResources as Resources;

$account_name = 'your_account_name';
$account_key = 'your_account_key'; // 存取金鑰 (機碼)

$blob_shared_access_signature_helper = new BlobSharedAccessSignatureHelper($account_name, $account_key);
$signed_resource = Resources::RESOURCE_TYPE_CONTAINER;
$container_name = 'your-container-name';
$signed_permissions = 'rwdlac'; // 簽章的權限 (參考縮寫)
$signed_expiry = new Datetime('+3600 second'); // 簽章過期時間

$sas_token = $blob_shared_access_signature_helper->generateBlobServiceSharedAccessSignatureToken(
    $signed_resource,
    $container_name,
    $signed_permissions,
    $signed_expiry
);

產生 sas token 的 code (blob 等級)

use MicrosoftAzure\Storage\Blob\BlobSharedAccessSignatureHelper;
use MicrosoftAzure\Storage\Blob\Internal\BlobResources as Resources;

$account_name = 'your_account_name';
$account_key = 'your_account_key'; // 存取金鑰 (機碼)

$blob_shared_access_signature_helper = new BlobSharedAccessSignatureHelper($account_name, $account_key);
$signed_resource = Resources::RESOURCE_TYPE_BLOB;
$container_name = 'container-01';
$blob_name = 'your/blob/file/path';
$signed_permissions = 'rwdac'; // 簽章的權限 (參考縮寫)
$signed_expiry = new Datetime('+3600 second'); // 簽章過期時間

$sas_token = $blob_shared_access_signature_helper->generateBlobServiceSharedAccessSignatureToken(
    $signed_resource,
    $container_name . '/' . $blob_name,
    $signed_permissions,
    $signed_expiry
);

Node JS 版本

安裝套件:

npm install --save @azure/storage-blob

產生 sas token 的 code (container 等級)

const AzureStorageBlob = require("@azure/storage-blob");
const StorageSharedKeyCredential = AzureStorageBlob.StorageSharedKeyCredential;
const ContainerSASPermissions = AzureStorageBlob.ContainerSASPermissions;

let account = 'your_account_name';
let accountKey = 'your_account_key'; // 存取金鑰 (機碼)
let sharedKeyCredential = new StorageSharedKeyCredential(account, accountKey);

let containerName = 'your-container-name';
let permisions = 'racwdl'; // 簽章的權限 (參考縮寫)

let sasToken = AzureStorageBlob.generateBlobSASQueryParameters({
    containerName,
    permissions: ContainerSASPermissions.parse(permisions),
    expiresOn: new Date(new Date().valueOf() + 3600 * 1000), // 簽章過期時間
  },
  sharedKeyCredential
).toString();

產生 sas token 的 code (blob 等級)

const AzureStorageBlob = require("@azure/storage-blob");
const StorageSharedKeyCredential = AzureStorageBlob.StorageSharedKeyCredential;
const ContainerSASPermissions = AzureStorageBlob.ContainerSASPermissions;

let account = 'your_account_name';
let accountKey = 'your_account_key'; // 存取金鑰 (機碼)
let sharedKeyCredential = new StorageSharedKeyCredential(account, accountKey);

let blobName = 'your/blob/file/path';
let containerName = 'your-container-name';
let permisions = 'racwd'; // 簽章的權限 (參考縮寫)

let sasToken = AzureStorageBlob.generateBlobSASQueryParameters({
    containerName,
    blobName,
    permissions: ContainerSASPermissions.parse(permisions),
    expiresOn: new Date(new Date().valueOf() + 3600 * 1000)
  },
  sharedKeyCredential
).toString();