如何防止黑客入侵[8]:物理隔离的几种玩法

2016-12-05IT IT.信息安全

★先插播一个安全通告


  11月29日曝光了一个 Firefox 的高危漏洞,详情在“这里”(洋文)。
  根据漏洞描述,此漏洞只影响 Windows 平台。照理说俺用的是 Linux,应该不受影响。但考虑到俺是高危险人士,为了保险起见,还是先静默几天——暂不使用“编程随想”这个身份进行网络活动。俗话说得好:【小心驶得万年船】。
  本来俺计划在11月底发一篇博文谈 Linux,但是这个漏洞让俺改变主意——所以今天这篇来聊聊“物理隔离”的话题。
  (本文发出后,俺已经到博客后台管理界面,把这几天被 Google 误判为垃圾广告的评论,全都恢复出来了)


★本文的目标读者是哪些人?


  为了避免浪费大伙儿的时间,俺先声明一下本文的目标读者。
  这篇博文是面向那些【对安全性要求非常高】的用户。对这些人而言,“虚拟机隔离”还是无法令他们放心。

  既然聊到这里,顺便解释一下:什么情况下“虚拟机隔离”会出问题。
  如果虚拟化软件(比如 VirtualBox、VMware、KVM ...)本身出现了安全漏洞,并且这个安全漏洞会导致虚拟机被穿透;然后,Guest OS 正好又感染了恶意软件;而相关恶意代码正好又能够利用这个漏洞进行穿透;那么,该恶意代码就有可能从 Guest OS 入侵 Host OS。一旦恶意代码能够侵入 Host OS,理论上它就可以访问这个 Host OS 上的所有 Guest OS。在这种情况下,“虚拟机隔离”的措施就【失效】了。
  出现上述情况的概率是非常低的——需要好几个条件【同时】具备。因此,能够进行这种攻击的,必然是比较高级的入侵者,而且这个入侵者对入侵对象必须有深入的了解:
知道对方用的是什么类型的虚拟化软件(不同的虚拟化软件,其安全漏洞的情况全然不同),
知道对方用的 Guest OS 是什么类型的系统
知道对方用的 Host OS 是什么类型的系统

  所以,普通的网民不需要考虑这种风险。为啥捏?能这么搞的入侵者都是比较高级的,他们根本不屑于去入侵普通网民。


★预备知识:关于“隔离性”和“攻击面”


◇几种不同的隔离级别


  在本系列的前面3篇,俺连续聊了很多关于 Web 方面的防范措施。你看完这3篇之后应该会发现:俺提及的防范措施,全都是围绕“隔离”这个概念来展开的。不论是“多实例”还是“多用户”或者“多虚拟机”,说白了都是为了隔离“浏览器环境”。
  “隔离”的好处在于:一旦某个环境被入侵,(只要你的隔离屏障没有被穿透)别的环境不会受影响。说到“隔离屏障被穿透”,自然就引出“隔离性的好坏”这个话题。
  不同的“隔离措施”,其“隔离性”是不同的。“隔离性”越好,攻击者就越难穿透。
  【常见的】隔离措施(从低到高)有如下几种。俺结合浏览器来加以说明
1. 进程级
(以浏览器为例)搞多个“浏览器实例”。不同的实例肯定是不同进程,但都在同一个用户下。
2. 用户级
(以浏览器为例)在不同的【普通】用户下分别运行浏览器。但都在同一个操作系统下。
3. 虚拟系统级
(以浏览器为例)创建多个虚拟系统(Guest OS),在不同的虚拟系统中分别运行浏览器。虽然处于不同的 Guest OS,但还是在同一个 Host OS 下。
4. 物理系统级
(以浏览器为例)在不同的物理系统中运行浏览器。

  今天俺要介绍的就是最高级的“物理系统级的隔离”。

◇“物理隔离”的3种子类型


  “物理隔离”还可以继续细分为3种子类型(这三种级别也是从低到高):
物理隔离1型
多个物理系统之间【存在】网络连接。
物理隔离2型
多个物理系统之间【没有】网络连接,但【存在】存储介质的交换(比如:通过“U盘”交换数据)。
物理隔离3型
多个物理系统之间既【没有】网络连接,也【没有】存储介质的交换。

◇攻击面


  关于这个概念,洋文称之为“attack surface”,相关的英文维基百科页面在“这里”。考虑到很多同学不喜欢看洋文,下面俺通俗地扫盲一下。
  为了描述这个概念,暂且借用一下军事术语。在军事领域中,如果其它因素都一样,则防线越长就越容易被突破。
  在信息安全领域,道理也类似。军事领域的“防线”就类似于本文所说的“攻击面”。

◇“攻击面”的2个维度


  从概念上讲,“攻击面”可以再分成2个维度,分别是“时间维度”和“空间维度”。为了便于理解,下面俺举例说明。

  时间维度
  有两台软硬件配置一模一样电脑(A 和 B)。A 是一年到头365天都挂在网上,而 B 在一年里面只联网1分钟。很显然,A 被入侵的概率要大大高于 B。

  空间维度
  有两台服务器 A 和 B,都是始终联网的(时间维度一样)。A 上面【没有】装任何服务端软件;而 B 上面既装了 Apache(web 服务)又装了 MySQL(数据库)。而且这几个服务的端口都对外开放。假如某天,Apache 曝光了高危漏洞,B 就可能因此而被入侵,但是 A 就没事儿。
  【通俗地说】,系统中装的软件越多,则包含的“代码”就越多,那么“代码”中出现安全漏洞的概率也就越大。
  (上面这句只是“通俗”的说法。严格来讲,“攻击面”与“代码量”并【不是】简单的线性关系。这两者之间的关系牵扯的因素很多,比如:软件代码的质量,软件模块的类型、各个软件模块之间的依赖关系、开源 or 闭源 ......)


★招数1:把不同的上网帐号放到不同的物理系统


  这个招数是最容易想到的,所以俺先聊这招。
  如今很多人都有不止一台 PC。但是 PC 再多也不会超过10台吧(除非你是开网吧的)。但是你的上网帐号很可能不止10个。所以,你不太可能给每一个上网帐号配一台单独的 PC。这就需要考虑一个“划分策略”:哪些帐号共用一台 PC。
  “划分策略”通常有如下两种:

◇根据“重要程度”进行划分


  比如说,你搞两台 PC,一台专门用来操作很重要的网络帐号,另一台用来操作不那么重要的网络帐号。
  对于前者,安装靠谱的操作系统(Linux > Mac OS > Windows),装的软件要尽量【少】(减少“攻击面”),并采取尽可能多的措施来保护它(具体措施参见本系列前面几篇)。

◇根据“身份”划分


  如果你对隐匿性的要求很高,可以考虑以“身份”划分上网帐号到不同的 PC。
  为了便于理解,拿俺自个儿来举例:
  显然,俺是非常看重“隐匿性”滴——如果让朝廷方面知道俺的真实身份,俺就废了。所以,俺不光注重【安全性】的需求(防止被入侵),更加要注重【隐匿性】的需求(防止俺的“虚拟身份”与“真实身份”被关联起来)。
  如果俺仅仅使用“虚拟机隔离”(一个虚拟机用来操作“真实身份”的帐号,另一个虚拟机用来操作“编程随想这个身份”的帐号)。万一碰到“虚拟机穿透”(前面提到过),入侵者通过 Guest OS 进入 Host OS,就可以同时访问到这两个 Guest OS,就有可能发现:原来“编程随想”就是某某人。
  反之,如果把这两个身份的帐号放到两台 PC(物理隔离)。即使“编程随想”这个身份对应的 PC 被彻底入侵,入侵者看到的帐号全部都是“编程随想”相关的帐号,不会看到“真实身份的帐号”(因为这些帐号在另一台 PC 上)。


★招数2:在【专用的】物理系统中操作“重置密码的邮箱”


  这个招数很简单,仅仅从章节标题,你基本上就能猜到是怎么玩的。所以俺就节省点口水,不展开了。
  下面简单说说这个招数的注意事项:
1. 用来“重置密码”的邮箱,最好是专用的——也就是说:除了“重置密码”,不再作其它用途(以降低“攻击面”)
2. 操作这个邮箱的 PC,最好也是专用的(以降低“攻击面”)
3. 这台电脑只要很低的硬件配置就可以了。所以,你可以拿以前淘汰的旧电脑来用。


★招数3:在【专用的】物理系统中运行密码生成器


  可能很多同学是第一次听说“密码生成器”这个玩意儿。所以俺来解释一下:
  在本系列的第3篇《如何构造安全的口令/密码》中,俺介绍了好几种设置密码的技巧,那篇教程的最后一招就是“用散列算法构造密码”。
  “用散列算法构造密码”,有“简单用法”,也有“高级用法”(对这两种,那篇博文都有介绍)。由于本文针对的是“安全性要求很高的读者”,所以你当然要用“高级用法”。“高级用法”通常需要依靠一个小程序/小脚本来辅助你进行 N 迭代(计算 N 次散列)。这个“小程序/小脚本”就是本章节所说的“密码生成器”。
  有了“密码生成器”,你可以轻松构造出许许多多超长密码(可以长达几百个字符,前提是:网站要支持这么长的密码)。而且你【不需要】花很多脑细胞来记住这些变态的长密码。你只需记住自己的“种子串”以及“迭代次数”。如果你把“种子串”及“迭代次数”写死在生成器的脚本中,那你甚至连这两个信息也【不用】记忆。
  这台运行“密码生成器”的电脑完全【不用联网】。所以这台 PC 的隔离属于前面提到的“物理隔离3型”——这是物理隔离中最严格的(没有之一)。


★招数4:对重要帐号划分“操作机”和“登录机”


  这个招数与前面几个完全不同——是采用【2台】PC 来保护【单个】帐号。通常而言,只有很重要的帐号才值得你动用两台物理电脑来保护。
  这个招数相对比较难懂,俺需要多费点口水。在开讲之前,先来解释一下什么是“记住登录状态”的功能。

◇“记住登录状态”功能


  如今大部分网络帐号都有【记住登录状态】这个功能。当你登录该帐号,输入完密码后,如果勾选了“记住登录状态”这个选项(不同的网站,界面上的叫法可能略有不同),那么你下次访问该帐号就【不用】再输入密码了。

◇“记住登录状态”的技术原理


  网站是如何做到这个效果的捏?通常是利用浏览器 cookie。当你输入密码并登录成功之后,会在 cookie 中保存一个“安全令牌”(洋文叫“token”)。这个“安全令牌”不是密码,但是比密码更复杂更难暴力破解。而且,根据令牌是【无法】逆向推算出密码的(只要是比较靠谱的网站,技术上肯定能保证这点)。
  当你下一次又访问了这个网站,浏览器会把 cookie 中的这个令牌发送到网站服务器,服务器端会采用某种安全可靠的算法来验证这个令牌是否合法,如果合法,就认为你是之前登录过的那个用户。
  由于 cookie 有时间限制(期限),过了期限这个 cookie 就失效了。这时候你如果又访问这个网站,它又会要求你输入密码。另外,如果你在浏览器中清空了所有 cookie,那么下一次访问该网站也要重新输入密码。

◇物理隔离的玩法


  明白了这个功能的原理之后,开始来说“物理隔离”怎么玩。
  你需要专门准备2台 PC——“登录机”和“操作机”。记住:这2台电脑都是用来操作【同一个】帐号滴。
  每次需要登录该帐号,你一定要在“登录机”上输入密码。登录成功之后,把登录机上的【cookie 文件】复制到“操作机”上。然后你就可以在“操作机”上【免登录】访问该帐号。
  (由于需要把 cookie 从“登录机” copy 到“操作机”。所以这种隔离属于前面提到的“物理隔离2型”)

◇这个招数的优点


  首先,因为你从来【不】在“操作机”上输入该帐号的密码。所以,即使“操作机”被植入木马,木马也不可能知道该帐号的密码是啥。

  从“时间维度”而言
  由于“登录机”仅仅用来输入密码,其它的日常操作都在“操作机”。所以,(从“时间维度”上讲)“登录机”的攻击面远远小于“操作机”。

  从“空间维度”而言
  由于这个“登录机”仅仅用来输入密码。你只需安装非常少的几个软件(比如 浏览器 之类的)。如果你的帐号名称是洋文(大部分应该都是吧),这台“登录机”甚至连输入法都【不用装】。
  所以,从“空间维度”而言,“登录机”的攻击面也会远远小于“操作机”。

  综上所述,入侵者很难搞定“登录机”。
  然后,前面俺又说了,根据(cookie 中的)“安全令牌”是无法逆向推算出帐号密码滴。所以,即使“操作机”被【彻底】入侵了,入侵者虽然可以进入你的帐号,但是他/她依然无法知道你的密码(因此也就无法改密码)。
  这种情况下,你可以很轻松地把入侵者踢掉——只需通过“登录机”进入帐号,修改密码;然后入侵者在“操作机”上就进不了这个帐号了(一旦修改过密码,原有的安全令牌就作废了)。


★招数5:“物理隔离”搭配“多重代理”


◇“物理电脑”与“虚拟机”在“网络隔离”方面的差异


  俺博客上有一个很受欢迎的系列叫做《如何隐藏你的踪迹,避免跨省追捕》。在这个系列中,俺介绍“多重代理”,也介绍了“用虚拟机防止公网 IP 暴露”。
  当初俺写那篇《用虚拟机隐匿公网 IP》的时候,好几个懂技术的读者跳出来质疑。因为他们光看标题没看内容 :)
  所谓的“用虚拟机防止公网 IP 暴露”,是因为:可以利用虚拟网卡的不同模式(NAT 及 Host-Only)来设置网络隔离,使得 Guest OS 中的软件【无法直接联网】(强迫这些软件走代理)。这样就可以避免:“因为某些软件【直连网络】导致的公网 IP 暴露”。

  但如果出现“虚拟机被穿透”,那“公网 IP”还是有暴露的风险。因为虚拟网卡只能用来限制 Guest OS,而无法限制 Host OS。而 Host OS 中的软件通常是可以直连公网的。当某个恶意代码从 Guest OS 穿透进入 Host OS,该恶意代码就有可能尝试“网络直连”,并导致你的公网 IP 暴露。
  看到这里,聪明的读者已经猜到解决方案了。那就是把原先“单虚拟机方案 或 双虚拟机方案”中那个“隔离的虚拟机”换成“隔离的物理电脑”。
  话虽这么说,但操作起来会有点复杂。
  原先的“虚拟机方案”,你只需设置虚拟网卡的“网卡模式”(设置成 Host-Only 或 Internal),就可以把 Guest OS 的网络访问隔离起来。但是物理电脑是【没有】虚拟网卡的,物理电脑是物理网卡。而“物理网卡”是【没有】“网卡模式”让你修改的。所以你需要在网络拓扑上下点功夫。具体的玩法有很多种,考虑到本文的篇幅有限,俺只介绍其中一种。

◇“物理电脑”进行“网络隔离”的玩法(方法之一)


  下面俺【简单】介绍一下步骤(考虑到本文面向的是安全要求很高的读者。既然你的安全要求很高,当然不能是技术菜鸟,肚子里要有点货。所以,俺在下面只提几个要点,操作的细节靠你自己摸索了)

1.
准备两台物理电脑,分别称为“隔离机”和“网关机”。
“隔离机”要有一个【有线】的网卡;“网关机”要有2个网卡,至少有一个是【有线】的(用来与“隔离机”对接)
为啥俺要强调“有线网卡”,因为有线网卡才能确保其只连接到一个对端;而无线网卡就难说了。
所以隔离机只能保留仅有的一个有线网卡。如果隔离机有多余的无线网卡,在 BIOS 里面禁掉。

2.
“隔离机”上运行的软件是:
有可能遭遇高级入侵的软件(比如你的浏览器),或者是那些本身就不太安分的软件(比如 QQ)
“网关机”上运行的软件是:
TOR
TOR 的前置代理(如果你在墙外,可以不用前置代理。但是有前置代理会更安全——“双重代理”优于“单重代理”)
防火墙

3.
前面说了,“网关机”至少有一个有线网卡,用来对接“隔离机”。
因此,你需要配置“网关机”的防火墙,使得【在这块网卡上】只允许 TOR 的监听端口对外暴露(这条一定设置)
另一块网卡是用来接入公网的,你可以配置防火墙,禁止该网卡上的任何监听端口(这条可设可不设,设置了更保险一些)

4.
用一根网线把这2台电脑各自的【有线网卡】对接起来。

5.
设置“隔离机”上的软件,让它们以“网关机”的 TOR 作为代理。

6.
设置“网关机”上的 TOR,让它通过“网关机”上的前置代理联网。


★总结


  几个主要招数聊得差不多了。俺在最后提醒一下:
1. 本文的这几个招数,相互之间是可以【组合使用】的
2. 本文的这几个招数是可以跟“虚拟机隔离”结合起来用的
3. 组合得越复杂,需要的物理电脑也越多 :)
4. 如今的 PC 已经很便宜啦(两三千就可以买到硬件配置还凑合的)。如果你是“高危人士”或“高价值目标”,【不要】吝啬那几千块钱!


回到本系列的目录