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

目录

  • 一丶简介

    • 1.DACL是什么.
    • 2.如何创建一个自己控制的文件.
    • 3.SDDL是个什么鬼.
    • 二丶 编写SDDL 控制的文件

一丶简介

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)

MSDNhttps://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字符串不就是自己手动改改的事情.

原文地址:https://www.cnblogs.com/iBinary/p/11399114.html

时间: 2024-07-30 23:16:05

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

01 安装apache php配置 时区 环境变量 安装mysql 虚拟主机 文件夹访问权限 目录别名

php介绍 简介与历史 应用领域: php运行环境 php语言运行原理 安装apache: PHP的命令行运行模式(独立运行): 配置apache以运行php网页 配置php的基本运行环境 确定php配置文件(php.ini)的位置: 配置时区: 设置环境变量 检测apache配置文件语法 配置数据库连接机制 安装mysql数据库 虚拟主机配置 端口监听: 主机配置关键项 配置文件夹访问权限 主机别名设置 文件夹访问控制的文件控制方式 目录别名设置Alias 多站点配置: php介绍 简介与历史

命令行修改文件文件夹访问权限 cacls, 修改hosts内容方法

背景 日常使用Windows的过程中,hosts(C:\Windows\System32\drivers\etc)文件可能被一些程序串改,因此在网上找到禁止/允许修改hosts文件的bat脚本,但是在使用过程中有遇到了新的麻烦,特记录下相关问题的解决方法. 禁止/允许修改hosts文件的bat脚本 Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联"数据库",当用户在浏览器中输入一个需要登录的网址时,系统会首先自动

UNIX环境编程学习笔记(8)——文件I/O之校验当前登录用户对文件的访问权限

lienhua342014-09-03 通过前面一篇随笔(文件访问权限与进程访问控制),我们知道内核校验文件的访问权限使用的是进程的有效用户 ID 和有效组 ID.但有时我们需要知道当前登录用户对某个文件访问权限.虽然说进程的有效用户 ID 和有效组 ID 通常分别等于当前登录用户 ID 和用户所在组 ID.例如,一个进程可能因设置用户 ID 以另一个用户权限运行,它仍可能想验证当前实际登录的用户是否能否访问一个给定的文件. access 函数提供了按照实际用户 ID 和实际组 ID 进行访问权

[C]控制外部变量访问权限的extern和static关键字

一.extern 概述 编译器是由上至下编译源文件的,当遇到一些函数引用外部全局变量,而这个变量被定义在该函数声明主体的下方,又或者引用自其它的编译单元,这个情况就需要extern来向编译器表明此变量是一个外部变量 问题1.运用extern实现全局变量声明提升效果 #include <stdio.h> void fun(void); int main(void) { fun(); } void fun(void) { printf("%d\n", v); } int v =

关于heritrix安装配置时出现”必须限制口令文件读取访问权限”的解决方法

转载:http://www.floatinglife.cn/关于heritrix安装配置时出现必须限制口令文件读取访问 最近开始写一个RSS聚合程序,需要爬虫支持,于是就整来heritrix,没想到,这东西还挺拽,费了老衲好几个小时来安装配置这个heritrix.最后经过不懈努力,终于起来了,具体步骤如下:你如果在网上找相关配置,大多数都是讲先修改conf/properties文件的用户名和密码以及修改jmxremote.password.template,然后将其改名复制到heritrix根目

Linux更改目录及其子目录、文件的访问权限

修改某个目录及其下所有文件的权限,要使用-R参数,表示启动递归处理. 例如: #仅将/home/user/test目录的权限设置为rwxr-xr-x chmod 755 /home/user/test #表示将整个/home/user/test目录与其下所有的文件和目录的权限都设置为rwxr-xr-x chmod -R 755 /home/user/test

Linux下更改目录及其下的子目录和文件的访问权限

修改某个目录下所有文件的权限,如果子目录中的文件权限也要修改,则使用参数-R启动递归处理. 例如: 把/home/user目录的权限设置为rwxrwxrwx,不包括子目录: [[email protected] ~]# chmod 777 /home/user 把/home/user目录的权限设置为rwxrwxrwx,包括子目录: [[email protected] ~]# chmod -R 777 /home/user

C# 32位程序访问64位注册表

接上文:http://www.cnblogs.com/TaiYangXiManYouZhe/p/5086974.html 上代码: RegistryKey localKey; if (Environment.Is64BitOperatingSystem) localKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64); else localKey = RegistryKey.OpenBa

转 使用Python访问Windows的注册表

在Python的标准库中,_winreg.pyd可以操作Windows的注册表,另外第三方的win32库封装了大量的Windows API,使用起来也很方便.不过这里介绍的是使用_winreg操作注册表,毕竟是Python自带的标准库,无需安装第三方库. 下面的例子是通过Python获取Windows XP下已经安装的补丁号.Windows的补丁号都在"HKEY_LOCAL_MACHINE\SOFTWARE\\Microsoft\\ Updates"下,通过循环下面所有的目录节点,如果