windows訪問控制列表 --ACL(Access Control List)


1、定義  

  ACL是一個windows中的表示用戶(組)權限的列表。

  Access Control List(ACL)

Access Control Entry(ACE)
...

 

 

2、分類

  ACL分為兩類

    1,Discretionary Access Control List (DACL)  自由訪問控制列表

    2,System Access Control List (SACL) 系統訪問控制列表

DACL是 安全對象(securable object) 的一個屬性(我的理解),用來表示 安全對象 的訪問權限的列表。

  當一個進程試圖訪問一個安全對象時,系統會檢查該對向的DACL中的ACE。

  如果該對象沒有DACL,允許任何訪問。

  如果有DACL,但是其中沒有ACE,拒絕所有訪問。

  DACL控制訪問控制的詳細原理 https://msdn.microsoft.com/en-us/library/aa446683(v=vs.85).aspx

SACL是系統中的一個列表,用來記錄指定用戶(組)、指定類型的訪問的訪問結果,並記錄。

3、操作

  為了保證ACL語法正確,ACL的修改必須通過指定的函數,不能直接修改。

  1,描述ACE的結構體

typedef struct _EXPLICIT_ACCESS {
  DWORD       grfAccessPermissions;
  ACCESS_MODE grfAccessMode;
  DWORD       grfInheritance;
  TRUSTEE     Trustee;
} EXPLICIT_ACCESS, *PEXPLICIT_ACCESS;

  2,查看某用戶訪問權限

    (1)調用 GetSecurityInfo GetNamedSecurityInfo 得到對象的ACL(可選返回 DACL或 SACL)

DWORD WINAPI GetSecurityInfo(
  _In_      HANDLE               handle,
  _In_      SE_OBJECT_TYPE       ObjectType,
  _In_      SECURITY_INFORMATION SecurityInfo,
  _Out_opt_ PSID                 *ppsidOwner,
  _Out_opt_ PSID                 *ppsidGroup,
  _Out_opt_ PACL *ppDacl,
  _Out_opt_ PACL *ppSacl,
  _Out_opt_ PSECURITY_DESCRIPTOR *ppSecurityDescriptor
);
DWORD WINAPI GetNamedSecurityInfo(
  _In_      LPTSTR               pObjectName,
  _In_      SE_OBJECT_TYPE       ObjectType,
  _In_      SECURITY_INFORMATION SecurityInfo,
  _Out_opt_ PSID                 *ppsidOwner,
  _Out_opt_ PSID                 *ppsidGroup,
  _Out_opt_ PACL                 *ppDacl,
  _Out_opt_ PACL  *ppSacl,
  _Out_opt_ PSECURITY_DESCRIPTOR *ppSecurityDescriptor
);

    (2)調用 GetEffectiveRightsFromAcl ,將(1)中的ACL指針作為參數,得到某用戶的訪問權限

DWORD WINAPI GetEffectiveRightsFromAcl(
  _In_  PACL         pacl,
  _In_  PTRUSTEE     pTrustee,
  _Out_ PACCESS_MASK pAccessRights
);

 

  3,添加ACE到某個對象的ACL

    (1)調用 GetSecurityInfo 或 GetNamedSecurityInfo 從對象的安全描述符中(security descriptor)得到ACL(可選返回 DACL或 SACL)

    (2)調用 BuildExplicitAccessWithName 初始化一個ACE(也可以一個個屬性賦值初始化ACE),若有多個要加入ACL,則將_EXPLICIT_ACCESS構造數組

VOID WINAPI BuildExplicitAccessWithName(
  _Inout_  PEXPLICIT_ACCESS pExplicitAccess,  //傳入待初始化的_EXPLICIT_ACCESS,初始化后返回
  _In_opt_ LPTSTR           pTrusteeName,
  _In_     DWORD            AccessPermissions,
  _In_     ACCESS_MODE      AccessMode,
  _In_     DWORD            Inheritance
);

 

    (3)調用 SetEntriesInAcl ,將自己要加入的ACE數組(_EXPLICIT_ACCESS數組)並入一個ACL

DWORD WINAPI SetEntriesInAcl(
  _In_     ULONG            cCountOfExplicitEntries,  //數組中元素個數
  _In_opt_ PEXPLICIT_ACCESS pListOfExplicitEntries,   //數組指針
  _In_opt_ PACL             OldAcl,            //若為空,則構造一個新的ACL;若不為空,則將該ACE(數組)並入該ACL
  _Out_    PACL             *NewAcl
);

 

    (4)調用 SetSecurityInfo SetNamedSecurityInfo,將自定義的ACL並入該對象的安全描述符。

DWORD WINAPI SetNamedSecurityInfo(
  _In_     LPTSTR               pObjectName,
  _In_     SE_OBJECT_TYPE       ObjectType,
  _In_     SECURITY_INFORMATION SecurityInfo,
  _In_opt_ PSID                 psidOwner,
  _In_opt_ PSID                 psidGroup,
  _In_opt_ PACL  pDacl,
  _In_opt_ PACL  pSacl
);
DWORD WINAPI SetSecurityInfo(
  _In_     HANDLE               handle,
  _In_     SE_OBJECT_TYPE       ObjectType,
  _In_     SECURITY_INFORMATION SecurityInfo,
  _In_opt_ PSID                 psidOwner,
  _In_opt_ PSID                 psidGroup,
  _In_opt_ PACL  pDacl,
  _In_opt_ PACL  pSacl
);

 

  參考

  ACL創建修改 https://msdn.microsoft.com/en-us/library/aa446596(v=vs.85).aspx

  ACL查看 https://msdn.microsoft.com/en-us/library/aa446659(v=vs.85).aspx

  原文 https://msdn.microsoft.com/en-us/library/aa374872(VS.85).aspx

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM