又有一段时间没写技术博文了。在前几篇博文的评论中,有若干读者催写 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:软件下载站点提供的安装包,【未必】是纯洁的(可能已经被人做了手脚)
解释: 有的软件下载站点(或网盘),本身就是黑店——它们提供的软件包本身是植入后门的; 还有的软件下载站点(或网盘),因为管理员的疏忽——在收集软件包的时候没有仔细检查,混入了病毒/木马。
此事的根源在于:因为苹果公司官方的 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 发行版》
《聊聊“单点故障”——关于“德国空难”和“李光耀”的随想》