欢迎光临 C++Builder 研究! 本站主要面向软件开发者(Developer/Programmer), 提供 C++Builder, Delphi, C/C++, VC++ 等相关的资料。发布信息请致信给
编程文档
本站首页 www.ccrun.com | 编程文档 |   关键字:

文件系统驱动编程基础篇之8——安全机制

关键字:文件系统驱动编程,安全机制

作者:wskjuf    更新:2008-10-06 22:15:45    浏览:22123

文件系统驱动编程基础篇之八——安全机制

文件系统驱动编程基础篇之八——安全机制

一、前略

    本系列文章为业余编程爱好者而写,仅仅作为初学者的一个借鉴,真正的精华存在于参考资料*中。知识的积累将经历从薄到厚,再从厚到薄的反复过程,为了打下牢固的基础,请读者务必在阅读本文的基础上花费必要的时间完成参考资料。

参考资料*:
1.《Programming Windows Security》(中文版为《Windows安全性编程》)
2.《Microsoft? Windows? Internals, Fourth Edition》(中文版为《深入解析Windows操作系统》)第八章
3.《深入研究Windows内部原理系列之九:Windows的安全机制和实现》(该系列视频难度不大,但有着提纲挈领的作用)
4.《Programming Microsoft Windows 2000 Unleashed》(中文版为《Windows2000编程技术内幕》)第七章
5.《Programming Applications for Microsoft Windows》(中文版为《Windows核心编程》)3.1.2节
6.《Writing Secure Code》
7.《Microsoft Windows Security Inside Out for Windows XP and Windows 2000》(中文版为《精通Microsoft Windows 2000和Windows XP安全技术》)
8.《Creating a Security Descriptor for a New Object in C++
9.《Enabling and Disabling Privileges in C++
10.《Converting a Binary SID to String Format in C++》
11.《Windows 操作系统中的常见安全标识符
12.《威胁和对策
13. WRK1.2(Windows操作系统的教学简化版本)
14. NTFS-3G Stable Read/Write Driver

阅读基础:不限。

本章目的:了解系统的安全体系、基本的数据结构和安全函数。


二、用户模式下的安全结构

    请先观看资料3的视频,了解Windows系统安全体系的基本框架,接下来我们为资料4理清脉络:

    一)安全描述符

    CreateFile、CreateProcess、RegCreateKeyEx这些常用的函数都有一个安全属性参数,安全属性主要包含着对象的安全描述符。这里需要强调的是安全描述符是针对对象而言的,用于描述对象的安全性信息,它是我们接触到的第一支主线的纲。下图表达了安全描述符和各子结构的关系,读者不要立即陷入结构的细节中去,可暂时把每个结构都当成一个黑盒来看待。



privilege特权,对系统相关操作而言的能力,比如是否允许关机、加载设备驱动、修改系统时间等,包含在访问令牌中
The right of a user to perform various system-related operations, such as shutting down the system, loading device drivers, or changing the system time. A user's access token contains a list of the privileges held by either the user or the user's groups.

access right 访问权力,对对象而言的,和特权的区别需要实践来体会
A permission granted to a process to manipulate a specified object in a particular way (by calling a system service). Different system object types support different access rights, which are stored in an object's access control list (ACL).

security identifier 安全标识符
(SID) A data structure of variable length that identifies user, group, and computer accounts. Every account on a network is issued a unique SID when the account is first created. Internal processes in Windows refer to an account's SID rather than the account's user or group name.

access control entry (ACE) (acl分为sacl和dacl,acl可包含着多个ace,ace描述了特定sid拥有的访问权力)
An individual entry in an access control list (ACL). An access control entry (ACE) contains an SID and describes the access rights to a system resource by a specific user or group of users. Each object has a set of all ACEs, which is used to determine whether an access request to the object is granted.

discretionary access control list 用来确定谁可以访问对象,谁不能访问对象,详看资料2的5小节
(DACL) An access control list that is controlled by the owner of an object and that specifies the access particular users or groups can have to the object.

system access control list 跟系统资源有关,详看资料2的7小节
(SACL) An ACL that controls the generation of audit messages for attempts to access a securable object. The ability to get or set an object's SACL is controlled by a privilege typically held only by system administrators.

trustee 受托人
The TRUSTEE structure identifies the user account, group account, or logon session to which an access control entry (ACE) applies. The structure can use a name or a security identifier (SID) to identify the trustee.

ACE类型:


// 本文转自 C++Builder研究 - http://www.ccrun.com/article.asp?i=1061&d=ipj3xo
Attribute

Description

ACCESS_ALLOWED_ACE

Grants specified rights to a user or group. This ACE is stored in a discretionary ACL (DACL).

ACCESS_DENIED_ACE

Denies specified rights to a user or group. This ACE is stored in a DACL.

SYSTEM_AUDIT_ACE

Specifies what types of access will cause system-level audits. This ACE is stored in a system ACL (SACL).

typedef struct _SECURITY_DESCRIPTOR {

PSID Owner; // 个体,注意这些都是指针,而不是结构
PSID Group; // 所属组
PACL Sacl;
PACL Dacl;
} SECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR;

typedef struct _SECURITY_ATTRIBUTES {
DWORD nLength;
LPVOID lpSecurityDescriptor; // 指向安全描述符

} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;


    二)令牌

    令牌(Token)是第二支主线的纲。在用户登录系统并完成密码的验证后,系统就为该用户创建了一个访问令牌(access token)。
?

    访问令牌分为两种:主令牌(primary token)和模拟令牌(impersonation token)。访问令牌包含了SID,用户所属组的ID,用户权力(right)和用户特权(privilege)等安全信息。
    每个进程都有这个用户访问令牌的副本,每个线程也可以有自己的访问令牌,但如果没有的话,它将使用进程的访问令牌。
    当线程需要访问一个对象时,系统默认使用主令牌。如果某线程——如服务线程——模拟了客户来访问对象时,系统将为该服务线程创建模拟令牌,模拟令牌保存着客户的安全信息,服务线程用模拟令牌来访问安全对象。因此,模拟了客户的服务线程将同时拥有主令牌和模拟令牌。
    打开进程的令牌的招牌动作:

HANDLE hToken;

OpenProcessToken(GetCurrentProcess(),
    TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
    &hToken);


    三)ACTRL_ACCESS

    ACTRL_ACCESS用于设置对象和其属性的ACL列表。但笔者建议在熟练掌握了前两个内容后再考虑是否有必要学习这个结构。


    四)SID

    SID是一个可变长的数据结构,用来标识用户或组。
    SID的典型字符串表示形式为“S-R-I-S”,以字母S打头,R表示修订号,现在都是1,I表示授权(Authority,6bytes),S表示子授权(SubAuthority),因为子授权个数不定,所以整个SID的长度是可变的,结构里使用了“子授权数”域来表示SID包含了多少个子授权。
    知名SID(well-known SIDs)是一组系统已经预定了的常用SID,如Everyone(S-1-1-0),Administrators(S-1-5-32-544)SID等,详见资料11。创建知名SID可用CreateWellKnownSid函数,示例参见Msdn。

    资料3关于安全结构的主要内容已经介绍完毕,请读者在资料8的示例基础上总结出使用安全描述符的一般步骤(注意它并没有直接操作ace,而是通过trustee,同时注意ace的继承性),以资料9的示例学习如何调整令牌里的特权,以资料4的示例学习如何使用模拟令牌。

三、内核模式下的安全

    请先阅读资料2,这些论述来自于Windows源代码和文件系统驱动代码的总结,完全建立在实践的基础上。读者如果无法理解这些内容,也完全没有必要强记,因为很幸运,这些代码已经不是秘密了,你所需要的仅仅是将自身的能力提高到能够理解它们的水平。
    用户模式下的安全归根结底都要表现为内核模式下的安全控制,如DACL的本质就是对object的访问控制。下两图分别表示了对象访问以及系统审核策略(audit policy)的处理流程。

?

    安全描述符仍然出现在内核模式下(没有白学呢^_^),除此之外,也出现了安全上下文这个术语,今后在编程实践中,将可能碰到IO_SECURITY_CONTEXT、SECURITY_SUBJECT_CONTEXT这些结构。

security context
The security attributes or rules that are currently in effect. For example, the current user logged on to the computer or the personal identification number entered by the smart card user. For SSPI, a security context is an opaque data structure that contains security data relevant to a connection, such as a session key or an indication of the duration of the session.

    文件系统驱动对IRP经IO堆栈传递进来的参数,也要进行安全性的检测,此时会调用如SeAccessCheck的一系列内核安全函数。

四、结语

    至此基础篇就全部结束了,原计划中的文件分配表等内容都放弃了,被忽略了的同步和链表技术虽然颇为重要,但参考资料已经写得足够清晰,关键在于实践中的掌握。内核中与文件系统有着密切联系的几大系统组件——I/O、Memory、Cache管理器等,将在今后的文章中重点讲解。
    今天我们第一次提及了WRK,它是微软为高等院校讲授操作系统理论而提供的简化Windows内核,而NTFS-3G是为非Windows操作系统实现读写NTFS格式的开源驱动,以后我们或许将提及它们的一些细节。
    网游,炒股,泡MM,除了这些事情,工作之余的你是否思考过如何使自己的生活变得更有意义,更加充实?

上篇文章:文件系统驱动编程基础篇之7——端口读写
下篇文章:浅析C++中内存分配的方式
相关搜索:
  中搜索“文件系统驱动编程基础篇之8——安全机制 ”相关内容
  中搜索“文件系统驱动编程基础篇之8——安全机制 ”相关内容
  中搜索“文件系统驱动编程基础篇之8——安全机制 ”相关内容
  中搜索“文件系统驱动编程基础篇之8——安全机制 ”相关内容
  中搜索“文件系统驱动编程基础篇之8——安全机制 ”相关内容
  中搜索“文件系统驱动编程基础篇之8——安全机制 ”相关内容
C++Builder 研究 - http://www.ccrun.com © 2001,2011  总访问量: 43667530  来访IP: 23.20.54.196  晋ICP备05000574号
Tags: Borland CodeGear Embarcadero C++Builder Delphi VC++ C/C++ RAD Studio BCB BDS Source Code VCL MFC COM SDK Components Controls Developer Programmer 编程学习资料 源代码 源程序 源码 编程文档 经验技巧 组件 控件 元件 开源 函数 软件开发 一切尽在C++Builder研究!