从访问控制的观点谈windows的多用户

本文涉及的产品
访问控制,不限时长
简介:

前面从历史的角度简单谈了一下linux的多用户机制,主要了解到linux的多用户是与生俱来的的,而且unix的多用户也是历史促就的,也是生来就有的,但是如果从访问控制的角度来阐释多用户概念的话,那说的就该多了,毕竟从某种意义上来讲,之所以引出多用户的概念,就是因为需要访问控制,也就是为了“不是自己的东西不要乱动”,其实也正是因为有很多用户要操作计算机才需要访问控制。如果要从访问控制的角度谈多用户的话,那么就要说说windows的多用户机制了,也就是它的基于角色的多用户机制,不过在说windows之前,还是先说说linux的访问控制。

linux的多用户是基于对资源进行保护的,这里面抽象出来几个概念,一个是主体,就是访问对象即资源的执行绪,可以理解为进程(unix/linux进程的意义),一个是主角,也就是主体代理的实体,主角可以理解为用户,另一个就是对象,也就是linux中的资源,是被访问控制限制访问的被动实体,在linux中一切皆文件,那么这里的对象也就是文件了。这里面的事实是,一切操作都是进程来进行的,一切资源也是进程来访问的,说哪些资源哪些进程不能访问是没有意义的,只有当用户(主角)绑定到进程(主体)时,访问控制才开始起作用,这时用户即主角和对象即资源之间就有了访问控制,这里面有两层意思,一层是在用户这边,说明一个用户可以访问以及如何访问资源,另一层意思就是一个资源可以被哪些用户访问以及如何访问,这两层意思里面第一层意思就是unix传统的“能力”的概念,第二个意思就是“访问控制列表(ACL)”,注意,访问控制和进程没有太大的关系,只是在用户和资源之间展开,就好像凶手杀人和刀没有关系,只是和持刀的人和被杀的人有关,刽子手和杀人犯都拿同样的刀,杀的都是人,然而意义不一样,因此进程也就是个主体而已,它必须代表某一个主角后才可以行使权力,进行操作。以上的unix/linux上的访问控制和多用户就引出了windows上的基于角色的多用户的概念。

windows的多用户其实不是与生俱来的,因为它不需要面临多终端,它也不用承担大型计算,它生来直接就是面向最终用户的,因此多用户在windows上的意义也就是一个访问控制,而和多终端,虚拟化,多道程序设计没有关系。但是它的基于角色的访问控制的多用户却比unix复杂的多的多,熟悉人-机标尺的人应该都知道,windows的安全策略应该处于人-机标尺的人的这一端,而unix/linux的应该是机器那一端。在linux中,能力机制和资源的acl这两个关卡就可以拦住一切,之所以可以做到就是因为unix/linux在机器那一端,它保护的是统一的vfs的文件,而不是大千世界的种种。简单的说,windows的访问控制策略就是unix能力机制的超级版本,因为windows是通过限制主体/主角的方式来进行访问控制的,在windows中为了实现这样的访问控制,先将操作分类,然后将一批操作以允许或者拒绝的方式给一个“角色”,表示该角色可以或者不可以进行这个操作,一旦有主体(线程)启动,也就是调用了CreateThread,那么首先要初始化一个安全描述符,关于细节我们一会再谈,然后初始化一个访问令牌,要访问被动对象时,先看令牌中有没有允许,允许的话再看被动对象的安全描述符中的ace中是否允许该主体访问之,如果允许,则继续访问,否则出错。

在linux中,一个进程即主体拿着一个用户标识就可以走天下了,因为它要访问的就是文件(一切皆文件),而这个用户能否访问尽在文件的acl中了,但是到了windows下,一个主体即进程/线程访问一个对象,就不是拿着一个用户标识了,而是一个令牌,这个令牌拥有比linux中用户标识更多的信息,包括SID,然后主体在访问一个对象的时候,安全管理机构会将令牌中的SID和被访问对象的安全描述符中的ACE中的SID相比较,然后查出该SID可以许给的所有操作,最终完成访问控制。windows的多用户的概念就是由此引出的,就是为了访问控制,一个windows登录用户拥有一个唯一的SID,然后登录后的用户得到一个shell(很多情况下是explorer.exe),随之产生的用户进程(主体)均由此SID产生访问令牌,然后访问对象,比如文件,设备,进程等等。windows在创建新用户的时候就为该用户初始化好了一个结构体,用于在该用户登录的时候生成安全相关的结构,这就是windows的多用户机制,看到了吧,基于角色的,这里一个角色就是一个操作的集合,windows并不是尝试在被动的被访问对象上设置单一的一次性设置完毕的访问控制列表来永久生效访问控制,而是在实际要访问的时候通过主体的令牌和对象的安全描述符动态监测访问控制,令牌也好,安全描述符也好,都是创建对象的时候动态生成的,而不像linux那样通过chmod等等静态设置的。这里正好引出windows的一个很特别的特性,如果说unix/linux是一切皆文件的话,那么windows就是“一切皆对象”了,每个对象都可以拥有自己独特的安全信息,这样的话就可以符合丰富(繁复)的应用需求。

在linux中,创建进程就是fork,创建线程就是clone,创建文件就是open,看看它们的参数,一个比一个简单,没有任何安全相关的东西,也就是说在linux中,安全仅仅是一个对象的属性,它的设置和创建该对象是分离的,再次显示小颗粒的优势(劣势?);在windows中,所有东西都是对象,而在创建对象的时候,必然要有一个参数,那就是“安全描述符”的指针,也就是参数LPSECURITY_ATTRIBUTES lpSecurityAttributes,比如CreateFile,CreateProcess,CreateThread等等,安全是一切的首要因素,因此在创建对象的时候就要将添加安全属性作为创建对象的一部分来进行,这样就不会给任何不安全因素留下任何的空隙来钻。在windows中,进程和线程不再像unix/linux中那样被赋予很重要的地位,它们在windows中也仅仅是一个对象而已,从设计上讲,一切皆对象也就不再反对进程之间互相直接访问了,其实原始的进程架构(其实就是unix的)就是指明进程之间要地址空间隔离,是十分反对进程之间直接互访的,可是windows的一切皆对象将进程的意义向前推进,进程不是什么特殊的东西,它就是个对象,只要访问者获得访问令牌,而且进程对象的安全描述符中允许访问者访问,那么访问就是允许的,看来windows一切皆对象的思想改变了进程的意义,同时也改变了操作系统的意义。windows设计的先后顺序就是一切皆对象是最基本的,其次在此基础之上实现了基于角色的访问控制,然后为了方便产生了基于角色的用户的概念。最后记住,windows的多用户就是由访问控制而产生的,它不是由于真的需要多个用户同时使用计算机这个需求而提出的概念,因此它的实现比较“策略”化一些。

接下来可以看一下linux和windows的“组”的概念,两个系统都有这个概念,但是实现却大相径庭,在linux中,组就是一组用户,比如web服务相关的配置文件和程序被列为web组,在windows中,组就是一组特权,将一些操作列为一个组,然后分配一个安全结构,比如SID和其他结构,这其实是一个中间层,进一步分类罢了,之所以两个系统有区别是因为它们在人-机标尺上的位置不同。

其实windows十分安全,它总是有问题是因为用户,而不是因为操作系统本身。windows的安全就是对象的安全,而对象的安全全部都在封装于对象的安全描述符中,而又有多少人真的在意过这个安全描述符,多少人甚至国人写的windows的书上都忽略掉创建对象时的安全参数,如此一来一路的默认的危险设置,还怪系统不安全,不是系统不安全,而是人们没有安全观念。windows的策略就是使用户迷失于复杂的操作,具有讽刺意味的是,人们对于安全性的复杂操作并不买账,倒是有很多人会去读ms word这样的操作手册来熟练那些复杂的文档操作。想想看,windows的安全机制之所以在人-机标尺的左边就是因为它兼顾了人的习惯,它是面向人的,而linux在人-机标尺的右边,这样的话,它在某种程度上对用户是不可见的,透明的,对于windows用户,必须十分清楚这一点,否则这些人的系统将十分危险,面向机器的策略可以由系统完成,可是面向人的策略必然不能指望系统,看看对象创建函数的安全参数,那正是“面向人”的体现,如果你忽略了该安全参数,那么系统安全也将忽略了你。

Windows的复杂的访问控制机制有的时候真的比linux的更加安全,比如windows中的用户账户的sid是随即分配的,而linux的却是根据提供的信息创建的,也就是说,linux中的uid以及gid在提供信息相同的情况下是相同的,而windows却是通过一个伪随机数生成的sid,因此,当把一个账户删除以后,windows中也会删除这个用户的一切权限,即使你用相同的信息再创建一个相同名字的账户,那么其权限信息也将全部丢失,但是unix/linux中却是无条件保留root账户,然后动态管理别的账户,如果我删除账户b,然后再创建b,那么原来b的权限将全部保留,毕竟linux中是通过简单的文件系统的uid/gig的acl进行管理的,相反windows中就只有两类账户,一类是管理员账户一类是受限账户,所有的权限都是动态生成,如此看来,好像不好管理这些信息,其实很简单,windows中的受限账户的权限都是动态生成的,因为windows基于对象,因此对象的安全描述符起了很大的作用。


 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1273453


相关实践学习
消息队列+Serverless+Tablestore:实现高弹性的电商订单系统
基于消息队列以及函数计算,快速部署一个高弹性的商品订单系统,能够应对抢购场景下的高并发情况。
云安全基础课 - 访问控制概述
课程大纲 课程目标和内容介绍视频时长 访问控制概述视频时长 身份标识和认证技术视频时长 授权机制视频时长 访问控制的常见攻击视频时长
相关文章
|
Windows
Windows Server 2012 R2多用户远程连接配置步骤
Windows Server 2012 R2多用户远程连接配置步骤
791 0
|
Windows
Windows系统设置多用户同时远程登录
Windows系统设置多用户同时远程登录
671 0
|
安全 Windows
Windows XP SP3中远程桌面实现多用户登陆
1 【原创】Windows XP SP3中远程桌面实现多用户登陆     现在电脑我想都可以在远程控制和远程协助了吧(xp,sp2,sp3),现在一个问题,你想远程操控你的电脑,但是你电脑有人用,你好意思让他退出~然后你在远程控制?呵呵,下面Star我为他家说说sp3多用户控制的弄法~~sp2这些都类似~具体没有试。
1396 0
|
Windows
Windows server 2008 R2实现多用户远程连接
经常使用远程桌面的朋友可能会注意到,Windows server 2008 R2中,远程桌面最多只允许两个人远程连接,第三个人就无法连接过去,但是生产环境中有一些服务器可能有许多人需要连接上去,而微软的设置确实让人比较无 奈,所以呢,今天就简单介绍一下在Windows Server 2008 R2上如何实现多用户远程连接同一台服务器。
1498 0
|
Windows
Windows2008/2012多用户同时远程连接终端服务授权
Windows服务器多用户同时登录问题,仅提供要点,其它自行百度: 1,Windows Server 远程桌面默认只能2个连接 2,安装终端服务(远程桌面会话主机)、终端授权(远程桌面授权) 3,终端服务可以不限同时连接用户数,但是120天内必须激活授权 4,120天到期后,删改注册表下的项也许能够再次得到119天(实测1次),据说可能导致系统崩溃。
1168 0