簡介
安全描述符包含自主決定的
訪問控制表(DACL),裡面包含有訪問控制項(ACE),因此可以允許或拒絕特定用戶或用戶組的訪問。它們還包含一個系統訪問控制列表(SACL)以控制對象訪問請求的日誌(logging)。ACE可以顯式套用於對象,或者從父對象繼承。ACE的順序在ACL中很重要,拒絕訪問的ACE應該比允許訪問的ACE更早出現。安全描述符還包含對象所有者。
字元串格式
安全描述符
字元串是一種用來存儲或
傳輸安全描述符中的
信息的文本格式,套用到SACL的安全描述符控制標記,sacl_flags使用和dacl_flags字元串相同的控制位
字元串。描述安全描述符的DACL或SACL包含的一個ACE項的
字元串。安全描述符
字元串中可以省略不需要的部分,譬如,如果輸入安全描述符中未設定SE_DACL_PRESENT標記,ConvertSecurityDescriptorToStringSecurityDescriptor的輸出字元串中將不包含D:部分。安全描述符
字元串不支持NULL ACLs。為表示一個空ACL,安全描述符
字元串中包含S:或D:標記而不含其他字元串
信息。
套用
檔案和資料夾的許可權可以使用各種工具編輯,這包括Windows Explorer、
WMI,以及命令行工具如
Cacls、XCacls、
ICacls、SubInACL,
免費的Win32控制台FILEACL,自由實用工具SetACL,以及其他實用工具。要編輯一個安全描述符,用戶需要有該對象的WRITE_DAC訪問許可權,該許可權通常默認授予
管理員和該對象的所有者。
數據結構
typedef struct _SECURITY_DESCRIPTOR { UCHAR Revision; UCHAR Sbz1; SECURITY_DESCRIPTOR_CONTROL Control; //其自身的一些控制位 PSID Owner; //Owner安全標識符(Security identifiers) 相當於UUID,標識用戶、用戶群、計算機帳戶 PSID Group; //Group安全標識符(Security identifiers) 相當於UUID PACL Sacl; //(System Access Control List),其指出了在該對象上的一組存取方式(如,讀、寫、運行等)的存取控制許可權細節的列表。 PACL Dacl; //(Discretionary Access Control List),其指出了允許和拒絕某用戶或用戶組的存取控制列表。 如果一個對象沒有DACL,那么就是說這個對象是任何人都可以擁有完全的訪問許可權。 } SECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR;typedef struct _ACL { BYTE AclRevision; BYTE Sbz1; WORD AclSize; WORD AceCount; WORD Sbz2;} ACL, *PACL;
獲取對象上的安全設定,或修改對象上的安全設定的Windows API。如:GetNamedSecurityInfo, SetNamedSecurityInfo,GetSecurityInfo, SetSecurityInfo。
底層安全描述符函式:
對於檔案、目錄、
郵槽、
命名管道,可以使用其專用函式GetFileSecurity和SetFileSecurity函式來獲取或設定檔案對象的SD,以設定其訪問許可權。
對於進程、執行緒、訪問token、檔案映射對象、
信號量、
事件、
互斥鎖、
可等待定時器,使用 GetKernelObjectSecurity與SetKernelObjectSecurity函式
對於Window Station與
桌面,使用GetUserObjectSecurity與SetUserObjectSecurity函式
對於註冊表鍵,使用RegGetKeySecurity與RegSetKeySecurity函式
對於Windows服務對象,使用QueryServiceObjectSecurity and SetServiceObjectSecurity函式
對於印表機對象,使用GetPrinter and SetPrinter函式的PRINTER_INFO_2結構參數。
對於
網路共享,使用NetShareGetInfo and NetShareSetInfo 的網路502級別。
對於進程創建的私有對象,使用CreatePrivateObjectSecurity, DestroyPrivateObjectSecurity, GetPrivateObjectSecurity and SetPrivateObjectSecurity函式