Windows Vista User Account Control (UAC) 全新安全模块“用户帐户控制”
微软将在几天后发布全新的Vista操作系统,我们在过去的几个月里面也见到了很多有关Vista中强大功能的演示,又玄又酷的界面,方便快捷的搜索;但是一切的玄酷都将归于平淡,用户最关心的还是系统的安全性,可用性等最实际的内容。
用户帐户控制UAC就是微软为Vista操作系统全新设计的安全保护模块,它的主要目的是要保护用户在交互状态下不受恶意软件和代码的攻击。
如果我问大家,有多少人正在使用管理员帐户登陆电脑,我想80%以上的人会回答是;特别是对正在屏幕前的你来说(我估计看着篇文章的多数会是开发人员)。至少我的程序员们都在使用系统管理员级别的用户名,而且他们拥有网络上的最高权限。其实这也很正常,对于开发人员来说,我们需要随时访问很多的系统资源,才能跟快捷的解决问题。但是程序员的电脑的从装率可能也是最高的,起码我在过去的3个月中间从新安装了至少4次。究其原因,就是因为我们的工作环境太不安全了,如果我在工作中使用了恶意软件,它将获得我系统上的最高权限,并且为所欲为;管你什么系统文件,注册表,统统变成了案上之肉。
针对这种情况,微软提出了这个UAC的系统,它可以保证任何人在登陆到电脑的时候都运行在标准用户权限之下,就算你是管理员。其原理其实很简单,当任何用户登录电脑的时候,UAC会把用户的高级权限剥离,只留下标准权限,并启动登陆进程;这样用户只能用这些标准的权限来启动电脑,进一步的说,用户所启动的程序也就只能拥有这些标准的(安全的)权限。
那么,如果我需要做更高权限怎么办?Vista在这里也提供了一个简单的方式以临时提升用的权限:
在Vista中,我们会经常遇到这个对话框,而且会比较反感;但是任何的安全性都是有代价的。 另外一种对话框可能大家见的不多,就是当你以一个普通用户身份登陆的时候,将遇到下面的对话框,要求一个管理员来进行授权:
注:这里使用的界面和RTM中的有细微差别,RTM版本中的对话框不会显示系统上的用户名,而需要用户输入。这样可以进一步的保护管理员的信息。如果你的系统支持smart card,那么呢这个对话框中还会出现划卡的选项。
这其实和我们经常在超市里遇到的情况相似,收银员需要退款的时候往往都需要当班经理的授权;我们管这种情况叫做现场授权,Vista在这里就借鉴了这种方式,从而免除了管理员需要从新登陆,或者使用Run As来进行高权限的操作。
Vista还会使用不同的对话框和不同的颜色来标识不同安全级别的操作,对于Vista可以识别的应用程序,会使用比较平和的颜色,如:蓝色(系统操作),灰色(可识别的应用程序),橙色(无法识别的应用程序)。
橙色:无法识别的应用程序需要权限提升
灰色:可识别的应用程序需要权限提升
在Vista系统上运行的应用程序都应该使用数字签名,Vista系统也会使用数字签名来对应用程序进行识别并使用不同的安全警告级别。
在Vista中,所有需要提升权限的地方都会出现一个小盾牌的标志,以提醒用户下面的操作需要更高的权限,比如:修改系统时间的操作:
注意上图中被加亮的部分。
Vista中的所有需要权限提升的部分都必须使用这个标志,而且这个标志不会因为你进行了一次提升就消失掉,也就以为这权限提升都是临时的,没有解锁状态。
从系统的架构上,Vista使用独立进程来运行更高权限的操作,比如上图中的按钮如果别点击的话,那么Vista会启动一个全新的进程来运行所打开的对话框;这样从根本上保证了高权限进程的独立性;并且,在进程管理上,Vista中的普通进程是不能和高权限进程通信的,进一步保证了这些进程的安全。
两个窗口,两个进程。
对于普通的应用程序来说,如果不对UAC进行相应的处理,那么也就无法获得管理员权限,意味着你所编写的应用程序永远只能运行在普通用户的低权限环境之下。针对这种情况,有两种办法可以解决:
1) 使用”Run As Administrator”
对于现有的应用程序,如果因为权限问题无法在Vista上正常运行的话,可以使用这个方法来临时获得管理员权限。
你可以用右键点击,选择”Run Administrator”来临时启动高权限进程。
或者还可以对文件进行标识,告诉系统每次都这样启动:
注:这里还有其他的选项,可以针对程序作出更多的兼容性配置
2) 使用manifest来标识运行级别(建议方式)
这是微软推荐使用的方式,当前的Vista对于没有标识的应用程序还是支持的,但是微软计划在后面的版本中取消这些支持,那时候如果要在Vista上使用你的应用程序,那必须有以下的标识才可以:
<requestedExecutionLevel level="requireAdministrator"/>
</requestedPrivileges>
除了requireAdministrator以外,我们还可以使用asInvoker,highestAvailable两个选项进行标识。