好奇的探索者,理性的思考者,踏实的行动者。
Table of Contents:
这是个非常普遍、且远远没有得到重视的问题。根据俺的经验,如果你能够养成好习惯,不使用高权限用户(尤其是管理员)进行日常操作,就可以大大降低被黑的概率。
如果你平时总是用管理员权限登录到系统并进行日常工作,那就意味着你所运行的每一个程序,同时也具有了管理员权限。要知道,管理员权限的权力是很大的,几乎可以干任何事情。
假设你有上述习惯。某天,你从网上下载了一个软件,且软件已经感染了病毒。那么,当你运行这个软件时,这个病毒就会被激活。要命的是,它也同样具有管理员权限。这时,病毒就获得了和杀毒软件平起平坐的地位。假如这个病毒的作者水平再高一些,甚至可以骗过杀毒软件或者直接把杀毒软件干掉。
除了病毒,木马也是一样。假设你上网的时候,一不留神访问了某个挂马的网站。一旦木马被激活,也同样是以管理员的权限运行,危害同样也巨大。
为了让用户省事儿,Windows 系统内置了若干用户组(比如:Users、Power Users、Guests、等)。这些内置的用户组,事先已经预定义好若干用户权限。
另外,顺便消除一个误解。很多菜鸟以为:Windows 系统中,只有用户名为“Administrator”的用户才具有管理员权限。其实捏,任何一个用户,即使用户名不叫“Administrator”,只要是属于“Administrators 组”,也同样具有管理员权限。
拿 Windows 系统来说,为了尽量少用高权限用户。你最好刚装好系统之后,单独创建一个非管理员用户。
* “Power Users组”与“Administrators 组”的差别
相对于 Administrators 组,Power Users 组缺少了如下几项权限(俺只列主要的):
1. 不能添加、删除、禁用系统中的其它用户。
2. 不能修改其它用户的属性(包括口令、所属的用户组、等)
3. 不能安装/卸载硬件驱动程序。
4. 不能安装/卸载某些应用软件。
5. 不能查看系统的安全日志。
通常来说,越安全的措施,往往也意味着越麻烦。但是这些麻烦,都有相应的解决之道。
* 切换用户的麻烦
假设俺当前处于一个普通用户的环境,但是想另外启动一个具有管理员权限的程序,比如说命令行程序(cmd.exe)。
1. 首先,俺先创建一个指向 cmd.exe 的快捷方式。
2. 用鼠标选中该快捷方式,在快捷菜单(右键菜单)中,选择属性-->高级-->以其他用户身份运行-->然后在该对话框中输入管理员的用户名和口令,就能以管理员的身份,把该命令行启动起来
安装软件/驱动的麻烦
最主要的问题就是安装软件和安装驱动。安装驱动程序通常需要用管理员权限才行;另外,很多软件(比如 MS Office)在安装时,也要求用管理员权限的用户进行安装。
俺的建议是:
在刚装好系统之后,先用管理员用户把上述这些软件/驱动程序都搞好。然后,就无需再用管理员用户了。毕竟你经常使用的软件相对固定,不可能三天两头安装软件或驱动(除非你是软/硬件发烧友)。即便偶尔需要重新装个软件或驱动,也可以用上述介绍的方式,临时切换到管理员权限。
修改系统时间的麻烦
如果你平时用的是“Users 组”而不是“Power Users 组”,那你连修改系统时间的权限也没有。
俺的建议是:
启用 Windows 系统自带的时间同步服务,让它帮你自动同步系统时间。
所谓的“弱密码猜解”,就是说:如果你的密码比较弱,攻击者可以猜出来。这种攻击手法,对于操作系统用户口令、网络应用口令、本地应用口令,都适用。而且攻击者在盗取口令的时候,通常会先尝试进行弱口令猜测。为啥捏?
因为大部分用户都不太具有安全意识,口令都会比较简单(比较弱)。并且,根据二八原理,绝大多数的傻瓜用户会使用极少数的弱口令。所以,攻击者先把最流行的那些个弱口令挨个试验一遍,没准就已经成功了。
比如:123456 asdf123 qwer123
除了对弱密码进行猜解,攻击者还可以通过穷举的的方式,破解中等强度的密码。所谓的穷举法,就是把所有可能的字母/数字的组合都试验一遍,直到找到正确的密码。
现在 CPU 的计算能力日新月异,尤其是多核 CPU 普及之后,暴力破解的效果会越来越好。除非你的密码很强,才能彻底消除暴力的风险。
由于这种攻击手法,需要进行成千上万次的试错,所以比较适合针对本地应用的口令(比如破解加密的压缩文件),而不太适合对网络应用进行在线口令破解。
在这种方式下,攻击者会通过【嗅探】的方式,分析你的上网数据。如果你在上网过程中,存在明文传输的口令,就会被截获。
这几年,随着现在无线网络(WiFi)的普及,网络嗅探的风险大大增加,列位看官切不可掉以轻心哦。
所谓“客户端截获”,通常是针对网络应用的口令而言。举几个例子。
例1:
很多网友上网时,为了免去输入口令的麻烦,会让浏览器帮忙记住口令。通常浏览器会把这些口令保存在某个文件中(可能以明文方式,也可能以密文方式)。如果某天你的电脑中了木马,那么木马程序有可能会盗走这个保存口令的文件。然后攻击者就可以通过分析该文件,破解出你保存过的所有网络应用的口令。
例2:
如果你是软件公司的开发人员,多半你会使用某种源代码版本管理工具(比如 SVN、CVS、等)。为了免去每次操作时输入口令的麻烦。通常开发人员会让这些客户端软件记住用户名和口令。如果哪天你中了木马或者电脑被盗,那么攻击者同样可以破解你保存下来的口令,进而用你的身份盗取源代码。
凡是利用口令进行验证的软件系统,都需要存储和口令相关的信息。否则的话,软件系统就无法验证用户输入的口令,到底是不是正确的。如果攻击者能够拿到这些口令的关联信息,那他/她就有可能分析出口令是啥。
通常用三种方式来存储口令的关联信息:1、存储口令的明文;2、存储口令经过加密后的密文;3、存储口令的散列值。
第一种方式是最土鳖的,稍微先进一些的系统,都不会用了。后面两种方式,虽然看不到明文,但是攻击者还是有可能通过某种技术手段,反推出口令的明文。具体细节,本文就不再多说了。
那攻击者如何获得存储在软件系统的口令关联信息捏?比如黑客把这个网站入侵了,获得了数据库的所有数据。
比如:某个 Linux/Unix 服务器存在安全漏洞,攻击者利用此漏洞搞到了“/etc/shadow”文件。那么攻击者就可以采用上述提到的暴力破解的招数,攻破该服务器上所有强度较弱的口令。
说完了技术手段,自然就得再说说【非】技术手段。所谓的非技术手法,也就是社会工程学手法。用于盗取密码的社会工程学手法,大概有如下几种。
* 偷窥
偷窥是最简单的一种社会工程学攻击手法。虽然简单,但是有效。比如很多盗取银行卡的家伙,就是偷窥的手法,得到被害人的银行卡密码。
* 钓鱼
另外一个骗取口令的方式,就是通过网络钓鱼。比如某些攻击者,会伪造一个银行的网站。其界面和真实的网站一模一样。然后通过某种方式(比如:虚假链接、欺诈邮件、DNS 欺骗 ...),引诱你到这个网站上。由于假网站和真网站的界面很像,你可能信以为真,然后在假网站中输入你的用户名和密码。
有些高明的钓鱼网站,会采用类似Web代理的技巧:把你的所有输入操作,转而提交给真网站;然后把真网站输出的界面,再转回给受害者看。这样的话,受害者就跟在真实网站进行插作,没啥区别,不易看出破绽。
* 分析
如果攻击者对你比较了解,那么他有可能通过深入的分析,攻破你的口令防护。是不是觉得很神奇?很匪夷所思?其实这种招数很常见,且不算太难。俺来举个例子。
相信很多网友都用过电子邮箱的找回口令功能。当你口令遗忘之后,可以通过回答事先预设的问题,来找回口令。很多不太专业的用户,预设的问题都很简单(比如:你的手机号是多少?比如:你的生日是哪天?)。对于这类过于简单的问题,攻击者可以很容易地找到答案,从而窃取到你的邮箱口令。
* 欺骗
最近几年,通过电话诈骗,骗取银行卡密码的案例越来越多。这种作案手法,就属于社会工程学中,“欺骗”的范畴。其实在IT领域,某些黑客也会利用这种手法来获取口令。
俺发现有相当多的同学喜欢靠一个口令包打天下。这是相当相当危险的事情。同一个口令,用的场合越多,则泄密的危险越大。而一旦泄露,你的安全防线就会全面崩溃。
所以,今天要讲的头一个要点,就是绝对不要在所有(大多数)场合,使用同一个口令。
由于共用口令存在很大的风险,比较稳妥的办法就是——每一个场合仅使用一个密码。但是很多人会抱怨说:这样会很繁琐,增加了很多的麻烦。那如何才能做到既安全,又不太麻烦捏?这就要引入密码的分级机制。
根据安全圈内一个人所共知的常识:越安全的措施,通常也就越麻烦,成本也高;反之亦然。另外,根据二八原理,非常重要口令毕竟只占少数。所以,就像电影要有分级机制一样,你的密码/口令也要引入分级的概念。通过分级机制,对大多数不太重要的口令,可以采取简化的安全措施;而对少数重要的口令,采取高度安全的措施。
下面,就来介绍一下,如何对不同的口令,进行分类。
所谓不重要的口令,就是说万一被盗了或者忘记了,对你没啥损失。
比如,俺经常碰到一些土鳖的论坛,只允许注册会员从上面下载附件。因此俺就经常临时注册一个账号,然后登录上去下载东西。这类账号,基本上都属于一次性的(用完即扔),所以重要程度很低。
对于那些不重要的口令,基本上不用考虑太多安全性的因素。随便设置一个即可。
对于重要的口令,还要根据其使用的频繁程度,再区别对待。有些口令虽然重要,但是使用的频度很低。由于这类口令很少使用,所以设置得麻烦一些,问题也不大。
比如俺管理的一些研发的服务器(比如源代码服务器),其重要程度非常高,但是平常基本无需登录。
最后这类口令,既重要,又经常用。所以,设置这类口令就比较讲究。要同时兼顾安全性和易用性。
前面已经说了:口令太简单,容易被破解。但是太复杂的话,万一自己也忘了,那可就完蛋了。所以,很多网友都纠结于口令到底该复杂到什么程度。俺的经验是:口令要做到对自己简单,对别人复杂。
总原则:密度长度越高字符类型越多越随机密码强度越高
前面提到,如果用【单个】英文单词作密码,容易遭受字典攻击。为了避免字典攻击,可以考虑由2-5个英文单词构成密码。如果你英语不灵光或你比较习惯中文,也可以考虑用2-5个汉字的拼音来构成密码。
* 优点
由于能显著增加密码长度,可以抗击暴力破解。
* 缺点
有可能需要改变你记忆密码的习惯。
口令中仅包含字母,复杂度不够高。
刚才提到了用多个单词或汉字拼音构造密码。为了让密码的强度再好一些,还可以在单词或汉字拼音之间,插入一些特殊字符。
最常见的是插入空格。当然,你也可以考虑插入其它字符(比如:下划线、减号、斜杠、井号、星号、等)。
通常进行暴力破解时,为了加快破解进度,都只针对字母和数字进行暴力破解。如果你的口令中含有特殊字符,会大大提高攻击者的难度。
所谓的字符变换,就是用形状类似的字母和数字进行相互替换,通过这种变换,可以规避前面提到的基于口令字典的攻击。
常见的变换有如下几种:
字母o 和 数字0
字母l 和 数字1
字母z 和 数字2
字母s 和 符号$
字母g 和 数字9
字母q 和 数字9
字母a 和 符号@
字母b 和 数字6
字母x 和 符号*
假设俺想用单词 program 作为口令,那么经过上述的变换之后,就成为 pr09r@m 很明显,变换之后的口令同时具有字母、数字、符号。强度相当好 :)
如果你有兴趣,还可以对俺给出的这几个变换,进行扩展,以满足自己的习惯和喜好。
在某些古代小说的情节中,经常可以看见藏头诗的桥段。藏头诗的点子,也可以借用来构造安全口令。
为了用此招数,你先要想好一句令你印象深刻的话。这话可以是中文,也可以是英文、法文、火星文......反正只要是你熟悉的语言既可。最好这句话的字数(单词数)在6-20之间。然后你把这句话每一个单词的头一个字母取出来,组合成一个口令。如果是中文的话,就把每一个字的拼音的声母取出,组合成口令。
假设俺想好的话是:“只有偏执狂才能生存”。那么用拼音的声母表示就成为:zypzkcnsc
在构造口令的时候,适当地组合一下 SHIFT 键,有时也可以达到不错的效果。假如你的口令中,有部分字符是数字,那当你输入口令时,按住SHIFT键会让这些数字字符变为特殊符号。
优点
不用改变你原先的记忆习惯。
由于口令包含较多特殊符号,复杂度大大提高。
缺点
万一你原先的口令仅有字母,没有数字,则密码的强度会稍微打折扣。
由于要依赖于SHIFT键进行切换,会影响你输入密码的击键速度。这会给偷窥者留下可乘之机。
按照所在软件的类型分类
按照危险级别分类
还可以根据漏洞的危险程度,进行分类。通常按照“高中低”分三级(也有把危险级别定为5级的)。级别越高,就越危险。
对于高危的漏洞,有可能导致攻击者在你的电脑上植入木马。
按照攻击代码的位置分类
按照补丁的情况分类
对于大部分漏洞而言,都有对应的补丁;但是少数漏洞没有补丁。没有补丁的漏洞是很危险的。为啥会出现这种情况捏?俺稍微解释一下。
个人防火墙
个人防火墙主要用于防范“远程漏洞”,对于“本地漏洞”,防火墙基本帮不上忙。
因为大多数远程漏洞,都存在于你机器对外开启的监听端口中。个人防火墙可以阻止这些端口对外开放,从而避免潜在的漏洞被攻击者利用。
自从 Windows 2000 开始,微软就在操作系统中内置了防火墙功能。
定期升级系统补丁
Windows 系统的漏洞一直比较多——毕竟用户群太大,容易被黑客盯上。所以从很多年以前,微软就开始定期提供 Windows 补丁。具体的做法是每月的第二个星期二,发布新发现的漏洞的补丁。另外,如何发现高危的漏洞,也会临时发布紧急补丁。
从 Windows 2000 开始,系统就支持自动的补丁升级机制。你只要在“控制面板”里打开“自动更新”这个功能,然后选择“自动”方式。你一定要确保系统的"自动更新"机制处于启用状态。这就可以堵住很多操作系统漏洞,从而降低攻击的风险。
提醒一下:自动更新不是 Windows 独有滴。其它一些用户群比较大的桌面系统(比如:Mac OS,Ubuntu)也提供了自动更新安全补丁的功能。
启用软件的自动更新
有一些做得比较好的软件,会内置自动更新功能(比如:Firefox、Chrome ...),一旦其官方网站有新的版本或补丁,就会自动下载并更新。如果你担心这类软件有安全问题,可以启用它们的自动更新功能。
使用小众软件
俗话说树大招风。越知名的软件,就越容易引来黑客的注意,被发现安全漏洞的概率也会增大。
比如说:IE 的用户群最大,针对 IE 漏洞的挂马攻击是各种浏览器中最普遍的;Firefox 相对就少很多;而 Chrome 和 Safari 就更少了(不过捏,随着 Firefox 和 Chrome 的流行,针对这两款浏览器的攻击也多起来了)。
嗅探(Sniffer)
所谓的"嗅探",就是攻击者利用某些技术手段,截获你的网络数据流并进行分析,从而获取某些有价值的信息。通常来说,"嗅探"只是入侵的初始阶段(准备阶段)。攻击者通过"嗅探"获取到的信息,通常用来进行辅助后续的入侵行动。
举例:
很多人喜欢通过公共场所的 WiFi 热点上网。假如你使用的 WiFi 热点没有设置为强加密。那么,某个攻击者就有可能利用 WiFi 嗅探工具,截获你的上网流量。如果你正好在收发Web邮件,而且没有通过 HTTPS 加密(好多国内的 Web 邮箱不支持全程 HTTPS 加密)。那么,攻击者就可以看到你的收发的邮件内容。
钓鱼
利用浏览器自身的安全漏洞
在软件行业中,几乎每一款软件都会有漏洞——浏览器自然也不例外。浏览器的漏洞有很多种,其中一类叫做"安全漏洞"。顾名思义,就是会导致安全问题的漏洞。
如果某款浏览器的安全漏洞被攻击者发现,而浏览器厂商自己还不知晓。那么攻击者就可以利用该漏洞,发起广泛的攻击。
举例:
假设某个黑客研究 IE 的内核,首先发现 IE 存在一个"渲染图片导致缓冲区溢出"的漏洞。由于该漏洞是独家发现,只要该黑客不公开漏洞的信息,连微软(也就是 IE 浏览器的厂商)也会蒙在鼓里。因此,也就没有针对该漏洞的补丁。那么,这个黑客会如何利用该漏洞捏?
利用浏览器插件或扩展的安全漏洞
如今大部分浏览器上,都安装了插件。最常见的插件就是 Flash 插件。另外还有 PDF 插件, Java 插件,等等。
浏览器的插件也属于软件,也会存在安全漏洞,因此也可以被攻击者利用。一般来说,攻击者对插件漏洞的利用,类似于对浏览器漏洞的利用。
举例2:
同样是在去年,有不少 Gmail 用户遭到入侵。但实际上,Gmail 本身并没有出问题。攻击者是利用 Flash 的漏洞,伪造跨站请求,然后在 Gmail 的转发列表中加入一个攻击者的邮箱。之后,被害人收到的所有邮件,都会自动转发给攻击者。相关报道请看"这里"。
从最近几年的趋势来看,插件漏洞导致的安全问题,要多于浏览器漏洞导致的安全问题。
跨站脚本攻击(XSS)
举例:
比如某个 BBS 论坛存在漏洞——没有对用户发布的帖子内容(此处的"内容",不是指文字内容,而是指特殊字符)进行严格的检查。如果某个攻击者发现了此漏洞,就可以精心构造一个帖子,在帖子的正文中包含一段攻击脚本(通常是JavaScript)。接下来,攻击者把这个帖子发布到该论坛上。
然后捏,如果有人浏览了这篇帖子,这段攻击脚本就会被激活,然后干坏事......
插件
在功能上,插件通常是用来渲染页面里的 <object>
或 <embed>
标签;不会增加浏览器自身的功能。
插件通常实现比较底层的功能,通常以平台相关的代码(本地代码)编写,可以调用操作系统的 API。形式上,插件以动态库(Windows 上就是 DLL 文件)的方式,加载到浏览器的进程内。由于使用本地代码编写,插件通常依赖于特定的操作系统(不同系统的插件不能混用)。
举例:
Flash 插件
媒体播放器插件
PDF 插件
Java 插件
扩展
扩展,顾名思义,是用来扩展浏览器自身的功能。所以,扩展可以调用浏览器自身的 API,但是大部分扩展不能调用操作系统的 API。
一般来说,扩展是跟操作系统无关的。比如 Firefox 的大部分扩展,既可以用于 Windows 平台的 Firefox,也可以用于 Linux 和 Mac 的 Firefox。
由于插件比较底层,一旦出现高危漏洞(比如能够执行本地代码的漏洞),攻击者就可以在操作系统中植入木马。可以这么说,插件出现漏洞,其危险性类似于浏览器出现漏洞。
相对而言,扩展出现漏洞,其危险性往往不如插件严重,通常也不会导致攻击者植入木马。
尽量使用大众化的扩展
虽然扩展出漏洞导致的危险性不如插件那么高,但也不能掉以轻心。
俺的经验是,尽量使用知名度高,用户数众多的扩展。这样的扩展,相对来说比较靠谱,成熟度比较高。即使出了漏洞,更新也比较及时。
反之,对于某些很少人用的扩展,最好敬而远之。顺便提一下。某些层次低的入侵者,甚至会把木马伪装成浏览器扩展,再忽悠一个很花哨的功能,然后放到网上给大伙儿用。
尽量避免使用插件
从上述对比可知,插件如果出现漏洞,危险性很高。所以,俺的建议是:尽量避免使用插件。
不过捏,避免使用插件,说起来简单,但是做起来有点难度。其它插件,说不用就不用了。但是 Flash 插件,实在是用得太广泛了(视频网站用到它,网页休闲小游戏也用到它),估计大伙儿难以割舍啊。
不幸的是,Flash 插件又最危险。一方面是因为 Adobe 的程序猿,安全意识太差;另一方面是因为 Flash 是用得最多的插件,成为攻击者的重点研究对象。根据2011年的统计数字,去年一年,光是高危漏洞,Flash 就爆了4次——当之无愧地坐上漏洞排行榜的头把交椅。
什么是"多虚拟机"的方案?
所谓"多虚拟机"的方案,就是在你的电脑上创建多个虚拟机,分别用来实现不同安全级别的上网行为。
举个例子:
你可以创建虚拟机A,只用来访问网银(不访问其它网站);然后创建虚拟机B,用来进行其它上网行为。那么,即使你在虚拟机B受到攻击,对虚拟机A也完全没有影响。这样一来,就可以彻底保证网银的安全。
“隔离”的好处在于:一旦某个环境被入侵,(只要你的隔离屏障没有被穿透)别的环境不会受影响。说到“隔离屏障被穿透”,自然就引出“隔离性的好坏”这个话题。
不同的“隔离措施”,其“隔离性”是不同的。“隔离性”越好,攻击者就越难穿透。
【常见的】隔离措施(从低到高)有如下几种。俺结合浏览器来加以说明
1. 进程级
(以浏览器为例)搞多个“浏览器实例”。不同的实例肯定是不同进程,但都在同一个用户下。
2. 用户级
(以浏览器为例)在不同的【普通】用户下分别运行浏览器。但都在同一个操作系统下。
3. 虚拟系统级
(以浏览器为例)创建多个虚拟系统(Guest OS),在不同的虚拟系统中分别运行浏览器。虽然处于不同的 Guest OS,但还是在同一个 Host OS 下。
4. 物理系统级
(以浏览器为例)在不同的物理系统中运行浏览器。
“物理隔离”还可以继续细分为3种子类型(这三种级别也是从低到高):
物理隔离1型
多个物理系统之间【存在】网络连接。
物理隔离2型
多个物理系统之间【没有】网络连接,但【存在】存储介质的交换(比如:通过“U盘”交换数据)。
物理隔离3型
多个物理系统之间既【没有】网络连接,也【没有】存储介质的交换。
关于这个概念,洋文称之为“attack surface”,相关的英文维基百科页面在“这里”。考虑到很多同学不喜欢看洋文,下面俺通俗地扫盲一下。
为了描述这个概念,暂且借用一下军事术语。在军事领域中,如果其它因素都一样,则防线越长就越容易被突破。
在信息安全领域,道理也类似。军事领域的“防线”就类似于本文所说的“攻击面”。
* 时间维度
有两台软硬件配置一模一样电脑(A 和 B)。A 是一年到头365天都挂在网上,而 B 在一年里面只联网1分钟。很显然,A 被入侵的概率要大大高于 B。