• DACL原理.控制文件的访问权限(文件,注册表.目录.等任何带有安全属性的对象.)


    一丶简介

    1.DACL是什么.

    DACL称为自主访问的控制列表.是应用程序开发必要且重要的部分.由于空DACL 允许对所有用户进行类型的访问.所以一般程序开发中都是传入NULL

    比如创建文件
    原型:

    HANDLE CreateFileA(
      LPCSTR                lpFileName,
      DWORD                 dwDesiredAccess,
      DWORD                 dwShareMode,
      LPSECURITY_ATTRIBUTES lpSecurityAttributes,  安全属性
      DWORD                 dwCreationDisposition,
      DWORD                 dwFlagsAndAttributes,
      HANDLE                hTemplateFile
    );
    

    一般安全属性都是传入NULL. 所以创建的文件所有人可以访问.
    以文件举例.DACL是什么.
    在刚开始自己研究MSDN的时候也是搞不懂 什么事DACL SDDL安全属性描述符.
    ACE是什么.

    这里简单说下.

    DACL就是以自己的理解就是权限的集合. DACL有很多权限组成.这些权限成为ACE.

    如下:

    打开一个程序 右键->属性->安全则可以看到. DACL其实就是上图所说的那个组.自我理解.

    那么ACE是什么.上面说了. ACE是 ACL链表里面的一个子选项. 上面的DACL也是ACL.

    如上图.自我理解上面这些就是ACE选项.

    2.如何创建一个自己控制的文件.

    以MSDN举例子

    1.首先创建一个 安全属性结构体.(比如创建文件.文件中一般传入NULL.现在不传NULL)
    2.使用SDDL字符串对其进行初始化

    3.使用 使用 ConvertStringSecurityDescriptorToSecurityDescriptor 函数将SDDL字符串转为安全描述符.(就是那个结构体) 那个结构体的->LpsecurityDscriptor成员.
    而且使用这个函数.则将返回值发送到main函数.main函数使用
    更新过后的SECURITY_ATTRIBUTES 结构来创建文件.
    也就是说你使用函数.更改了安全属性.然后使用这个安全属性来创建文件.
    4.使用过之后要使用 localFree函数释放 lpSecurityDescriptor 申请的内存.

    PS: 要使用 Conver... 这种SDDL的函数.必须将 _WIN32_WINNT 常量定义为0x0500 或者更高.

    问题:
    根据上面MSDN所说.要使用SDDL字符串. 那么SDDL是个什么鬼.
    下面说.

    3.SDDL是个什么鬼.

    SDDL上面说书 是 安全描述符字符串格式 也就是说这个字符串是存储安全描述符(那个结构体)所需要记录的文本格式.

    还告诉我们两个函数

    ConvertSecurityDescriptorToStringSecurityDescriptor
    ConvertStringSecurityDescriptorToSecurityDescriptor
    

    根据词义就是说.一个是安全属性转化为文本格式(SDDL)
    两一个就是文本个数(SDDl)转化为安全属性描述.

    这里简单说一下吧. SDDL 是一个 NULL-Terminated结尾的字符串.
    主要分为四组:

    1.O: owner_sid 代表对象的SID字符串
    2.G: Group_sid 一个SID字符串.标识对象的主要组
    3.dacl_flags(ACE......)DACL信息.由ACE组成
    4.sacl_flags(ACE...) SACLxin

    刚开始看这个SDDL字符串.把我搞晕了.后来就明白了

    首先就是说SDDL 文本格式分为四组

    对象的SID字符串:组sid的字符串:DACL信息(ACE....):Sacl信息(ACE...)

    格式就如下:

    以MSDN给的解析一下.MSDN的解析把握搞晕了.自己后来弄好了

    
    "O:AOG:DAD:(A;;RPWPCCDCLCSWRCWDWOGA;;;S-1-0-0)"
    

    O: 代表 owner_sid
    AOG: 代表对象组的SID字符串
    DAD:(XXX): 代表的是DACL信息.
    Sacl没有.

    O: 代表对象的SID.可以看一下这一篇连接
    https://docs.microsoft.com/zh-tw/windows/win32/secauthz/sid-strings

    DAD:(A;;RPWPCCDCLCSWRCWDWOGA;;;S-1-0-0)
    

    这个字符串是什么意思
    首先DAD 根据MSDN所说.让我们参考 SetSecurityDescripTorControl函数. 说是他的控制位.找了一圈没找到有用的信息.
    暂且不管.其实主要的就是后面后括号里面的内容.
    这些内容代表的是权限.是你访问的权限. 是ACE信息.

    关于这个看一下 ACE Strings即可. 里面有说这个ACE是来组成SDDL的权限的.
    而且还说了ACE Strings代表的字段是什么.

    ace_type;ace_flags;rights;object_guid;inherit_object_guid;account_sid;(resource_attribute)
    

    MSDN https://docs.microsoft.com/zh-tw/windows/win32/secauthz/ace-strings

    截取一部分ACE String

    暂时了解这些.看下如何编程

    二丶 编写SDDL 控制的文件

    SDDL可以转化为安全属性 使用这个安全属性来创建文件就可以生成你自己控制访问的文件了.

    
    #include <windows.h>
    #include <AclAPI.h>
    #define _WIN32_WINNT 0x0500
    #pragma comment(lib,"Advapi32.lib")
    
    
    
    BOOL CreateMyDACL(SECURITY_ATTRIBUTES *);
    
    void main()
    {
        SECURITY_ATTRIBUTES  sa;
    
        sa.nLength = sizeof(SECURITY_ATTRIBUTES);
        sa.bInheritHandle = FALSE;
    
        // Call function to set the DACL. The DACL
        // is set in the SECURITY_ATTRIBUTES 
        // lpSecurityDescriptor member.
        if (!CreateMyDACL(&sa))
        {
            // Error encountered; generate message and exit.
            printf("Failed CreateMyDACL
    ");
            exit(1);
        }
    
        // Use the updated SECURITY_ATTRIBUTES to specify
        // security attributes for securable objects.
        // This example uses security attributes during
        // creation of a new directory.
       
        HANDLE hFile = CreateFile(TEXT("D:\1234.txt"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ, &sa, CREATE_NEW, NULL, NULL);
        // Free the memory allocated for the SECURITY_DESCRIPTOR.
        if (NULL != LocalFree(sa.lpSecurityDescriptor))
        {
            // Error encountered; generate message and exit.
            printf("Failed LocalFree
    ");
            exit(1);
        }
    }
    
    
    BOOL CreateMyDACL(SECURITY_ATTRIBUTES * pSA)
    {
     
        TCHAR * szSD =(TCHAR*) TEXT("D:(D;OICI;GRGW;;;BA)");    
                                         
    
        if (NULL == pSA)
            return FALSE;
    
        return ConvertStringSecurityDescriptorToSecurityDescriptor(
            szSD,
            SDDL_REVISION_1,
            &(pSA->lpSecurityDescriptor),
            NULL);
    }
    
    

    这里主要是看 CreateMyDacl这个函数内部的SDDL安全属性描述符字符串.

    这里解析下:
    根据ACE String.可以得出格式.如上所说.

    ace_type;
    ace_flags;
    rights;
    object_guid;
    inherit_object_guid;
    account_sid;(resource_attribute)
    
    
        解析ACE字符串: 
        (D;OICI;GRGW;;;BG)       
        D 代表拒绝还是允许.		也就是ACE的类型.这里可以控制你的用户的是允许还是拒绝
        OICI: 代表 对象继承  还是容器继承 一般是子继承有关.子对象是否可以集成
        GR:  代表只读权限. 也就是 rights GA是所有权限 GW可写 GX可执行
        BG: 是一个SID字符串. 代表的是 内置客人用户,相应的 BU是内置用户 BA是内置管理员 可以根据上面所说.查询SID 字符串代表的意思
    
    

    我这里的代码是创建了文件.DACL是我自己控制的.

    根据ACE字符串格式可以得出我的文件安全权限为:
    1.是一个拒绝访问的用户
    2.是一个允许 对象继承还有容器继承的.
    3.是有可读可写的属性的.
    4.使用的BA 说明是内置管理员

    看下文件安全属性.

    此时我们的文件可读可写 但是管理员能不能访问.

    是不是变相的就给文件加了保护了. 不能管理员访问.但是可以其他用户来操作.或者允许管理员访问.但是只能只读.不能写. 那么你这个文件是不是就不能删除了.
    如下.代码修改了一下. 改为 可读 可访问.
    这里只给出 SDDL描述符语言.

    TCHAR * szSD =(TCHAR*) TEXT("D:(A;OICI;GR;;;BA)");    
    

    此时文件只能可读了.

    如果想要添加新的用户.可以继续参考MSDN的创建DACL一章.
    理解了原理. SDDL字符串不就是自己手动改改的事情.

  • 相关阅读:
    【PHP设计模式 08_CeLue.php】策略模式
    【PHP设计模式 07_ZeRenLian.php】责任链模式
    【PHP设计模式 06_GuanChaZhe.php】观察者模式
    【PHP设计模式 05_DanLi.php】单例模式
    【PHP设计模式 04_GongChang.php】 工厂方法
    【PHP设计模式 03_JianDanGongChang.php】 简单工厂
    【PHP设计模式 02_JieKou.php】面向接口开发
    区块链学习-开始
    erc721-165学习
    cryptopunks的代码解释
  • 原文地址:https://www.cnblogs.com/iBinary/p/11399114.html
Copyright © 2020-2023  润新知