Windows 權限管理
基礎概念
管理者使用者是被授予高特權(安全令牌)的賬戶。
标準使用者是被授予标準權限(篩選令牌)的賬戶。
使用者與權限
在windows vista之前,使用者登入,就會建立一個安全令牌(security token),當代碼試圖通路受保護的安全資源時,os會出示這個安全令牌。從包括windows資料總管在内的第一個程序開始,這個令牌會與建立的所有程序關聯。
在windows vista及之後,使用者登入,若是使用管理者登入,則會建立兩個令牌,一個是安全令牌,一個是篩選令牌。篩選令牌隻被授予标準使用者的權限。從包括windows資料總管在内的第一個程序開始,這個令牌會與系統代表最終使用者啟動的所有新程序關聯。
UAC
- 标準權限的應用程式如何通路需要高權限的受限資源?
- 可以要求os提升權限,但權限隻能在程序邊界提升。也就是一旦程序啟動後,就不能提升權限, 程序在啟動時,它會與目前登入使用者的篩選令牌進行關聯。 應用程式提升權限方式
- 右鍵run as Admininstrator,若是管理者使用者,則 提升權限确認對話框。若是标準使用者,則 登入憑證對話框,要求輸入具有提升權限的賬戶的登入憑證。
- 提升權限确認對話框的三種類型:
- 藍色橫幅,應用程式是系統的一部分
- 灰色橫幅,應用程式進行了簽名
- 橙色橫幅,應用程式沒有簽名
程序提升權限方式 - 自動提升
- manifest嵌入到可執行檔案的資源中 (優先級高)
-
manifest儲存到可執行檔案的目錄中,名稱與可執行檔案相同,擴充名為.manifest
除通過xml manifest來明确設定所需的權限,os也會隻能判斷一個程式是不是安裝程式,若是,則提升權限對話框/登入憑證對話框,若不是安裝程式,則由最終使用者自行決定是否以管理者身份啟動程序(屬性->相容性)。
-
手動提升
ShellExecuteEx函數
權限上下文
如何判斷應用程式是否已管理者身份運作?
如何判斷使用的提升權限(安全令牌),還是使用标準權限(篩選令牌)?
- 先判斷程序使用的令牌是否是篩選令牌GetTokenInformation
-
在判斷程序運作的使用者身份是否是管理者
若是安全令牌(未篩選令牌,權限被成功提升),IsUserAnAdmin函數判斷是否管理者使用者。
若是篩選令牌,先擷取安全令牌的相關資訊看是否包含管理者的SID。
windows 完整性機制
安全描述符SID
通路控制清單ACL
系統通路控制清單SACL
在sacl中新增了強制标簽的通路控制項ACE,來為受保護的資源配置設定一個完整性級别(integrity level)。預設沒有ACE的安全對象,os預設其擁有Medium完整性級别。
每一個程序都有一個基于其安全令牌的完整性級别
完整性級别的比較在ACL之前(程序的完整性級别與核心對象的完整性級别)
級别 | 示例 |
---|---|
低 | IE |
中 | 預設使用中信任級别,并使用一個篩選過的令牌 |
高 | 若應用程式使用提升後的權限啟動,則以高信任級别來運作 |
系統 | Local System或Local Service的身份運作的程序,才能獲得這個信任級别 |
tools: AccessChk,可以列出通路檔案、檔案夾、系統資料庫項等各種資源所需的完整性級别。