为什么桌面系统装 Linux 可以做到更好的安全性(相比 Windows & macOS 而言)

不见图 请翻墙

  又有一段时间没写技术博文了。在前几篇博文的评论中,有若干读者催写 Linux 方面的教程。俺准备开始动手,写一点傻瓜教程(面向技术菜鸟)。   很多人切换到 Linux 是出于安全方面的考虑。所以在写具体的 Linux 教程之前,咱们先来聊一下 Linux 安全性方面的话题。   今天这个话题是前些年想聊但是一直拖着没写的(请原谅俺比较懒),如今算是补上了。
  操作系统间的对比很容易引发口水战。   如果你不同意俺的观点,最好能指出俺哪里说得不对,而不要仅仅停留在“口水战”层面的争吵。   俺在本文标题中已经明确限定了讨论范围是【桌面系统】。   “服务器系统”或者是“移动设备的系统”【不】在本文讨论范围之内。
  通俗地说:Linux 只是一个操作系统内核(Linux kernel),并不是一个操作系统。   所谓的“发行版”,就是在 Linux kernel 的基础上,再加装相应的辅助性软件,使之成为一个【可用的】操作系统。

  (关于“发行版”的更多介绍,可以参见俺的另一篇《扫盲 Linux:如何选择发行版?》)

  通俗地说,系统中凡是【有可能】被攻击者利用的地方,都【有可能】存在安全漏洞。这些“地方”的总和,称之为“攻击面”。   这个概念相对比较好理解。   通俗地理解:软件越多,则攻击面越大;软件所提供的“数据输入途径”越多,则攻击面越大。   (注:上面的说法只是一直【通俗化】表达,其实并不严密;喜欢抬杠的同学,别较真哦)   (在其它条件类似的情况下)攻击面越大,则系统被入侵的风险越大。   这个概念的理解,相对费点口舌。   所谓的“确定性”就是指攻击者对你系统中安装的软件,了解的详细程度。   攻击者对你系统中的软件情况了解地越多越详细,那就表示“确定性”越高。   (在其它条件类似的情况下)“确定性”越高,攻击者在实施入侵的过程中就越容易得手。
  咱们拿 Windows 7 来作为对比。   Windows 7虽然提供了几个不同的版本(比如:家庭版、专业版、旗舰版),但是这些版本其实差别不大。   为啥说“差别不大”捏,因为这几个不同版本的 Win7,都包含了完全相同的核心组件。【由于 Windows 的可定制性很低】,这些核心组件你是【无法】移除滴!而只要有某个核心组件出现安全漏洞,不管你用的是家庭版还是旗舰版,都会中招。   (macOS 的情况与 Windows 类似)   再来说 Linux。   Linux 区别于其它操作系统(Windows、mac OS、BSD)的一大特色是:非常多的发行版。   不同的发行版,差别非常大。这种差别不光体现在“预装的应用软件不同”,还体现在“内核的版本不同”,还体现在“内核的编译参数不同”。   当俺对读者说:“俺用的是 Linux”,这句话【几乎没啥】信息量。通过这句话,你无法知道俺的系统中会有哪些软件,也无法知道俺的系统运行的是哪个版本的内核(kernel),更加无法知道俺系统的内核具有哪些编译参数。   (根据读者评论的反馈,加一个补充说明)

  历史上,确实有极少数的安全漏洞影响所有的 Linux 发行版(比如:Dirty COW 漏洞)。但是这类漏洞占漏洞总数的比例非常低。不能因为极少数漏洞,而否定了“发行版差异化对降低攻击面的积极意义”。

  顺便说一下,其他操作系统也出过“影响全系列版本的安全漏洞”。对于“影响全系列版本的安全漏洞”,任何操作系统都没辙。但是大部分漏洞只影响少数版本,这时候 Linux 发行版众多的特点,就会起作用了。
  Linux 相比 Windows 和 macOS 的最显著特点,是其高度的可定制性。   找几个栗子来 show 一下:   第1个栗子:   Linux 的某些发行版可以比较方便地重编译内核。通过编译内核,可以把很多不需要的内核模块去掉(禁掉)。这当然有助于降低攻击面。   对于这点,Windows 是完全做不到滴(因为微软没有把 Windows 的内核开源出来);   苹果的 macOS,虽然其内核(darwin)是开源的,也可以重编译,但是比 Linux 要麻烦。   第2个栗子:   Linux 可以裁剪到【极致】。比如说:某个名叫 BasicLinux 的发行版可以把整个系统裁剪到只有 2.8MB,然后运行在只有 3MB 内存的 386 机器上。   而近期的几个 Windows 版本(Win7、Win8、Win10)再怎么裁剪也还是有几百兆。   至于苹果系统,貌似也无法像 Linux 这样裁剪(精简到只有几兆)   把系统大幅裁剪,对关注安全的人而言并【不是】为了省硬盘(现在硬盘已经很便宜),而是为了【降低攻击面】。   关于“确定性”的话题,刚才聊“发行版”的时候,已经聊过了——如果攻击者不知道你用的是哪个发行版,你系统的攻击面非常不确定(确定性很低)。   其次,就算是攻击者知道了你用的是哪个发行版,你的攻击面依然“确定性很低”——因为 Linux 的发行版很容易进行定制。   拿 Windows & macOS 来作为对比。   Windows 的图形界面系统是绑定在系统内核的,你无法定制它,更无法剥离它。   对于苹果的系统,你要想把 macOS 的 GUI 系统彻底换掉,貌似有难度。   但 Linux 就完全不同了——对 Linux 的图形化系统,从上层的“桌面环境”(desktop environment)到中间的“窗口管理器”(window manager)再到底下的“显示服务器”(display server),都是【可选的】(都有不止一个的候选项)。Linux 甚至还可以配置成【完全没有图形界面】。
  此处所说的“单点风险”是指“单点故障的风险”。

  关于“单点故障”(Single Point of Failure)这个概念,俺曾经写过一篇博文《聊聊“单点故障”——关于“德国空难”和“李光耀”的随想》。

  (为了节省篇幅,此处就不再解释了。不懂的同学请自己去看那篇)   前面提到过“软件的安全漏洞”。其实除了软件,硬件也可能出现安全漏洞。

  就拿前几个月的新闻来说——高通的芯片存在一个 QuadRooter 漏洞,可以被攻击者用于“提升权限”。据说影响全球几亿部手机(相关报道在“这里”)

  前几章的很多反面案例都是拿 Windows 来嘲讽;本章节,俺要拿苹果公司的 macOS 来作为反例了。   苹果公司的商业模式有一大特色就是【软硬通吃】——Apple 的产品,软硬件都是它自己提供的。   这么做当然有很多好处——比如说更好的用户体验。   但是在安全方面,缺点也很明显: 1. 攻击面的确定性非常高 2. 软件的单点故障 3. 硬件的单点故障   软件的话题以及“攻击面的确定性”,前面已经聊过了。这里聊一下硬件的问题。   假设你是一个果粉,并且你家中所有的 PC 都是苹果的笔记本。   由于苹果的笔记本,硬件都是苹果提供的,所以你没有选择的余地。这就导致你的 N 台 PC 的硬件是相似的(甚至是完全一样的)   如果出现了一个硬件方面的安全漏洞,很有可能会导致你【所有的】苹果笔记本都中招。   相比 Windows 和 mac OS,Linux 支持的 CPU 类型非常非常多(有可能你听说过的 CPU,它都支持)。   除了 CPU,Linux 对其它的硬件的支持也很全。为了让不熟悉 Linux 的同学有所了解,举一些 Linux 支持的硬件机型作为例子:

智能手机和平板 家用的网络路由器 电视机顶盒 树莓派(Raspberry Pi) 轿车的车载系统 大型机、中型机、小型机

……

  注:   上述这个列表只是举例说明 Linux 支持的机型很多。(对普通用户而言)即使只考虑 PC,Linux 支持的 PC 机型也会明显多于 macOS。   所以,如果某个 Linux 粉丝家中有 N 台 PC,他为了降低“硬件的单点风险”,完全可以在购买 PC 的时候,选择硬件完全不同的设备(比如一个是 Intel 的 x86 芯片,另一个是 ARM 芯片;再比如:一个是台式机,一个笔记本)。   三大桌面操作系统的用户数,基本上是:Windows > macOS > Linux(Linux 的用户群是三个里面最小的)   因此,不管是民间的草根骇客还是国家级的御用骇客,如果他们要研发渗透工具去入侵【桌面系统】,他们会把最多的资源(人力/物力)用来开发针对 Windows 的渗透工具;其次才是针对 mac OS 的渗透工具;而针对 Linux 【桌面】的渗透工具是最少的。   开源的好处有很多。包括本文前面提到的其中几点,也是跟“开源”密不可分的。   考虑到篇幅有限,在本章节,俺只聊开源带来的其中一个好处——代码审查(Code Review)。

  在开源社区有一个很有名的 Linus 定律:只要有足够多的眼睛,就可让所有问题浮现(given enough eyeballs, all bugs are shallow.)。这个定律指出了——开源对代码审查的关键作用。

  (注:其实这个定律最早的提出者不是 Linus,而是埃里克·雷蒙德——《大教堂与市集》的作者)   为了加深大伙儿的印象,俺拿 Windows 来作为反例——因为 Windows 基本上完全是【闭源】的。   假设某个微软的程序员想要作恶——在 Windows 的某个核心模块中留下一个后门。由于 Windows 的核心模块都是【闭源】的,外界人士要想在闭源的模块中发现这个后门,难度非常大。虽然微软内部也有代码审查,但是微软内部搞代码审查的人,其人数是很有限滴,这些人的精力和工作热情也是很有限滴。所以,这类后门是很难被发现滴!   反之,很多 Linux 发行版是完全开源的(从内核到应用软件,全部都提供源代码)。如此一来,全世界的程序员或者安全研究人员(只要愿意)都可以去看这些源代码。看代码的人多了之后,发现安全隐患的概率就会大大提升。   (三大桌面系统中)只有 Linux 才存在【社区维护】这种概念。另外两大桌面系统(Windows 和 mac OS)都是由【商业公司】来维护的。   商业公司与开源社区,有一个非常本质的区别——【商业公司要考虑盈利,而开源社区没有赚钱的压力】。   俺博客的老读者应该知道——俺对商业公司(尤其是商业大公司)抱有某种不信任的态度,原因包括如下:

  1. 商业公司会为了利润,而主动收集用户隐私

  Google 是这方面典型的【反面】教材——Google 90% 以上的利润来自“在线广告业务”。为了实现广告的【精准投放】,Google 不得不收集用户隐私,以增加对【每一个网民】的了解(Google 对你了解得越多,它投放给你的广告就越精准)

  2. 商业公司会为了利润,而迫于政府压力实施监控

  永远不要忘记斯诺登曝光的棱镜门丑闻。   至于咱们的朝廷,在这方面同样搞得很龌龊——国内的几大 IT 巨头都是六扇门(公安、国安)的帮凶。
  长期以来,Windows 一直缺乏成熟完善的软件包管理机制。很多菜鸟想要装软件,不外乎如下步骤: 1、先到百度上搜一下 2、找到某个下载站点 3、把软件下载下来 4、安装 5、使用   上述这种操作步骤,【至少】存在两个安全缺陷:

  缺陷1:软件下载站点提供的安装包,【未必】是纯洁的(可能已经被人做了手脚)

  解释:   有的软件下载站点(或网盘),本身就是黑店——它们提供的软件包本身是植入后门的;   还有的软件下载站点(或网盘),因为管理员的疏忽——在收集软件包的时候没有仔细检查,混入了病毒/木马。

  举例:XcodeGhost 事件

  此事的根源在于:因为苹果公司官方的 Mac App Store 被 GFW 干扰,很多国内的程序员难以从 Mac 官网下载 Xcode(这是苹果系统的开发工具),有的程序员为了省事儿,直接通过墙内的网盘下载 Xcode。其中有些人下载到的 Xcode 是带有病毒/木马的。然后这些粗心的程序员又用这个带毒的 Xcode 去开发 iOS 应用,结果导致开发出来的 iOS 应用也是带毒的。   受波及的 app 【至少】包括:微信、网易云音乐、滴滴打车、高德地图、12306、中信银行、同花顺……(大公司倒下一片)

  缺陷2:软件下载过程中,【可能】被篡改

  解释:   如果下载过程中的传输是基于【明文的】HTTP 或 FTP,那么就存在【下载过程中被篡改】的风险。   举例:黑暗幽灵木马(DCM)

  这玩意儿是六扇门(公安部门)出品滴,公安的临侦人员可以用这个工具,在你下载软件的过程中植入木马(前提是,你通过明文的传输协议下载)。更多介绍参见俺之前的博文《如何对付公安部门的“网络临侦”?——“黑暗幽灵木马”之随想》。

  缺陷3:没有及时升级新版本

  大部分软件本身是不提供“自动升级”功能的,对这类软件,你就需要自己手动去更新到新版本。   自己手动更新,麻烦且不说,而且每一次更新,就又重复上述这两个风险。   刚才介绍了——传统方式下安装软件的风险。那么“软件包管理机制”如何规避这些风险捏?

  好处1:更可信的来源

  对于一个 Linux 发行版而言,它的口碑越好,通常也说明:它提供的软件包越可靠。   发行版的管理员是如何确保可靠性的捏?他们通常会从某个软件的官方网站直接获取“第一手材料”(减少了中间环节)。

  好处2:自动的文件校验机制

  完善的软件包管理器肯定会自带“文件校验”的方式(有的是基于“散列值校验”,有的是基于“数字签名”,有的是这两种相结合)。   有了文件校验的机制,如果软件包在下载过程中被篡改了,在【安装之前】就会被发现。

  好处3:自动的软件升级机制

  几乎所有的软件包管理机制,都会帮你实现“自动升级”。总是保持自动更新,可以大大降低安全漏洞的风险。

  (关于“安全漏洞”的扫盲,可以参见《如何防止黑客》系列的其中一篇——是专介绍漏洞概念的)

  注:包管理器的的自动升级,是【独立于】软件本身的自动升级。换句话说,不管某个软件本身是否支持自动升级,包管理器都可以帮这个软件完成自动升级。   曾经有一个流传很广的【谬误】——因为 Windows 的用户数量大,所以才导致 Windows 下的病毒泛滥。   要反驳这种谬误很简单——如今“Android 装机总量”已经大大超越“所有版本 Windows 的装机总量”。但是 Android 并没有出现像 Windows 那么泛滥的病毒传播。   那么,是什么导致 Windows 的病毒泛滥捏?一个很重要的原因是——文件权限不合理:   早期的 DOS 操作系统以及早期的 Win9x(Win95、Win98),只支持 FAT 格式的文件系统。而这种文件系统【不支持】文件权限。   没有文件权限就意味着——任何一个进程都可以修改 FAT 分区中的任何一个文件。这样的系统环境,简直就是病毒的天堂。   所以在 DOS 时代以及 Win9x 时代,病毒的流行程度很广;到了“NT 系列”开始普及(从 Win2000 开始普及),NTFS 文件系统用得多了(NTFS 支持文件权限),病毒的流行程度(相比 DOS 及 Win9x)就少了很多。   在 Windows 的【默认设置下】,【仅仅】根据扩展名(exe、com、bat …)就可以决定一个文件是否“可执行”。Windows 的这种做法有很大的隐患,比如说:会导致某些本来不该执行的文件,因为用户误操作而被执行。   (根据某些读者反馈,俺加个补充说明)   NTFS 文件系统虽然支持详细的 ACL(访问权限控制)。但是,大部分用户(甚至包括某些技术人员)并不懂得去修改/设置 ACL。   至于 FAT 文件系统,(如前所述)压根儿不支持文件权限。而很多 U 盘是格式化为 FAT 分区的——这就是隐患。   相比之下,所有 POSIX 风格的操作系统(早期的 Unix、如今的 Linux、各种 BSD)都是根据专有的“可执行权限”来决定一个文件是否可以运行,而与扩展名【无关】。   Windows 的反例:   很多年以前,Windows 上就流行一个低劣的骗术——把一个 exe 的可执行文件内置一个 jpg 的图标,然后再通过适当地修改文件名,伪装成一个吸引人的图片文件(此时该文件的扩展名依然是 exe,但是菜鸟通过资源管理器看这个文件,会以为是个图片)。   那些上当的网民会直接双击该文件(想要打开图片),但其实是运行了一个恶意的可执行文件(比如病毒或木马)。   对于 POSIX 系统(UNIX、Linux、BSD),这样的骗术是【无法】得逞滴。   希望看完这篇博文,可以促使某些读者把桌面系统切换到 Linux 上。   接下来的技术博文,俺会开始写 Linux 的一些傻瓜教程。由于 Linux 的发行版差异很大,俺目前初步考虑:基于 debian 发行版来介绍这些傻瓜教程,   如果你想要推荐其它发行版(作为傻瓜教程的基础),可以在本文留言。

俺博客上,和本文相关的帖子(需翻墙)

扫盲 Linux:新手如何搞定 Linux 操作系统?
扫盲 Linux:如何选择发行版?
扫盲 Linux&UNIX 命令行——从“电传打字机”聊到“shell 脚本编程”
吐槽一下 Windows 的安全漏洞——严重性超乎想象
如何防止黑客
如何对付公安部门的“网络临侦”?——“黑暗幽灵木马”之随想
在线查毒工具 VirusTotal 的 N 种玩法——从“误报/漏报”聊到“攻击者对它的利用”
扫盲 Tails——专门强化隐匿性的 Linux 发行版
聊聊“单点故障”——关于“德国空难”和“李光耀”的随想