当前位置: 首页 > news >正文

Windows认证和安全对象的基本概念

Windows认证和安全对象的基本概念

A access B,A就是访问的主体,B就是访问的客体。

A的访问令牌和B的安全描述符决定了A是否可以访问B。

访问的主体是进程。线程是程序执行的流程,线程是没有属于自己的权限的,它的权限来源于所属的进程。

访问的客体是安全对象,所有被访问的对象都有安全描述符,如文件、管道、注册表、事件(回想创建内核对象函数中的lpSecurityAttributes参数)

Token、权限和用户标识

进程的权限继承自创建进程用户和用户所属的用户组。用户有专用数据结构来表示权限—访问令牌(Access Token)。访问令牌包括两个部分:一个是令牌所表示的用户,包括用户标识符(SID),用户所属的用户组等;另一部分是“权限”(Privilege)。

在进程访问安全对象时,会用到 SID。每个安全对象都有访问控制列表(ACL),ACL 说明了哪些用户( SID)能访问本对象,哪些不能,以及能进行哪种访问等。而“权限”在访问某个具体的安全对象时并没有作用,“权限”是表示进程是否能够进行特定的系统操作,如关闭系统、修改系统时间、加载设备驱动等。

访问令牌的类型

Windows 中有两种主要的访问令牌类型:

  • 主令牌(Primary Token):与进程关联,代表进程的默认安全上下文。每个进程都有一个主令牌,由创建该进程的用户决定。
  • 模拟令牌(Impersonation Token):与线程关联,允许线程临时以另一个用户的安全上下文执行操作。这在客户端-服务器模型中非常常见,例如服务器线程在处理客户端请求时,可以模拟客户端的身份来访问资源。

权限(Privilege)详解

权限是系统级别的操作能力,常见的权限包括:

权限名称常量标识说明
关闭系统SeShutdownPrivilege允许进程关闭系统
修改系统时间SeSystemtimePrivilege允许修改系统时间
加载设备驱动SeLoadDriverPrivilege允许加载或卸载设备驱动
调试程序SeDebugPrivilege允许调试任何进程
备份文件和目录SeBackupPrivilege允许绕过文件权限进行备份
创建令牌对象SeCreateTokenPrivilege允许创建主令牌

权限默认是禁用的,进程需要通过AdjustTokenPrivileges函数显式启用。

创建进程时指定令牌

// 以指定用户的令牌创建进程BOOLCreateProcessAsUser(HANDLE hToken,// 用户令牌句柄LPCTSTR lpApplicationName,LPTSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCTSTR lpCurrentDirectory,LPSTARTUPINFO lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation);// 使用指定令牌创建进程(Windows Vista+)BOOLCreateProcessWithTokenW(HANDLE hToken,DWORD dwLogonFlags,LPCWSTR lpApplicationName,LPWSTR lpCommandLine,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCWSTR lpCurrentDirectory,LPSTARTUPINFOW lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation);

安全对象

在创建对象时都可以指定对象的安全属性,比如CreateFileCreatePipeCreateProcessRegCreateKeyExRegSaveKeyEx等,SECURITY_ATTRIBUTES结构用于指定对象的安全属性。

对象的安全属性是以安全描述符(Security Descriptor)的形式存在的,安全描述符中包括了访问控制列表。

SECURITY_ATTRIBUTES 结构

typedefstruct_SECURITY_ATTRIBUTES{DWORD nLength;// 结构大小,sizeof(SECURITY_ATTRIBUTES)LPVOID lpSecurityDescriptor;// 指向安全描述符的指针BOOL bInheritHandle;// 子进程是否继承该句柄}SECURITY_ATTRIBUTES,*PSECURITY_ATTRIBUTES;

使用示例:

SECURITY_ATTRIBUTES sa;sa.nLength=sizeof(SECURITY_ATTRIBUTES);sa.lpSecurityDescriptor=NULL;// 使用默认安全描述符sa.bInheritHandle=TRUE;// 允许子进程继承句柄HANDLE hFile=CreateFile(L"test.txt",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,&sa,// 传入安全属性CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

安全描述符的结构

安全描述符包含以下关键信息:

  1. 所有者 SID:标识对象的所有者
  2. 组 SID:标识对象所属的主组(主要用于 POSIX 兼容)
  3. DACL(自主访问控制列表):控制谁可以访问对象以及如何访问
  4. SACL(系统访问控制列表):记录访问尝试的审计日志

ACL(访问控制列表)

ACL 是安全描述符的核心组成部分,它由一系列访问控制项(ACE)组成。每个 ACE 定义了一个用户或用户组的访问权限。

DACL 与 SACL 的区别

特性DACLSACL
全称自主访问控制列表系统访问控制列表
作用控制访问权限(允许/拒绝)记录审计日志
默认行为无 DACL 时允许所有访问无 SACL 时不审计
ACE 类型允许 ACE、拒绝 ACE审计成功 ACE、审计失败 ACE

ACE(访问控制项)的结构

typedefstruct_ACCESS_ALLOWED_ACE{ACE_HEADER Header;// ACE 类型、标志和大小ACCESS_MASK Mask;// 访问权限掩码DWORD SidStart;// 用户/组的 SID}ACCESS_ALLOWED_ACE;

访问权限掩码示例

// 文件对象的常见访问权限#defineFILE_READ_DATA(0x0001)#defineFILE_WRITE_DATA(0x0002)#defineFILE_APPEND_DATA(0x0004)#defineFILE_READ_EA(0x0008)#defineFILE_WRITE_EA(0x0010)#defineFILE_EXECUTE(0x0020)#defineFILE_DELETE_CHILD(0x0040)#defineFILE_READ_ATTRIBUTES(0x0080)#defineFILE_WRITE_ATTRIBUTES(0x0100)// 标准访问权限#defineDELETE(0x00010000)#defineREAD_CONTROL(0x00020000)#defineWRITE_DAC(0x00040000)#defineWRITE_OWNER(0x00080000)#defineSYNCHRONIZE(0x00100000)

访问检查流程

当进程尝试访问一个安全对象时,Windows 安全引用监视器(SRM)会执行以下步骤:

  1. 获取访问令牌:从进程的主令牌中获取 SID 和权限信息
  2. 检查 DACL:遍历 DACL 中的 ACE,按顺序检查:
    • 如果遇到拒绝 ACE 匹配当前 SID →拒绝访问
    • 如果遇到允许 ACE 匹配当前 SID →允许对应权限
    • 如果遍历完 DACL 没有匹配项 →拒绝访问
  3. 记录审计:如果 SACL 存在,记录访问事件到安全日志

重要规则:拒绝 ACE 优先于允许 ACE。这意味着即使后面有允许 ACE,只要前面有拒绝 ACE 匹配,访问就会被拒绝。

实际应用示例

// 创建一个安全描述符,只允许管理员访问PSECURITY_DESCRIPTOR pSD=NULL;PACL pDacl=NULL;DWORD dwResult;// 初始化安全描述符pSD=(PSECURITY_DESCRIPTOR)LocalAlloc(LPTR,SECURITY_DESCRIPTOR_MIN_LENGTH);InitializeSecurityDescriptor(pSD,SECURITY_DESCRIPTOR_REVISION);// 创建 DACL,只允许 Administrators 组访问SID_IDENTIFIER_AUTHORITY SIDAuth=SECURITY_NT_AUTHORITY;PSID pAdminSID=NULL;AllocateAndInitializeSid(&SIDAuth,2,SECURITY_BUILTIN_DOMAIN_RID,DOMAIN_ALIAS_RID_ADMINS,0,0,0,0,0,0,&pAdminSID);// 创建 ACL 并添加允许 ACEdwResult=SetEntriesInAcl(1,&(EXPLICIT_ACCESS){.grfAccessPermissions=GENERIC_ALL,.grfAccessMode=GRANT_ACCESS,.grfInheritance=NO_INHERITANCE,.Trustee={.TrusteeForm=TRUSTEE_IS_SID,.TrusteeType=TRUSTEE_IS_GROUP,.ptstrName=(LPTSTR)pAdminSID}},NULL,&pDacl);SetSecurityDescriptorDacl(pSD,TRUE,pDacl,FALSE);// 将安全描述符应用到对象SECURITY_ATTRIBUTES sa={.nLength=sizeof(SECURITY_ATTRIBUTES),.lpSecurityDescriptor=pSD,.bInheritHandle=FALSE};HANDLE hFile=CreateFile(L"secure.txt",GENERIC_ALL,0,&sa,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);// 清理资源if(pAdminSID)FreeSid(pAdminSID);if(pDacl)LocalFree(pDacl);if(pSD)LocalFree(pSD);

总结

Windows 的安全模型基于三个核心概念:

  1. 访问令牌(Token):标识进程的身份和权限
  2. 安全描述符(Security Descriptor):定义对象的安全属性
  3. 访问控制列表(ACL):通过 DACL 和 SACL 控制访问和审计

理解这些概念是进行 Windows 系统编程和安全开发的基础。在实际开发中,合理设置安全描述符可以有效防止未授权访问,而正确使用访问令牌则能实现精细化的权限控制。

http://www.cnnetsun.cn/news/2648487.html

相关文章:

  • 【避坑指南】架构设计中的十大常见错误
  • 别再手动解密了!.NET 6 集成微信支付V3回调,用Senparc SDK和OSS.PayCenter两种方式搞定Native支付通知
  • Claude整数规划求解能力深度测评(2024权威Benchmark实测报告):7类经典模型准确率、耗时、可行性全对比
  • Claude Opus 4.8 实测:更精确、更诚实,但创作还是不如 4.6
  • UE5 Lumen发光材质制作指南:从创建Emissive Material到无光环境调试
  • 从参数配置到可视化:手把手教你用D435i和VINS-Mono在ROS Noetic里建个地图
  • VSCode Copilot 如何配置第三方API/自定义端点?
  • 3大优势解析WenQuanYi Micro Hei:极简中文开源字体如何重塑嵌入式开发体验
  • 企业级AI Agent记忆系统架构:短期与长期记忆如何实现存储与调用?
  • UniApp + Painter 避坑指南:保存图片到相册的权限问题和清晰度优化实战
  • Linux 环境变量超详细入门到精通(零基础完整版)
  • Airy光束自由传播光强仿真:Matlab一键运行生成2D/3D分布图
  • 2026年企业聊天通讯工具选型指南:四大阵营与决策框架
  • 事件驱动架构:实现松耦合的系统设计
  • 现在不评估Claude代码质量,下季度将面临审计否决——金融级静态分析SOP限时解密
  • 2026年国际物流管理系统深度测评:技术架构、选型逻辑与行业实践
  • Linux 文件权限超详细详解(读懂权限标识、数字权限、特殊权限、chmod/chown)
  • 中电金信分布式核心系统与鲲鹏实现“原生开发”,共筑数智金融新范式
  • SSM架构JavaWeb点餐系统源码(含MySQL建库脚本与可运行工程)
  • 网络工程- 如何组件一个小型办公室网络
  • 如何选择电钢琴?立体声音效与型号对比
  • 如何在浏览器中一键解锁加密音乐文件:告别平台限制的音乐自由方案
  • EasyBox下载与使用教程:无限制看全网影视资源(安卓)还支持聚合搜索
  • 书匠策AI到底是个啥?一个论文科普博主的深度拆解,看完你会回来谢我
  • Armbian挂载U盘时,中文文件名乱码怎么办?手把手教你解决FAT32/NTFS/exFAT编码问题
  • mac brew安装(国内)
  • AI 一键生成淘宝主图的软件有哪些?—— 电商视觉革命下的工具全景与选择指南
  • RTX-Tiny多版本库管理实践与Keil工程配置
  • nnDetection实战:手把手教你用Python在自家电脑上跑通第一个肺结节检测模型
  • 国产超宽带混频器打破垄断,水平国际先进,背后大有来头