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\n");
        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\n");
        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字符串不就是自己手動改改的事情.


免責聲明!

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



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