热门问题
时间线
聊天
视角
安全描述符
来自维基百科,自由的百科全书
Remove ads
安全描述符(英語:Security descriptors)是安全資訊的數據結構,用於可安全(securable)的Windows對象,這些對象可以被唯一名稱辨識。安全描述符可用於任何命名對象,包括檔案、資料夾、共用、登錄檔鍵、處理程序、執行緒、命名管道、服務、工作對象以及其他資源。[1]
簡介
安全描述符包含自主決定的存取控制串列(DACL),裡面包含有訪問控制項(ACE),因此可以允許或拒絕特定使用者或用戶組的訪問。它們還包含一個系統訪問控制列表(SACL)以控制對象訪問請求的紀錄檔(logging)。[2][3]ACE可以顯式套用於對象,或者從父對象繼承。ACE的順序在ACL中很重要,拒絕訪問的ACE應該比允許訪問的ACE更早出現。安全描述符還包含對象所有者。
套用
檔案和資料夾的權限可以使用各種工具編輯,這包括Windows Explorer、WMI,以及命令列工具如Cacls、XCacls、ICacls、SubInACL[5],免費的Win32控制台FILEACL[6][7],自由實用工具SetACL,以及其他實用工具。要編輯一個安全描述符,使用者需要有該對象的WRITE_DAC訪問權限[8],該權限通常預設授予管理員和該對象的所有者。
數據結構
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函數
 
例子
#include <windows.h>
void main(void)
{
	SECURITY_ATTRIBUTES sa;  //和文件有关的安全结构
	SECURITY_DESCRIPTOR sd;  //声明一个SD
	BYTE aclBuffer[1024];
	PACL pacl = (PACL)&aclBuffer; //声明一个ACL,长度是1024
	BYTE sidBuffer[100];
	PSID psid = (PSID)&sidBuffer;  //声明一个SID,长度是100
	DWORD sidBufferSize = 100;
	char domainBuffer[80];
	DWORD domainBufferSize = 80;
	SID_NAME_USE snu;
	HANDLE file;
	//初始化一个SD
	InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
	//初始化一个ACL
	InitializeAcl(pacl, 1024, ACL_REVISION);
	//查找一个用户hchen,并取该用户的SID
	LookupAccountName(0, "uidp1078", psid,&sidBufferSize, domainBuffer,&domainBufferSize, &snu);
	//设置该用户的Access-Allowed的ACE,其权限为“所有权限”
	AddAccessAllowedAce(pacl, ACL_REVISION, GENERIC_ALL, psid);
	//把ACL设置到SD中
	SetSecurityDescriptorDacl(&sd, TRUE, pacl, FALSE);
	//把SD放到文件安全结构SA中
	sa.nLength = sizeof(SECURITY_ATTRIBUTES);
	sa.bInheritHandle = FALSE;
	sa.lpSecurityDescriptor = &sd;
	//创建文件
	file = CreateFile("d:\\testfile",0, 0, &sa, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0);
	CloseHandle(file);
}
Remove ads
參見
參考資料
外部連結
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads