適用於: ✔️SMB 檔案共享
本文說明如何利用 managed identities,讓 Windows 和 Linux 虛擬機(VM)透過身份驗證與 Microsoft Entra ID 來存取 SMB Azure 檔案分享。
管理身份是 Microsoft Entra ID 中由 Azure 自動管理的身份。 通常,開發雲端應用程式時會使用受管理身份來管理 Azure 服務的憑證。 Azure 檔案儲存體 支援同一儲存帳號上的應用程式管理身份與基於最終使用者身份的存取。 應用程式與使用者透過 Microsoft Entra ID 獨立認證,並透過共享權限模型授權。
到本文結尾時,你已經建立了一個可用管理身份存取的儲存帳號。 你也會學到如何為虛擬機建立受管身份,並為它產生 OAuth 令牌。 接著你透過基於管理身份的認證與授權來掛載檔案分享。 使用管理身份可以省去使用儲存帳號金鑰的需求。
為什麼要用受管理身份來認證?
出於安全考量,避免使用儲存帳號金鑰來存取檔案分享。 當你指派管理身份給虛擬機或使用應用程式身份時,你可以用該身份驗證 Azure 檔案儲存體。
優點包括:
強化安全性:無需依賴儲存帳號金鑰來管理或公開。
簡化管理:無需按鍵輪換。
細微權限存取控制:識別層級的角色型存取。
自動化友善:易於整合於持續整合與持續交付(CI/CD)管線、Azure Kubernetes Service (AKS)工作負載及客戶應用。
成本效益:管理身份無需額外儲存成本。
系統指派與使用者指派的受管身份
Azure 提供兩種受管理身份:system assigned 以及 user assigned。
系統指派的管理身份限制為每個資源一個,並綁定於資源的生命週期。 你可以透過使用 Azure 角色基礎存取控制(Azure RBAC)來授予受管理身份的權限。 管理身份是用 Microsoft Entra ID 認證的,所以你不需要在程式碼裡儲存任何憑證。
使用者指派的受管理身份讓 Azure 資源能在不需將憑證儲存在程式碼中的情況下,直接向雲端服務進行認證。 你可以將這種受管理身份建立為獨立的 Azure 資源,並擁有自己的生命週期。 單一資源,如虛擬機,可以使用多個由使用者指派的受管理身份。 此外,多個虛擬機可以共用單一由使用者指派的管理身份。
雖然你可以在同一台虛擬機上同時設定使用者指派與系統指派的管理身份,但我們建議選擇其中一種。
先決條件
本文假設你有 Azure 訂閱,並擁有建立儲存帳號和指派 Azure RBAC 角色的權限。 要指派角色,你需要在所需的範圍內擁有角色指派寫入權限(Microsoft.Authorization/roleAssignments/write)。
需要使用管理身份認證的客戶端不應該被加入任何網域。
在你的儲存帳號上設定管理身份的存取屬性
要驗證受管理身份,您必須在包含您想存取的Azure檔案分享的儲存帳號上啟用 SMBOAuth 屬性。 我們建議為此建立一個新的儲存帳戶,雖然你也可以使用現有的儲存帳戶。
若要在您的儲存體帳戶上啟用 SMBOAuth 屬性,請使用 Azure 入口網站、Azure PowerShell 或 Azure CLI。 如需指示,請選擇相應的分頁。
若要透過 Azure 入口網站啟用 SMBOAuth 屬性建立新儲存帳號,請依照 這些步驟。 在 進階 標籤中,選擇 啟用 SMB 管理身份 的核取方塊。
或者,你也可以啟用現有儲存帳戶的 SMBOAuth 屬性。
前往儲存帳戶。 在服務選單中,在 設定中選擇 設定。 在 「SMB 的管理身份」中,選擇 啟用,然後選擇 儲存。
設定受控識別
你可以在 Windows 或 Linux 使用受管理身份。 請在本文開頭選擇您的作業系統並依照指示操作。
這裡描述的啟用步驟是針對 Azure 虛擬機。 如果你想在非 Azure 的 Windows 機器(本地端或其他雲端)啟用受控身份,必須先將它們加入 Azure Arc,然後指派受控身份。 你也可以用應用程式身份來驗證,而不是在虛擬機或 Windows 裝置上使用管理身份。
啟用 Azure VM 上的受控身分識別
管理身份可以是 系統指派或使用者指派。 如果虛擬機同時擁有系統指派和使用者指派的管理身份,Azure 預設為系統指派。 只指定一個,效果最好。
啟用系統指派的受控識別
請依照以下步驟在 Azure 運行的 Windows 虛擬機上啟用系統指派的管理身份:
登入 Azure 入口網站並建立一個 Windows 虛擬機。 你的虛擬機必須執行 Windows Server 2019 或更新版本的伺服器版本,或任何 Windows 用戶端版本。 請參見 在 Azure portal 建立 Windows虛擬機。
你可以在虛擬機建立時,於 管理 標籤頁啟用系統指派的管理身份。
啟用使用者指派的受控識別
登入Azure入口網站,並依照步驟建立使用者指定的管理身份。
前往您剛建立的使用者指派受控識別,並複製用戶端 ID 值。 您後續會用到此值。
將內建的 RBAC 角色指派給受控身分識別或應用程式身分識別
啟用管理身份後,透過 Azure RBAC 授予所有必要權限。 若要指派角色,請以在所需範圍內具有角色指派寫入權限的使用者身分登入。
請依照以下步驟指派內建的 Azure RBAC 角色Storage File Data SMB MI Admin。此角色提供 Azure 檔案儲存體 中的檔案和目錄上的受管理身份管理員層級的存取權限。
使用受控身分識別,前往包含您想掛載之檔案共用的儲存體帳戶。 在服務選單中,選擇存取控制 (IAM)。
在 [授與此資源的存取權] 下,選取 [新增角色指派]。
在角色分頁中,於工作職能角色下搜尋並選擇儲存檔案資料 SMB MI 管理員。然後選擇下一步。
在 Members 標籤,Assign access to 下,選擇 Managed identity以選擇虛擬機或Azure Arc身份。 對於應用程式識別碼,請選擇 使用者、群組或服務主體。
在 「成員」中,選擇 + 選擇成員。
對於 Azure VM 或 Azure Arc 身份,請選擇你的虛擬機或 Windows 裝置的管理身份。 對於應用程式身份,請搜尋並選擇該應用程式身份。 選擇 [] 選取 []。
確認管理身份或應用程式身份是否列在 成員中。 選取 下一步。
選擇 Review + assign 以將角色分配加入 storage 帳戶。
在虛擬機中新增使用者指派的管理身份
如果你建立了使用者指派的管理身份,請依照以下步驟將其加入虛擬機:
移至您的 VM。 在服務功能表上的 [ 安全性] 底下,選取 [ 身分識別]。
選擇 「使用者指派」 標籤,然後選擇 「新增使用者指派的管理身份」。 選擇你建立的管理身份,然後選擇 新增。
要在運行於 Azure 的 Linux 虛擬機上設定受管理身份,請遵循以下步驟。 你的虛擬機必須執行 Azure Linux 3.0、Ubuntu 22.04、Ubuntu 24.04、RHEL 9.6+ 或 SLES 15 SP6+。
啟用 Azure VM 上的受控身分識別
管理身份可以是 系統指派或使用者指派。 如果虛擬機同時擁有系統指派和使用者指派的管理身份,Azure 預設為系統指派。 只指定一個,效果最好。
啟用系統指派的受控識別
登入 Azure 入口網站。
你可以在虛擬機建立時,於 Management 標籤中啟用系統指派的管理身份。請參考 在 Azure portal 建立 Linux 虛擬機。
啟用使用者指派的受控識別
登入Azure入口網站,並依照步驟建立使用者指定的管理身份。
前往您剛建立的使用者指派受控識別,並複製用戶端 ID 值。 您後續會用到此值。
為管理身份指派內建的 RBAC 角色
使用受控身分識別,前往包含您想掛載之檔案共用的儲存體帳戶。 在服務選單中,選擇存取控制 (IAM)。
在 [授與此資源的存取權] 下,選取 [新增角色指派]。
在角色分頁中,於工作職能角色下搜尋並選擇儲存檔案資料 SMB MI 管理員。然後選擇下一步。
在 Members 標籤中,Assign access to 下,選擇 Managed identity。
在 「成員」中,選擇 + 選擇成員。 選取 管理身份 的窗格會出現。
在 「受管身份」中,選擇該受管理身份,然後選擇 「選擇」。
確認管理身份是否列在 成員類別中。 選取 下一步。
選擇 Review + assign 以將角色分配加入 storage 帳戶。
在虛擬機中新增使用者指派的管理身份
如果你建立了使用者指派的管理身份,請依照以下步驟將其加入虛擬機:
移至您的 VM。 在服務功能表上的 [ 安全性] 底下,選取 [ 身分識別]。
選擇 「使用者指派」 標籤,然後選擇 「新增使用者指派的管理身份」。 選擇你建立的管理身份,然後選擇 新增。
準備您的客戶使用管理身份來進行驗證
透過使用受控識別驗證準備系統掛接檔案共用的步驟,對於 Windows 和 Linux 用戶端各不相同。 Windows 用戶端無法加入網域,或是管理式身份驗證無法運作。
為了準備您的客戶端虛擬機或 Windows 裝置使用受管理身份驗證,請確保客戶端未加入網域,並遵循以下步驟。
登入已分配管理身份的虛擬機或裝置,並以管理員身份開啟 PowerShell 視窗。 你需要 PowerShell 5.1+ 或 PowerShell 7+。
安裝 Azure 檔案儲存體 SMB Managed Identity Client PowerShell 模組並匯入:
Install-Module AzFilesSmbMIClient Import-Module AzFilesSmbMIClient請執行以下指令檢查您目前的 PowerShell 執行策略:
Get-ExecutionPolicy -List若執行策略為
CurrentUserRestricted或Undefined,則改為RemoteSigned。 如果執行策略為RemoteSigned、Default、AllSigned、Bypass或Unrestricted,你可以跳過此步驟。Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
重新整理認證憑證
在你用管理身份掛載檔案分享之前,先更新認證憑證並指定你的 storage account 端點。 要複製你的儲存帳號 URI,請在 Azure 入口網站中進入儲存帳號,然後在服務選單中選擇 Settings>Endpoints。 務必複製整個 URI,包括尾部斜線: https://<storage-account-name>.file.core.windows.net/。
對於系統指派的管理身份,執行以下指令取得 OAuth 標記,插入 Kerberos 快取,當標記接近到期時自動刷新。 你可以選擇省略 refresh。
AzFilesSmbMIClient.exe refresh --uri https://<storage-account-name>.file.core.windows.net/
對於使用者指派的管理身份,你需要指定客戶端 ID。 將 <client-id> 替換為受控識別的用戶端識別碼。
AzFilesSmbMIClient.exe refresh --uri https://<storage-account-name>.file.core.windows.net/ --clientId <client-id>
小提示
要查看完整的使用資訊與範例,請執行該可執行檔,且不加任何參數: AzFilesSmbMIClient.exe。
要準備你的 Linux 虛擬機使用受管理身份驗證,請遵循以下步驟。
下載並安裝認證套件
套件的位置和安裝步驟會依據你的 Linux 發行版而有所不同。
Azure Linux 3.0
請執行以下指令在 Azure Linux 3.0 上安裝 azfilesauth:
tdnf update
tdnf install azfilesauth
RHEL 9.6+
請執行以下指令以安裝 azfilesauth 於 RHEL 9.6+:
curl -sSL -O https://packages.microsoft.com/config/$(source /etc/os-release && echo "$ID/${VERSION_ID%%.*}")/packages-microsoft-prod.rpm
sudo rpm -i packages-microsoft-prod.rpm
rm packages-microsoft-prod.rpm
dnf update
dnf install -y azfilesauth
有時 RHEL 會阻擋核心上行呼叫憑證快取檔案的存取。 若發生故障,請參閱 /var/log/messages 可能的原因。
RHEL 預設使用持久憑證或 KCM 快取。 你可以切換到基於檔案的快取系統:azfilesauth
sudo tee /etc/krb5.conf.d/00-azfilesauth.conf > /dev/null <<EOF
[libdefaults]
default_ccache_name = FILE:/tmp/krb5cc_%{uid}
EOF
SLES 15 SP6+
請執行以下指令在 SLES 15 SP6+ 上安裝 azfilesauth :
curl -sSL -O https://packages.microsoft.com/config/sles/15/packages-microsoft-prod.rpm
sudo rpm -i packages-microsoft-prod.rpm
rm packages-microsoft-prod.rpm
sudo zypper refresh
sudo zypper install -y azfilesauth
SLES 15 SP6+ 預設使用持久憑證或 KCM 快取。 你可以切換到基於檔案的快取系統:azfilesauth
sudo tee /etc/krb5.conf.d/00-azfilesauth.conf > /dev/null <<EOF
[libdefaults]
default_ccache_name = FILE:/tmp/krb5cc_%{uid}
EOF
Ubuntu 22.04 版本
請執行以下指令在 Ubuntu 22.04 上安裝 azfilesauth :
curl -sSL -O https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb
# the above steps update the sources.list
sudo apt-get update
sudo apt-get install -y azfilesauth
Ubuntu 24.04
執行以下指令在 Ubuntu 24.04 上安裝 azfilesauth :
curl -sSL -O https://packages.microsoft.com/config/ubuntu/24.04/packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb
# the above steps update the sources.list
sudo apt-get update
sudo apt-get install -y azfilesauth
設定管理身份驗證
在 Linux 上設定認證有兩種選項:
- 使用虛擬機管理身份:如果您的虛擬機已指定受管理身份,請選擇此選項。
- 直接提供 OAuth 代幣:如果您自己管理 OAuth 代幣,請選擇此選項。
選項一:使用 VM 管理身份
你可以使用系統指派或使用者指派的管理身份來設定認證。
如果您的 VM 有使用者指派的受控識別,請執行以下命令從 Azure Instance Metadata Service (IMDS) 取得權杖並自動加以儲存。 將 <storage-account-name> 取代為您的儲存體帳戶名稱。 以您受控識別的用戶端識別碼取代 <client-id>。 如果你沒有用戶端識別碼,請到 Azure 入口網站的受控識別中複製用戶端識別碼。
sudo azfilesauthmanager set https://<storage-account-name>.file.core.windows.net --imds-client-id <client-id>
如果你的虛擬機有系統指派的管理身份,請使用 --system 該標誌,且不要提供用戶端 ID:
sudo azfilesauthmanager set https://<storage-account-name>.file.core.windows.net --system
確認票證已正確建立:
sudo azfilesauthmanager list
選項二:直接提供 OAuth 代幣
如果你自己管理代幣,請直接提供 OAuth 代幣。
aud該權杖的 (對象) 值必須是https://storage.azure.com(不應包含結尾斜線),且不得https://storage.azure.com/掛接檔案共用。
執行下列命令。 用你的數值替換 <storage-account-name> 和 <access-token>。
# Insert the token into your credential cache
sudo azfilesauthmanager set https://<storage-account-name>.file.core.windows.net <access-token>
# Verify the ticket is properly stored
sudo azfilesauthmanager list
掛載 Azure 檔案共享
你現在可以在 Windows 或 Linux 上掛載檔案分享,而不必使用儲存帳號金鑰。
在 Windows 用戶端,你可以透過 UNC 路徑直接存取 Azure 檔案分享,方法是在 Windows 檔案總管輸入以下路徑。 把 <storage-account-name> 換成你的 storage 帳號名稱,<file-share-name> 換成檔案分享名稱。
\\<storage-account-name>.file.core.windows.net\<file-share-name>
欲了解更多資訊,請參閱 在 Windows 上掛載 SMB Azure 檔案分享。
執行以下指令,以建議的掛載選項掛載檔案分享。 把 <storage-account-name> 換成你的 storage 帳號名稱,<file-share-name> 換成檔案分享名稱。 您可以在以下設定檔中找到您的憑證 ID: cat /etc/azfilesauth/config.yaml。 對於使用者指派的管理身份,請透過 username=<client-id> 掛載選項包含該管理身份的客戶端 ID。 對於系統指派的管理身份,請省略掛載選項 username=<client-id>。
sudo mount -t cifs //<storage-account-name>.file.core.windows.net/<file-share-name> /mnt/smb -o sec=krb5,cruid=<credential-id>,username=<client-id>,dir_mode=0755,file_mode=0755,serverino,nosharesock,mfsymlinks,actimeo=30
確認安裝成功:
ls -la /mnt/smb
更多資訊請參見在 Linux 客戶端上掛載 SMB Azure 文件共享。
重新整理您的認證
為防止存取中斷,請定期更新您的憑證。 刷新服務會自動偵測並更新憑證。
在你第一次掛載檔案分享後,啟動刷新服務:
sudo systemctl start azfilesrefresh
為確保每次開機服務自動啟動:
sudo systemctl enable --now azfilesrefresh
自動憑證更新需要為你的虛擬機指派一個受管理身份。 如果你直接提供 OAuth 憑證,必須使用 azfilesauthmanager set 「 配置管理身份驗證」中的指令手動刷新憑證,或透過共享函式庫 API 程式化刷新。
故障排除
Windows 和 Linux 用戶端的故障排除步驟不同。
如果您在 Windows 上掛接檔案共用時遇到問題,請依照下列步驟啟用詳細記錄,並收集診斷資訊:
在 Windows 用戶端上,使用登錄編輯程式,將 的詳細程度
0x00000004層級設為Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Azure\Storage\Files\SmbAuth(4)。試著重新掛接該共用並重現錯誤。
你現在應該有一個名為
AzFilesSmbMILog.log的檔案。 請將日誌檔案寄給 Azure 檔案儲存體 團隊 尋求協助。
如果您在 Linux 上掛載檔案分享時遇到問題,請依照 這些 SMB 診斷步驟。
用戶端函式庫安裝與整合選項
以下資訊是給需要將受管理身份整合到其應用程式中的開發者。
對於需要將受管理身份整合進 Windows 應用程式的開發者,有多種實作方法可供選擇。 你選擇哪種方法取決於你的應用程式架構和需求。
管理組件整合:NuGet 套件
對於.NET應用,Microsoft.Azure。AzFilesSmbMI NuGet 套件包含一個受管理的組件(Microsoft.Azure.AzFilesSmbMI.dll),可直接存取 SMB OAuth 認證功能。 此方法適用於 C# 及其他基於 .NET 的應用程式。
安裝組件時,請使用 Install-Package Microsoft.Azure.AzFilesSmbMI -version 1.2.3168.94。
原生 DLL 的整合
對於需要直接 API 存取的原生應用程式,AzFilesSmbMIClient 可作為 native DLL 提供。 此選項對於需要較低階整合的 C/C++ 應用程式或系統特別有用。 請參閱
原生 API 方法
原生 DLL 匯出以下核心憑證管理方法:
extern "C" AZFILESSMBMI_API HRESULT SmbSetCredential(
_In_ PCWSTR pwszFileEndpointUri,
_In_ PCWSTR pwszOauthToken,
_In_ PCWSTR pwszClientID,
_Out_ PDWORD pdwCredentialExpiresInSeconds
);
extern "C" AZFILESSMBMI_API HRESULT SmbRefreshCredential(
_In_ PCWSTR pwszFileEndpointUri,
_In_ PCWSTR pwszClientID
);
extern "C" AZFILESSMBMI_API HRESULT SmbClearCredential(
_In_ PCWSTR pwszFileEndpointUri
);
Linux 開發者可以使用隨 azfilesauth 套件自動安裝的共享函式庫。 你可以在 C/C++ 應用程式中連結到函式庫,直接存取 API。
請務必包含 public 標頭。
欲了解更多資訊,請參閱 AzFilesAuthenticator 專案。
共享函式庫 API 方法
共享函式庫匯出以下核心憑證管理方法:
#ifdef __cplusplus
extern "C" {
#endif
int extern_smb_set_credential_oauth_token(char* file_endpoint_uri,
char* auth_token,
unsigned int* credential_expires_in_seconds);
int extern_smb_clear_credential(char* file_endpoint_uri);
int extern_smb_list_credential(bool is_json);
const char* extern_smb_version();
#ifdef __cplusplus
}
#endif
API 說明
下表列出了 API 指令及其使用方式。 回傳的值遵循標準 C 的慣例(成功為零,錯誤為非零)。
| 命令 | 說明 |
|---|---|
extern_smb_set_credential_oauth_token() |
為特定 storage 端點設定 OAuth 憑證憑證。 |
extern_smb_clear_credential() |
移除儲存端點的已儲存憑證。 |
extern_smb_list_credential() |
列出所有儲存的憑證。 |
extern_smb_version() |
回傳函式庫的 azfilesauth 版本字串。 |