清理停用帳號
清理 Entra ID 中的停用帳號聽起來可能很無聊,但這是很重要的,因為每個帳號都是攻擊者可能進入的入口點。減少攻擊面積總是能提升你的安全性,因此鎖定或刪除這些帳號可以顯著改善你的資安防護。
如果你曾經接手過擁有大量這些「幽靈帳號」的租戶,你就會知道其中的風險—未使用的帳號對攻擊者來說是容易的目標,因為它們往往擁有過時的密碼和遺忘的權限。如果你不確定你的租戶中是否有停用帳號,那麼更應該去調查並採取行動。
為什麼停用帳號是個問題
帳號可能因為多種原因而變得停用。它們可能是被遺忘的帳號,用於你現在不再使用的設備或應用程式,或者是屬於離職員工或承包商的帳號。它們也可能是測試帳號或為短期用途創建的帳號,而這些用途現在已經過去。無論原因為何,這些帳號通常仍然保有對郵箱、SharePoint 網站、OneDrive 文件或應用程式的存取權限,而這些地方你可能不希望陌生人隨便瀏覽。更糟糕的是,這些停用帳號可能擁有弱密碼或沒有啟用 多重身份驗證(MFA),這樣就會成為憑證填充攻擊的開放邀請。
Entra ID 本身沒有內建的機制來幫你尋找或移除這些帳號。你可以手動檢查,但 Microsoft 不會幫你把這些帳號掃除。除非你採取行動,否則 Entra ID 會心甘情願地讓這些沉睡的帳號永遠存在。透過 PowerShell,我們可以找到這些帳號、停用它們,並設置定期清理——一切都能輕鬆搞定。
步驟 1:準備工具
在我們對使用者帳號進行處理之前,我們需要安裝 Microsoft Graph PowerShell 模組。如果你尚未安裝,可以使用以下指令來安裝:
powershell
複製編輯
Install-Module -Name Microsoft.Graph -Scope CurrentUser
這樣你就可以開始使用 Microsoft Graph PowerShell 模組 來管理和處理 Entra ID 相關帳號。
接下來,使用所需的權限連接到 Entra ID。執行以下指令:
powershell複製編輯Connect-MgGraph -Scopes "User.ReadWrite.All", "Directory.Read.All", "AuditLog.Read.All", "User.EnableDisableAccount.All"
這會觸發一個登錄提示;請使用具有足夠權限的帳號登錄,並準備好接受 MFA 挑戰。
步驟 2:找出「幽靈帳號」
這裡的關鍵是找出哪些使用者處於停用狀態。Entra ID 會追蹤每個使用者的 lastSignInDateTime 屬性,告訴我們他們最後一次認證的時間。我們將使用 Get-MgUser 來抓取這些資料,並過濾掉那些 60 天內沒有登入的使用者。為什麼是 60 天?這是個合理的時間界限——足夠長以涵蓋度假或休假,並且不會讓風險過高。如果你的組織有不同的需求,請根據需要進行調整。
以下是一段範例程式碼來達成這個目的:
powershell
複製編輯
$cutoffDate = (Get-Date).AddDays(-60)
$inactiveUsers = Get-MgUser -All -Filter "usertype eq 'member'" -Property DisplayName,UserPrincipalName,SignInActivity |
Where-Object { $_.SignInActivity.LastSignInDateTime -lt $cutoffDate -or $_.SignInActivity.LastSignInDateTime -eq $null }
這段程式碼會抓取所有使用者,提取他們的顯示名稱、UPN 和登入活動,然後過濾出最後一次登入時間早於設定的截止日期或從未登入過的帳號。在這個範例中,加入了 -All 參數,確保不會因為分頁而漏掉任何使用者;在較大的環境中,你可能需要使用分頁來避免限制過多請求並縮短執行時間。
你可以將結果以表格形式輸出,快速查看哪些帳號是停用帳號,像這樣:
powershell
複製編輯
$inactiveUsers | Select-Object DisplayName, UserPrincipalName, @{Name="LastSignIn";Expression={$_.SignInActivity.LastSignInDateTime}} | Format-Table
步驟 3:停用帳號
找到這些帳號只是成功的一半,現在我們來解決這個問題。我偏好通過封鎖它們的登入權限來處理這些帳號。你可能會問:
為什麼不直接刪除這些帳號?
有很多原因:郵箱和 OneDrive 的保留、Office 365 許可證管理和審計等,都可能要求你保持底層帳號物件的完整。封鎖登入可以讓你在某人突然說:“等等,我需要那個郵箱!”的情況下,輕鬆地恢復存取。
一旦你將 $inactiveUsers 填充為你想要停用的使用者名單,就可以使用 Update-MgUser 來更新這些帳號:
powershell
複製編輯
$params = @{ AccountEnabled = "false" }
foreach ($user in $inactiveUsers) {
Update-MgUser -UserId $user.Id -BodyParameter $params
Write-Host "Disabled account: $($user.UserPrincipalName)"
}
這段程式碼會遍歷我們的使用者名單,將 AccountEnabled 設為 $false,並確認該操作,並提供一些簡單的確認訊息。執行它,這些帳號將比你說出“安全漏洞”還快就被鎖定。
步驟 4:增加一些智慧功能
如果我們想跳過某些帳號,比如服務帳號,該怎麼辦呢?例如,如果你想排除帳號名稱以 "svc" 開頭的帳號,可以這樣做:
powershell
複製編輯
$exceptions = @("svc-*")
$inactiveUsers = $inactiveUsers | Where-Object { $_.UserPrincipalName -notlike $exceptions[0]}
這樣,這些例外帳號就會保持不受影響。你還可以將操作結果記錄到 CSV 檔案中以便未來參考,或進行任何其他你認為必要的通知或追蹤。
步驟 5:驗證並慶祝
在 Entra ID 入口網站中,隨便檢查幾個新停用的帳號,前往 Users > All Users,尋找「Account enabled」欄位(如果需要,可以將這個欄位加入視圖)。你新修改的帳號應該會顯示為「No」,表示帳號已被停用。
結語
雖然不活躍的帳號並不引人注目,但它們確實構成了一個真實的風險。使用 PowerShell,你可以輕鬆地建立一個可重複使用且無需過多人工操作的方式來保持你的 Microsoft 365 租戶精簡並有效。這篇文章的目的是提供一個範例,你可以根據自己的需求進行自定義。例如,你可以自動化定期執行這個腳本、加入報告、過濾掉特定的群組進行排除檢查。這些步驟應該可以幫助你啟動並運行!


Comments are closed, but trackbacks and pingbacks are open.