代码改变世界

【翻译】Professional Windows7 Development Guide 章节之——理解基本的NT安全性

2011-03-26 16:41  刺客之家  阅读(1160)  评论(0编辑  收藏  举报

前言:最近做一个客户端软件项目,发现很多在XP下轻松运行的功能,到了Win7下出现了很多问题,一时间摸不着头脑,网上也找不着相关的解决方案。没办法只好找了本相关的书啃起来,还是E文的。在读的过程中感觉读E文书比中文书费时多了,于是想到把自己的理解分享出来,一方面方便一些想了解相关知识的人,一方面接收大家的指正,提高一下自己的认识。

下面开始:win7安全性理解文章翻译系列:

 

--------------------------------------------------------------------------------------------------------------------------

原文章节:Professional Windows7 Development Guide 一书:205~207页

--------------------------------------------------------------------------------------------------------------------------

(一)理解基本的NT安全性

很多人视Windows NT的安全性为一道编程障碍。然而,Windows NT安全性背后的思想很简单。当你离开家,你肯定会关门并上锁。这个锁就是你放置在屋子上的一种安全保护措施。只有一些有对应钥匙的人能够进入你的屋子。(让我们假设来访者并没有撬棍之类的工具-_-||) “锁”是一种访问控制,钥匙代表了一种准许访问这个屋子的“权限”。Windows NT 安全性就是以这样的方式工作的。

让我们进入你的屋子并更进一步:大门的锁只是第一层访问控制,你也可能会为你的卧室、保险箱、储物柜、或者其他需要额外访问权限的物品上锁。为他们上锁的主要原因是这些房间或者箱子里的东西是很重要的或者不安全的。你可不想你的孩子们随意动它们。要想访问这些重要的东西,你可能要得到更高的授权才能进行。换句话说,你可能会有不与任何人分享的东西。Windows NT安全机制以上述的方式工作:大多数资源提供了多级安全性设置,这个方式很多人赞成,当然同时也有人反感。

在Windows NT系统中,访问权控制体现于2种形式:1)一个用户拥有只属于自己的权限——就好像某人的钥匙环里的钥匙(只属于他自己)  2)一个用户也可以属于一个用户组,组内成员分享同样的权限——类似于门口的擦鞋垫,全家人都能使用。这对于理解“用户的权限受制于用户组与单独用户权限的结合”这一概念,相当重要。

权限可以被两部分人改变。管理员通常使用微软提供的工具来修改Windows系统配置达到修改用户权限的目的,比如下图的安全性编辑界面:

同样的,开发人员可以通过编写代码来为应用程序设置权限,当开发者把这种等级的权限与应用程序设置联系在一起(原文直译如此,译者也不是很明白,欢迎高手指正~),管理员就可以得到更好的权限控制而不失灵活性。管理员和开发人员所做的改动都会影响到程序使用资源(比如文件)进行一些特殊的任务。比如对一个文件来说,读取它的权限和写入他的权限是分开的。

用户级别的访问性控制依赖于“安全标识符”(Security IDentifier)SID,当用户第一次登录系统的时候,Windows给用户分配了一个“访问令牌”(Access Token),将用户的SID信息放入其中,(这些SID信息被保存在“域控制器”[注:原文名:Domain Controller,维基百科解释:http://en.wikipedia.org/wiki/Domain_controller]   或者其他安全数据库中)用户对象在会话持续过程中,始终随身携带着访问令牌和SID信息。一个访问令牌包含一个DACL(Discretionary Access Control List,发音“dackel”)和一个SACL(System Access Control List,发音“sachel”)。SID和访问控制列表ACLs (Access Control List)(译者理解ACLs包括DACL和SACL)构成了允许用户访问特定系统资源的钥匙。由于该访问权是持续于整个会话当中,所以当管理员修改了用户权限的时候,用户必须退出系统重新登录;另一方面,除了管理员授予的权限,用户不可能得到任何其他附加的权限。

再好的钥匙也要有锁来开才有用。(原文:"A key is no good without a lock to open",译者水平有限,欢迎指正~)设置于Windows资源上的锁有一个名字叫“安全性标识符”(Security Descriptor).实际上安全标识符描述了要访问一个资源用户所需要的权限,如果在ACLs里包含的权限符合或者超过了访问资源需要的权限,资源上的锁就会打开,资源变的可以使用了。

下图描述了ACL的内容,以及基于令牌的安全机制中的安全性标识符

 --------------------------------------------------------------------------------------------------------------------------

【未完待续……欢迎大家指正!】

本博客文章若非标记转载,均为原创,转载请注明出处~