Windows Vista UAC经典误解之三:Linux早就有这个功能了!
大凡苹果或Linux的粉丝,一听到UAC,就会不由地生出些许先前阔的自信:这算什么呀,我们早就有这个功能了,而你们Windows直到Vista才实现!
盆盆评注:在Linux或者Mac机器里,如果以普通用户身份,而非root身份登录系统,这时候如果执行管理任务,就会弹出如附图所示的对话框,要求输入root用户的密码,如果输入密码正确,就可以有权执行相应的管理任务。
看起来Windows Vista的UAC和Unix-Kind OS的这个功能有几分类似。例如在标准用户下登录时,如果执行管理员任务,也会弹出对话框,请用户输入管理员凭据。
然而,如果仔细分析其中的内部原理,发现两者实际差别很大。
1. 安全风险
直接输入管理员(root)凭据是一个非常危险的操作,因为用户无法分辨这是由系统弹出的对话框,还是由恶意代码伪造的。
Windows Vista的凭据输入对话框实际上运行在安全桌面上,这样就可以防止恶意代码伪造鼠标点击。
同时如果需要,还可以设置安全策略,只有用户按下“Ctrl+Alt+Del”组合键,才能出现凭据输入对话框。这是因为,在Windows下,只有Winlogon进程(TCB部分)才可以接受并处理这个键盘事件,其他任何进程都不行。
从这一点来看,Windows Vista的凭据输入的可靠性相当高,其实现和Linux相比,并不一样。
2. 灵活性
在Linux或者Apple,通常只有一些系统内置的管理任务,才会触发凭据输入对话框。而Windows Vista,允许第三方应用程序在manifest里指定应用程序的运行级别。
就算是系统内置的管理任务,根据用户的需求,有时候并不一定必需管理员权限。例如Windows下的系统服务,在标准用户下,可以直接打开,查看服务的运行状态和说明,而不需要管理员权限。
3. 最大的区别
UAC和Linux下的实现,最大的区别在于:Windows Vista就算以管理员帐户登录,默认还是只有标准用户权限,这样的话,可以体现最小特权的原则。
如果需要执行管理任务,则会弹出UAC对话框,这时候无需输入管理员凭据,直接单击继续或者允许即可。因为不需要输入管理员凭据,所以更加安全。
就算用户不懂UAC的含义,在所有的弹出对话框上都单击允许,那也会获得相当的安全。因为至少还有很多应用程序运行在标准用户权限下,减少这些应用程序对系统的破坏。至少可以降低受攻击面。
Linux的root用户,则没有这个特点。
再来说说Selinux
以下的评论摘自盆盆回复在远景上的帖子,稍作部分修改:
盆盆阅读了由RedHat官方提供的有关MAC和SELinux的文档,发现Windows Vista的安全功能,和SELinux确实有一些类似的地方。
但是两者的实现差别比较大。
盆盆评注:这里的MAC(强制访问控制)和苹果的那个MAC没有任何关系。
SELinux简述
SELinux实际上是把进程和文件、目录、设备等都划分不同的类型。然后借助事先定义好的策略,再配合传统的访问权限检查,来达到最小程序特权的目的。这样的话,就算某个进程被攻破,恶意代码拿到了root权限,也没有用,因为它只拿到该进程所对应类型的root权限,而非整个系统的root权限。
举个例子,拿Apache这个Web服务器来说,如果不想以默认的/var/www/html目录作为根目录,则必须确保新的目录的类型为“httpd_sys_content_t”,才能确保Apache具有正确的访问权限。
Windows安全简述
由于Windows的安全子系统的实现和Unix-kind的OS有一些差异。
Windows的安全有两个方面,验证和授权,也就是进程的访问令牌和资源的访问控制列表。
资源的访问控制列表,等同于Unix-kind的传统权限。而进程的访问令牌则记录了该进程的运行帐户身份,属于哪些用户组,具有哪些全局的特权,然后Windows安全子系统把进程的访问令牌和资源的访问控制列表,进行逐项匹配,以确认是否具有权限。
到了Windows Vista,系统新增了三个安全特性,UAC、MIC和UIPI。
MIC(强制完整性级别控制),则是把进程和资源,都划分不同的等级,低等级的进程,不能访问高等级的资源,哪怕资源的访问控制列表允许这么做。MIC的机制,和Selinux有点类似。
UIPI(用户界面特权隔离),则是不允许低等级的进程,给高等级的进程发送窗口消息,这样就可以阻止诸如粉碎攻击一类的行为。
盆盆认为,UAC、MIC和UIPI的功能,符合MAC的安全定义:
1. UAC可以让进程默认运行在中等级别,只能访问标准用户所能访问的资源,这样就算进程被攻破,也只能影响到该用户本身,而不会对整个系统或者其他用户造成影响。
而IE浏览器的进程,由于级别最低,就算被攻破,也无法造成危害,甚至对登录用户的User Profile都没有影响,因为登录用户的User Profile的资源级别是中等,低等级的IE进程无法写入中等级别的资源对象。
2. Windows Vista中的安全特性,相比SELinux来说,优点在于:
无须针对每个进程、文件和目录设置类型以及访问策略,而预设的策略又不可能满足所有的定制化要求,例如很多Linux用户抱怨SELinux对Apache等造成影响。
而Windows Vista默认让所有进程运行在标准用户的级别,而需要管理权限的任务,会自动弹出确认框,确认即可提升进程的级别。这样就减少了用户手动配置的需要,这对于end-user来说,是个好消息。
3. 然而,目前的Windows Vista主要缺陷有以下两点:
(1)可配置性比较差,无法对管理任务配置策略,以便下次运行时不要弹出UAC提示。当然微软这样做是有原因的,防止恶意程序调用合法程序干坏事。
(2)对于进程的级别,目前只能把IE进程设置为最低级别(实际上就是IE保护模式),其他进程默认是中级。
当然目前来说,也只有IE的安全威胁最大,但是今后,应该需要把其他的高危险进程设置为最低级别。
盆盆评注:使用Mark Russinovich制作的Psexec工具,可以让其他进程运行在IE保护模式的级别,但是这样做的意义很小,因为几乎90%的应用程序都无法很好地运行在Low的级别。因为IE保护模式绝非仅仅是一个安全特性,它更加值得称道的是兼容性(它能够做到现在的这个状态,盆盆认为很不容易),而非仅仅是安全级别。
综合评判
看到这里,相信大家已经明白,Windows Vista的UAC和Selinux并非一码事,两者的实现差别很大,然而殊途同归,最终目的是一样的。
还有一点很重要,本文并没有说两者的实现,孰优孰劣。因为使用场合不一样。Selinux的使用场景主要是针对Linux的服务器,而UAC主要是针对桌面OS。
1. Selinux需要手动配置,这很麻烦,但是一旦配置以后,就可以一劳永逸,这是Linux的一贯优点。但是如果使用环境有变化,就得需要手动进行重新配置,所以这更加适合用在服务器环境中,而也许不是桌面环境。
2. UAC适合桌面OS,因为用户无需进行手动配置,只需用鼠标点击,而且使用场景发生变化,对用户没有影响。但是很显然,UAC不适合服务器OS,因为服务器OS大多数是无人值守的,谁会帮你点击弹出对话框?所以UAC在Windows Server Longhorn上是默认禁用的。
最后还得补充一句,很多朋友嫌UAC麻烦,为什么不能设置策略,下次不要再发出提醒?其实因为Windows无法区分启动进程的需求是用户发起的,还是其他进程所调用的,所以没有办法进行区分。今后随着ISV都按照UAC规范进行开发,麻烦会越来越小,相信大家平时应该不会每天都要执行N个管理任务。
尽管UAC确实麻烦些,但是我们平时一般不可能经常执行管理任务。UAC不仅可以阻止恶意程序,还能防止一些合法的软件有意无意破坏系统(有些合法软件,由于开发的缺陷,可能无意中破坏系统)。所以应该开启UAC,小小的麻烦,可以换来安全,何乐不为?