🗺️ Azure 服務地圖
身分與安全・Entra 身分・SC-900/SC-300/SC-500/AZ-400

條件式存取與受控識別:人看情境放行,程式不拿密碼

員工從哪裡、用什麼裝置登入,決定要不要多驗一次;應用程式要讀 Key Vault,則根本不該在設定檔裡放密碼。這一頁把「人」和「程式」的存取一次理清楚。

條件式存取原則評估模擬器 受控識別情境分診:10 個情境 入口網站/CLI/Bicep 三種做法

💡 先搞懂問題

虛構的「北辰醫院」資訊室同時被兩件事困擾。第一件是人:員工只要帳號密碼正確,不論在院內、在家、還是在國外的網咖都能登入財務報表系統;有位主任的密碼在別的網站外洩過,資訊室才發現沒有任何機制能說「從院外登入要多驗一次」或「財務系統只准醫院配發的電腦」。他們試過開啟安全性預設值(security defaults),所有人一律要 MFA,可是沒辦法針對財務系統或特定裝置另外設定。

第二件是程式:掛號網站要從 Azure Key Vault 讀資料庫密碼,工程師為了「先讓它動起來」,把存取 Key Vault 用的服務主體密碼寫在網站設定裡。這組密碼會到期、要輪替,又曾經被貼進工作群組,負責的工程師離職後沒人敢換。

這兩件事在 Azure 裡各有一個正解。條件式存取(Conditional Access)是 Microsoft Entra ID 的原則引擎,用「如果……就……」的規則決定一次登入能不能進來:如果是財務部的人、要開財務系統、裝置不符合規範,就封鎖;如果是從公司網路以外登入,就要求 MFA。受控識別(managed identity)則是 Azure 替資源自動建立、保管與輪替憑證的身分,程式向平台要一張 Entra 權杖(token)就能存取 Key Vault,整個過程看不到任何密碼。

新手最常卡的地方:以為條件式存取在輸入密碼之前就把人擋在門外,其實它在第一因素驗證之後才評估;以為多條原則「取最寬鬆的」,其實是全部都要滿足、而且封鎖優先;忘了條件式存取需要 Entra ID P1 授權、風險條件需要 P2;以為開了受控識別就能讀 Key Vault,其實還要另外用 Azure RBAC 指派角色;也分不清系統指派與使用者指派,在資源刪除時會發生什麼事。

門禁收集的訊號 誰:王經理(財務部) 要去:財務樓層 從哪:側門(公司外) 設備:私人手機 通報:這張卡疑似被盜 門禁主機 逐條套用 「如果……就……」 放行 再按一次指紋才放行 擋下 機器人送貨員 (應用程式) 自己的識別證 管理處製作、定期換碼 只能進收發室 權限另外登記
上半部是給「人」的門禁:主機收集五種訊號,依規則決定放行、再驗一次或擋下。下半部是給「程式」的做法:機器人送貨員不借員工卡,管理處直接發一張它自己的識別證,卡片的密碼由管理處定期更換;這張卡能進哪些房間,另外登記。

生活比喻:辦公大樓的智慧門禁

想像一棟辦公大樓換了智慧門禁。保全總監在門禁主機裡寫了幾條規則:「任何員工從側門進來,要再按一次指紋」「要上財務樓層的人,手上必須是公司配發、有登記的平板,私人手機一律不行」「警衛通報某張卡疑似被盜,那張卡直接鎖住」。員工先刷卡,主機確認是本人之後,才開始比對這些規則;同一個人同時符合好幾條,每一條的要求都要做到,只要有一條說「擋下」,其他規則再寬鬆也沒用。新規則上線前,總監會先讓主機「只記錄、不執行」一週,看看會擋到哪些人;他自己也留一張不受這些規則限制的萬用備用卡,鎖在保險箱裡,免得規則寫錯時全公司都進不了門。

大樓裡還有送公文的機器人。以前它借用某位員工的門禁卡,那位員工離職、換卡,機器人就停擺。現在管理處直接替機器人做一張它自己的識別證,卡片內碼由管理處定期更換,機器人和工程師都不需要知道內碼;至於這張卡能進收發室還是檔案室,要另外在權限表上登記。

回到 Azure:門禁規則就是條件式存取原則。「對誰、去哪一層」是指派(使用者或群組、目標資源),「側門、私人手機、卡片被盜通報」是條件(位置、裝置平台、登入風險),「放行、再按指紋、擋下」是存取控制(授與並要求 MFA 或裝置符合規範,或封鎖)。先刷卡再比對規則,對應條件式存取在第一因素驗證之後才評估;「只記錄、不執行」是僅限報告(report-only)模式,萬用備用卡是要排除在原則之外的緊急存取帳戶(break-glass account)。機器人自己的識別證是受控識別,權限表上的登記是 Azure RBAC 角色指派。
智慧門禁(比喻) Azure 的正式名稱 門禁主機裡的一條規則 對誰、要去哪一層 側門、私人手機、被盜通報 放行、再按指紋、擋下 新規則先「只記錄、不執行」 總監鎖在保險箱的備用卡 機器人自己的識別證 權限表上的登記 條件式存取原則 指派:使用者/群組、目標資源 條件:位置、裝置平台、風險 授與(MFA、裝置)或封鎖 僅限報告模式 排除緊急存取帳戶 受控識別 Azure RBAC 角色指派
上面六列是條件式存取,下面兩列是受控識別。最後一列特別重要:有了識別證(受控識別)不等於能進房間,Key Vault、儲存體帳戶都要另外替這個身分指派角色。

這個比喻有幾個地方和實際不同。第一,大樓門禁在門口就攔人,條件式存取則是在使用者完成第一因素(例如密碼)之後才評估,所以它不是擋阻斷服務攻擊的第一道防線。第二,智慧門禁只管進門那一刻;條件式存取也能設定工作階段控制,例如多久要重新登入一次。第三,條件式存取決定的是「這次登入能不能拿到權杖」,進來之後能對哪些 Azure 資源做什麼,仍由 Azure RBAC 決定,兩者不能互相取代。第四,機器人的識別證只在大樓裡有效:受控識別只能給 Azure 資源(以及透過 Azure Arc 連線的伺服器等)使用,在 GitHub Actions 或地端伺服器上執行的程式,要改用工作負載身分同盟或服務主體。

以前:設定檔裡放密碼 受控識別:沒有密碼可以外洩 網站設定(示意) CLIENT_ID = 1a2b… CLIENT_SECRET = ******** 程式庫 紀錄檔 離職人員 密碼會到期、要輪替, 外洩後到處都要改 掛號網站已啟用受控識別 Entra ID核發權杖 Key Vault檢查 RBAC 角色 ① 要權杖 ② 拿到權杖 ③ 帶權杖讀機密 憑證由 Azure 自動建立與輪替
左邊的密碼一旦寫進設定,就可能跟著程式碼、紀錄檔或人員流出去,輪替也得到處修改。右邊的網站只向平台要權杖,Entra ID 認得這個受控識別就核發,Key Vault 再依角色指派決定給不給機密;從頭到尾沒有任何一組密碼需要人保管。

🎮 互動實驗室一:條件式存取原則評估模擬器

北辰醫院設了三條條件式存取原則(可直接修改每一條的狀態、指派、條件與授與控制)。在下方設定一次登入事件,或按情境按鈕帶入,再按「評估這次登入」。畫面會列出每條原則有沒有套用、為什麼,以及最後的結果。想挑戰自己,可以在評估前先猜結果。這裡假設使用者的密碼(第一因素)已經驗證通過、而且已經註冊好 MFA 方法;人名、群組與應用程式都是虛構的。

這組原則需要的授權:
登入事件
先猜結果:
還沒評估。
原則狀態是否套用與原因這條原則的要求與結果
猜中 0 / 0
已評估 0 次
畫面說明:載入中。

🎮 互動實驗室二:受控識別情境分診

每張卡是一個原創情境,請判斷最適合的身分做法:系統指派受控識別、使用者指派受控識別、應用程式註冊加服務主體,或者這根本不是受控識別該處理的事。答完會說明理由;選錯時也會告訴你你選的那一種適合什麼情境,並補充這個選擇在資源刪除或重建時會發生什麼事。

得分 0 / 0
連續答對 0
畫面說明:先問兩個問題:程式在哪裡執行?這個身分要不要跟著某一個資源同生共死?

🛠️ 操作教學:替 Web 應用程式開啟受控識別並授權讀取 Key Vault

條件式存取是在 Microsoft Entra 系統管理中心設定的租用戶層級原則,不屬於 Azure 資源,所以這裡的操作以受控識別為主(條件式存取的自動化方式放在原理補完)。跟著 7 個步驟:替北辰醫院的掛號網站開啟系統指派受控識別、視需要加上使用者指派受控識別、確認 Key Vault 使用 Azure RBAC 權限模型,再把 Key Vault Secrets User 角色指派給這個身分。你填的名稱會即時反映到右邊的 Azure CLI 與 Bicep,目前步驟對應的那幾行以黃色底標示。

示意畫面:簡化重繪,只保留和本主題有關的欄位;實際畫面以 Azure 入口網站為準。
☁ 雲端主控台搜尋資源、服務及文件

應用程式怎麼用這個身分:一段不含任何金鑰的程式碼

角色指派完成後,網站程式只要用 Azure 身分識別程式庫(azure-identity)向平台要權杖。DefaultAzureCredential 會依序嘗試環境變數、工作負載身分、受控識別、開發工具登入(例如 Azure CLI 的 az login)等方式,所以同一段程式在 Azure 上會用受控識別,在你自己電腦上會用你登入的帳號。官方建議部署到 Azure 後改用明確的 ManagedIdentityCredential,避免意外用到其他憑證,也比較好排查。

# pip install azure-identity azure-keyvault-secrets
from azure.identity import DefaultAzureCredential
from azure.keyvault.secrets import SecretClient

# 在 Azure 上會用到 Web 應用程式的受控識別;在自己電腦上會用 az login 的帳號
credential = DefaultAzureCredential()
# 使用使用者指派受控識別時,指定它的用戶端識別碼(client ID,不是密碼):
# credential = DefaultAzureCredential(managed_identity_client_id="<client-id>")

# 直接取得權杖:範圍是 Key Vault;不要把權杖本身印出或寫進紀錄
token = credential.get_token("https://vault.azure.net/.default")
print("權杖到期時間(Unix 時間):", token.expires_on)

# 一般情況交給 SDK 處理權杖,程式碼裡沒有任何金鑰或連線字串
client = SecretClient(vault_url="https://kv-beichen-demo.vault.azure.net", credential=credential)
db_password = client.get_secret("db-password").value

自己動手時要注意

權限:在 Web 應用程式上開啟受控識別,需要能修改該資源的角色,例如 Contributor 或 Website Contributor;建立使用者指派受控識別可用 Managed Identity Contributor。指派角色則需要 Owner、User Access Administrator 或 Role Based Access Control Administrator 這類能寫入角色指派的角色,單純的 Contributor 做不到。費用:受控識別與角色指派不另外收費,但 App Service 方案與 Key Vault 的作業會計費。注意:角色指派生效可能要等幾分鐘;把 Key Vault 從存取原則改成 Azure RBAC 前,先確認既有使用者與應用程式都已有對應的角色,否則他們會突然讀不到機密。練習完把資源群組刪除:

# 刪除練習用的資源群組與裡面所有資源(無法復原,確認名稱再執行)
az group delete --name rg-beichen-app --yes --no-wait

範例裡沒有任何金鑰、密碼、連線字串或訂用帳戶 ID。用 az account set --subscription <your-subscription-id> 切換訂用帳戶時,佔位字請換成自己的值,不要把真實 ID 貼到公開的地方。

📘 原理補完

條件式存取原則的結構

每條條件式存取原則由兩部分組成。指派(assignments)回答「對誰、在什麼情況下套用」:使用者、群組或目錄角色(也能鎖定工作負載身分與 agent 身分,但需要對應授權),可以包含也可以排除;目標資源,例如所有資源或特定雲端應用程式;以及條件,例如登入風險、使用者風險、裝置平台、位置(IP 範圍或國家/地區,可設定受信任位置)、用戶端應用程式與裝置篩選。存取控制(access controls)回答「套用了之後怎樣」:封鎖存取,或授與存取但要求滿足控制,例如需要多重要素驗證、需要驗證強度(authentication strength)、需要將裝置標記為符合規範、需要已加入 Microsoft Entra 混合式的裝置、需要核准的用戶端應用程式、需要應用程式保護原則、需要變更密碼、需要接受使用規定;多個授與控制可以選「全部都要」(預設)或「其中一項即可」。另外還有工作階段控制,例如登入頻率。

原則狀態:開啟 / 僅限報告 / 關閉 如果……(指派) 就……(存取控制) 使用者與群組包含:所有使用者/財務部;排除:緊急存取 目標資源所有資源/特定雲端應用程式 條件位置、裝置平台、登入風險、用戶端… 封鎖存取最嚴格,套用就直接拒絕 授與存取,但要求: ・多重要素驗證/驗證強度・裝置標記為符合規範・核准的用戶端、變更密碼… 全部都要(預設)或其中一項
左欄三格要全部符合,這條原則才算「套用」;套用之後,右欄決定結果。實驗室一的每張原則卡就是照這個結構排的。目標資源與條件沒有設定的部分,代表不限。

評估時機與多條原則的合併

條件式存取在第一因素驗證完成之後才評估,不是阻斷服務攻擊的第一道防線。評估分兩個階段:先收集工作階段資訊(位置、裝置等),這一步開啟中與僅限報告的原則都會做;再進入強制執行,只有開啟中的原則會做。強制執行時,只要有任何一條套用的原則是封鎖,就直接拒絕;否則把所有套用原則的授與控制合起來,全部滿足才發出權杖。所以一條原則要 MFA、另一條要符合規範的裝置,使用者兩個都得做到。沒有任何原則套用時,條件式存取不會額外要求什麼,第一因素通過就放行,這也是為什麼要搭配一條涵蓋所有使用者的基準原則。

① 第一因素例如密碼正確 ② 收集訊號位置、裝置、風險 ③ 找出套用的開啟中原則 有任一條是封鎖? 拒絕 合併授與控制全部滿足得了? 核發權杖(完成 MFA 等) 拒絕(條件不足) 是否能不能 僅限報告的原則 也在 ② 收集時評估 結果只寫進登入紀錄 不提示 MFA、不封鎖 成功/失敗/需要使用者動作/未套用
中間這條路是開啟中原則的強制執行:封鎖優先,其次才是合併所有授與控制。左邊黃色虛框是僅限報告原則,它們一樣被評估,但只把「如果開啟會怎樣」寫進登入紀錄,使用者不會被提示或封鎖。

僅限報告模式的結果有四種:Report-only: Success(條件與控制都已滿足)、Failure(條件符合,但不互動的控制沒有滿足,例如裝置不符合規範)、User action required(需要使用者動作才能滿足,例如 MFA,但不會真的提示)、Not applied(條件不符,例如使用者被排除)。結果可以在登入紀錄的條件式存取與僅限報告分頁,以及條件式存取深入解析活頁簿查看。官方提醒,要求符合規範裝置的僅限報告原則,可能讓 macOS、iOS、Android 使用者反覆看到選取裝置憑證的提示,建議先排除這些平台。新原則的標準流程是:排除緊急存取帳戶、先用僅限報告觀察一段時間、確認影響再開啟。

王經理・在家・私人 macOS(不符合規範)・開財務報表系統 CA01 公司外需 MFA套用 → 要求 MFA能完成 ✓ CA02 財務需合規裝置套用 → 要求合規裝置做不到 ✕ CA03 高風險封鎖風險低 → 未套用不影響結果 AND 結果:拒絕。MFA 做得到也沒用,所有要求都要滿足
這是實驗室一「在家用私人電腦」情境的結果。常見誤解是「有一條原則放行就能進」,其實套用的原則全部都要滿足;如果把 CA02 的授與改成「需要 MFA 或符合規範的裝置(其中一項)」,王經理完成 MFA 就能進來。

條件式存取原則存放在 Microsoft Entra 租用戶裡,不是 Azure Resource Manager 的資源,所以不能用 az 的資源指令或 Bicep 建立。要自動化或納入版本控制,透過 Microsoft Graph 的 /identity/conditionalAccess/policies API(或 Microsoft Graph PowerShell)。原則的 state 有三種值:enabled、disabled,以及代表僅限報告的 enabledForReportingButNotEnforced。下面是用 Azure CLI 呼叫 Graph 列出原則的示意,實際能否執行取決於你的目錄角色與 Graph 權限:

# 列出租用戶中的條件式存取原則(只讀取;需要有讀取原則的權限)
az rest --method GET --uri https://graph.microsoft.com/v1.0/identity/conditionalAccess/policies --query "value[].{name:displayName, state:state}" --output table

授權與相近功能

條件式存取需要 Microsoft Entra ID P1(Microsoft 365 Business Premium 也包含);以登入風險或使用者風險為條件的原則,需要 Microsoft Entra ID Protection,屬於 P2 功能;鎖定工作負載身分需要 Microsoft Entra Workload ID 授權,要求裝置符合規範則要搭配 Intune。沒有 P1、只想替所有人快速開啟 MFA 時,用免費的安全性預設值,但它無法細分使用者、應用程式或位置,而且和條件式存取不能同時使用。Azure AD 已在 2023 年更名為 Microsoft Entra ID,授權名稱也從 Azure AD Premium P1/P2 改為 Microsoft Entra ID P1/P2,功能與價格不變。

Free 安全性預設值:一鍵、全員 Entra ID P1 條件式存取 位置、裝置、應用程式 等條件細緻設定 Entra ID P2 P1 全部功能 ID Protection: 登入風險、使用者風險條件 PIM、存取權檢閱 (PIM 等也可用 ID Governance) 越往右, 能用的條件越多
題目給授權條件時,先看原則用到哪些條件:只用位置、裝置、應用程式,P1 就夠;用到「登入風險高就封鎖」或「使用者風險高就要求變更密碼」,就需要 P2。沒有 P1、只想要全員 MFA,答案通常是安全性預設值。
功能回答的問題重點
條件式存取這次登入能不能拿到權杖、要先滿足什麼指派+條件+授與/封鎖;需 P1,風險條件需 P2
安全性預設值沒有 P1,怎麼替全員快速開 MFA免費、一鍵、無法細調,不能和條件式存取並用
Azure RBAC登入後能對哪些 Azure 資源做什麼安全性主體+角色定義+範圍;受控識別也是安全性主體
PIM高權限角色怎麼及時啟用、有期限符合資格指派、核准與時限;需 P2 或 ID Governance
受控識別Azure 上的程式怎麼不用密碼取得權杖系統指派或使用者指派;憑證由 Azure 管理,還要另外授權

受控識別:兩種類型與生命週期

受控識別是 Microsoft Entra ID 裡一種特殊的服務主體,憑證由 Azure 建立、保管與輪替,而且不另外收費。程式向資源內部的身分識別端點要權杖(VM 是 Instance Metadata Service,App Service 與 Functions 由平台提供端點),再拿權杖去存取支援 Microsoft Entra 驗證的服務,例如 Key Vault、儲存體帳戶、Azure SQL、Service Bus。權杖只能在那個資源內部取得,所以不能「把受控識別帶回家」在筆電上用。

Web 應用程式(Azure 內) 你的程式DefaultAzureCredential 平台身分識別端點只在資源內部可用 Entra ID Key Vault 這個身分有 Key Vault Secrets User 角色嗎? 有 → 回傳機密 沒有 → 403 ① 要權杖④ 權杖 ②③ ⑤ 帶權杖讀機密⑥ 機密 程式碼與設定裡沒有任何密碼;權限只看 RBAC 角色指派
受控識別解決的是「怎麼證明我是誰」(①~④),存取 Key Vault 時還要回答「我能做什麼」(⑤⑥),那是角色指派的工作。題目若問「已啟用受控識別仍讀不到機密」,答案多半是缺少角色指派,或 Key Vault 還在用存取原則模型。

兩種類型的差別在生命週期與共用。系統指派(system-assigned)直接在某個資源上開啟,和該資源同生共死:資源刪除,身分也一起刪除,角色指派跟著失效;它只能屬於一個資源,適合單一資源的工作負載,或需要每個資源有獨立身分以便稽核的情境。使用者指派(user-assigned)是獨立的 Azure 資源,可以指派給多個資源,要自己刪除;適合多個資源共用相同權限、資源經常刪除重建但權限要維持一致,或要在資源建立前先完成授權(預先授權)的情境。同一個資源可以同時有系統指派與使用者指派身分。

系統指派:跟著資源同生共死 掛號網站+它的系統指派身分 建立網站時開啟 刪除網站 → 身分一起刪除 使用者指派:獨立資源,可共用 id-shared(使用者指派受控識別)+ 一次角色指派 函式應用程式 A 函式應用程式 B(中途刪除) 函式應用程式 C(後來加入) 要自己刪除 B 刪除後身分仍在,A、C 照常運作;新資源加入不必重新指派角色
上排的身分和網站綁在一起,網站刪掉就沒了,最不容易留下孤兒身分。下排的身分比任何一個應用程式活得久,所以適合「資源常重建、權限要固定」或「先授權再建資源」;代價是要記得在不用時自己刪除,並定期檢查它被指派給了哪些資源。

受控識別、服務主體與工作負載身分同盟怎麼選

受控識別只能用在支援它的 Azure 資源上(另外,透過 Azure Arc 連線的伺服器也能使用)。在 Azure 以外執行的程式,如果平台能發出 OpenID Connect 權杖(例如 GitHub Actions、其他雲端、Kubernetes),用工作負載身分同盟(workload identity federation):在應用程式註冊或使用者指派受控識別上設定同盟認證,讓外部權杖換成 Entra 權杖,不用保存任何密碼。做不到同盟時,才用應用程式註冊與服務主體,並優先使用憑證而不是用戶端密碼,且要自己負責到期與輪替。需要讓其他公司的租用戶同意授權的多租用戶應用程式,也是應用程式註冊的範圍。至於「人」登入,就用使用者帳戶、單一登入與條件式存取,不是受控識別的工作。

是人,還是程式? 使用者帳戶單一登入+條件式存取 在支援受控識別的Azure 資源上執行? 多資源共用、預先授權或常重建? 系統指派受控識別 使用者指派受控識別 平台能發出OIDC 權杖? 工作負載身分同盟例如 GitHub Actions 服務主體+憑證自己管理輪替 人程式是否 否是能不能
這張圖從上往下問兩到三個問題就能定案。實驗室二的十個情境都可以用它判斷;唯一要另外記的是:多租用戶應用程式要讓別的租用戶授權,只能用應用程式註冊。

判斷步驟

  1. 先分人與程式:人的登入用條件式存取管情境,程式用受控識別或其他工作負載身分。
  2. 條件式存取題:列出這次登入符合哪些原則(指派與條件全部符合才算),有封鎖就拒絕,否則所有授與控制都要滿足;被排除的使用者不受該原則影響。
  3. 檢查授權:用到登入風險或使用者風險就需要 P2;沒有 P1、只要全員 MFA 就用安全性預設值。
  4. 受控識別題:問程式在哪裡執行、身分要不要和單一資源同生共死、需不需要共用或預先授權。
  5. 最後確認授權:受控識別還要用 Azure RBAC 指派角色(例如 Key Vault Secrets User),Key Vault 要使用 Azure RBAC 權限模型,範圍盡量縮到單一資源。

容易考錯的地方

條件式存取在密碼之前執行:錯,第一因素驗證完成後才評估。

多條原則取最寬鬆:錯,套用的原則全部都要滿足,封鎖優先;同一條原則內的多個授與控制,預設是「全部都要」,可改成「其中一項」。

新原則直接開啟:建議先排除緊急存取帳戶、用僅限報告模式觀察,否則可能把所有系統管理員鎖在外面。

條件式存取取代 RBAC:兩者回答不同的問題,條件式存取管登入,Azure RBAC 管資源操作。

開了受控識別就能存取:還要角色指派;用 Key Vault 存取原則模型時,角色指派不會生效。

系統指派可以共用:不行,它只屬於一個資源;要共用、預先授權或資源常重建,選使用者指派。資源刪除時,系統指派身分一起刪除,使用者指派要自己刪除。

在 Azure 外也用受控識別:GitHub Actions 等外部工作負載用工作負載身分同盟;地端伺服器加入 Azure Arc 後才能使用受控識別。

相關考試:條件式存取出現在 AZ-900(身分與安全)、SC-900、SC-300、SC-500 與 SC-100;受控識別出現在 SC-500(Entra ID 與應用程式安全)、AZ-400(身分與機密)、AI-103 與 AI-300(以受控識別與 RBAC 存取 AI 服務),工作負載身分也是 SC-300 的一個領域。

✅ 自我檢測

以下 6 題都是原創題,選完會立即顯示對錯與解析,全部作答後會出現總分。目前得分:0 / 6