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

 

posted on 2016-07-07 13:38  the_owl  阅读(6538)  评论(0编辑  收藏  举报

导航