很多人切换到 Linux 是出于安全方面的考虑。所以在写具体的 Linux 教程之前,咱们先来聊一下 Linux 安全性方面的话题。
★事先声明
◇声明1
操作系统间的对比很容易引发口水战。
如果你不同意俺的观点,最好能指出俺哪里说得不对,而不要仅仅停留在“口水战”层面的争吵。
◇声明2
俺在本文标题中已经明确限定了讨论范围是【桌面系统】。
“服务器系统”或者是“移动设备的系统”【不】在本文讨论范围之内。
★预备知识
◇啥是“发行版”?
通俗地说:Linux 只是一个操作系统内核(Linux kernel),并不是一个操作系统。
所谓的“发行版”,就是在 Linux kernel 的基础上,再加装相应的辅助性软件,使之成为一个【可用的】操作系统。
◇啥是“攻击面”?
通俗地说,系统中凡是【有可能】被攻击者利用的地方,都【有可能】存在安全漏洞。这些“地方”的总和,称之为“攻击面”。
◇啥是“攻击面”的【大小】?
这个概念相对比较好理解。
通俗地理解:软件越多,则攻击面越大;软件所提供的“数据输入途径”越多,则攻击面越大。
(注:上面的说法只是一直【通俗化】表达,其实并不严密;喜欢抬杠的同学,别较真哦)
(在其它条件类似的情况下)攻击面越大,则系统被入侵的风险越大。
◇啥是“攻击面”的【确定性】?
这个概念的理解,相对费点口舌。
所谓的“确定性”就是指攻击者对你系统中安装的软件,了解的详细程度。
攻击者对你系统中的软件情况了解地越多越详细,那就表示“确定性”越高。
(在其它条件类似的情况下)“确定性”越高,攻击者在实施入侵的过程中就越容易得手。
★Linux 的发行版的数量极多——可以用来降低【攻击面】的“确定性”
◇以 Windows 作反面教材
咱们拿 Windows 7 来作为对比。
Windows 7虽然提供了几个不同的版本(比如:家庭版、专业版、旗舰版),但是这些版本其实差别不大。
为啥说“差别不大”捏,因为这几个不同版本的 Win7,都包含了完全相同的核心组件。【由于 Windows 的可定制性很低】,这些核心组件你是【无法】移除滴!而只要有某个核心组件出现安全漏洞,不管你用的是家庭版还是旗舰版,都会中招。
(macOS 的情况与 Windows 类似)
◇Linux 的优势
再来说 Linux。
Linux 区别于其它操作系统(Windows、mac OS、BSD)的一大特色是:非常多的发行版。
不同的发行版,差别非常大。这种差别不光体现在“预装的应用软件不同”,还体现在“内核的版本不同”,还体现在“内核的编译参数不同”。
当俺对读者说:“俺用的是 Linux”,这句话【几乎没啥】信息量。通过这句话,你无法知道俺的系统中会有哪些软件,也无法知道俺的系统运行的是哪个版本的内核(kernel),更加无法知道俺系统的内核具有哪些编译参数。
◇补充说明
(根据读者评论的反馈,加一个补充说明)
历史上,确实有极少数的安全漏洞影响所有的 Linux 发行版(比如:Dirty COW 漏洞)。但是这类漏洞占漏洞总数的比例非常低。不能因为极少数漏洞,而否定了“发行版差异化对降低攻击面的积极意义”。
顺便说一下,其他操作系统也出过“影响全系列版本的安全漏洞”。对于“影响全系列版本的安全漏洞”,任何操作系统都没辙。但是大部分漏洞只影响少数版本,这时候 Linux 发行版众多的特点,就会起作用了。
★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 甚至还可以配置成【完全没有图形界面】。
★Linux 支持多样化的硬件(CPU/主板/等)——可以规避硬件的“单点风险”
◇预备知识:何为“单点风险”?
此处所说的“单点风险”是指“单点故障的风险”。
◇预备知识:啥是硬件漏洞?
前面提到过“软件的安全漏洞”。其实除了软件,硬件也可能出现安全漏洞。
就拿之前的新闻来说——高通的芯片存在一个 QuadRooter 漏洞,可以被攻击者用于“提升权限”。据说影响全球几亿部手机(相关报道在“这里”)
◇MacOS 的劣势
前几章的很多反面案例都是拿 Windows 来嘲讽;本章节,俺要拿苹果公司的 macOS 来作为反例了。
苹果公司的商业模式有一大特色就是【软硬通吃】——Apple 的产品,软硬件都是它自己提供的。
这么做当然有很多好处——比如说更好的用户体验。
但是在安全方面,缺点也很明显:
1. 攻击面的确定性非常高
2. 软件的单点故障
3. 硬件的单点故障
软件的话题以及“攻击面的确定性”,前面已经聊过了。这里聊一下硬件的问题。
假设你是一个果粉,并且你家中所有的 PC 都是苹果的笔记本。
由于苹果的笔记本,硬件都是苹果提供的,所以你没有选择的余地。这就导致你的 N 台 PC 的硬件是相似的(甚至是完全一样的)
如果出现了一个硬件方面的安全漏洞,很有可能会导致你【所有的】苹果笔记本都中招。
◇Linux 的优势
相比 Windows 和 mac OS,Linux 支持的 CPU 类型非常非常多(有可能你听说过的 CPU,它都支持)。
除了 CPU,Linux 对其它的硬件的支持也很全。为了让不熟悉 Linux 的同学有所了解,举一些 Linux 支持的硬件机型作为例子:
智能手机和平板
家用的网络路由器
电视机顶盒
树莓派(Raspberry Pi)
轿车的车载系统
大型机、中型机、小型机
……
注:
上述这个列表只是举例说明 Linux 支持的机型很多。(对普通用户而言)即使只考虑 PC,Linux 支持的 PC 机型也会明显多于 macOS。
所以,如果某个 Linux 粉丝家中有 N 台 PC,他为了降低“硬件的单点风险”,完全可以在购买 PC 的时候,选择硬件完全不同的设备(比如一个是 Intel 的 x86 芯片,另一个是 ARM 芯片;再比如:一个是台式机,一个笔记本)。
★Linux 的用户群更加小众——避免了【树大招风】
三大桌面操作系统的用户数,基本上是:Windows > macOS > Linux(Linux 的用户群是三个里面最小的)
因此,不管是民间的草根骇客还是国家级的御用骇客,如果他们要研发渗透工具去入侵【桌面系统】,他们会把最多的资源(人力/物力)用来开发针对 Windows 的渗透工具;其次才是针对 mac OS 的渗透工具;而针对 Linux 【桌面】的渗透工具是最少的。
★Linux 是开源的——有助于代码审查
开源的好处有很多。包括本文前面提到的其中几点,也是跟“开源”密不可分的。
考虑到篇幅有限,在本章节,俺只聊开源带来的其中一个好处——代码审查(Code Review)。
在开源社区有一个很有名的 Linus 定律:只要有足够多的眼睛,就可让所有问题浮现(given enough eyeballs, all bugs are shallow.)
。这个定律指出了——开源对代码审查的关键作用。
(注:其实这个定律最早的提出者不是 Linus,而是埃里克·雷蒙德——《大教堂与市集》的作者)
为了加深大伙儿的印象,俺拿 Windows 来作为反例——因为 Windows 基本上完全是【闭源】的。
假设某个微软的程序员想要作恶——在 Windows 的某个核心模块中留下一个后门。由于 Windows 的核心模块都是【闭源】的,外界人士要想在闭源的模块中发现这个后门,难度非常大。虽然微软内部也有代码审查,但是微软内部搞代码审查的人,其人数是很有限滴,这些人的精力和工作热情也是很有限滴。所以,这类后门是很难被发现滴!
反之,很多 Linux 发行版是完全开源的(从内核到应用软件,全部都提供源代码)。如此一来,全世界的程序员或者安全研究人员(只要愿意)都可以去看这些源代码。看代码的人多了之后,发现安全隐患的概率就会大大提升。
★有些 Linux 发行版由【社区维护】——有助于摆脱商业公司,降低隐私风险
(三大桌面系统中)只有 Linux 才存在【社区维护】这种概念。另外两大桌面系统(Windows 和 mac OS)都是由【商业公司】来维护的。
商业公司与开源社区,有一个非常本质的区别——【商业公司要考虑盈利,而开源社区没有赚钱的压力】。
俺博客的老读者应该知道——俺对商业公司(尤其是商业大公司)抱有某种不信任的态度,原因包括如下:
1. 商业公司会为了利润,而主动收集用户隐私
Google 是这方面典型的【反面】教材——Google 90% 以上的利润来自“在线广告业务”。为了实现广告的【精准投放】,Google 不得不收集用户隐私,以增加对【每一个网民】的了解(Google 对你了解得越多,它投放给你的广告就越精准)
2. 商业公司会为了利润,而迫于政府压力实施监控
永远不要忘记斯诺登曝光的棱镜门丑闻。
★Linux 有更完善的软件包管理机制(此优点主要针对 Windows)——有助于避免中招
◇缺乏“软件包管理机制”的风险
长期以来,Windows 一直缺乏成熟完善的软件包管理机制。很多菜鸟想要装软件,不外乎如下步骤:
1、先到百度上搜一下
2、找到某个下载站点
3、把软件下载下来
4、安装
5、使用
上述这种操作步骤,【至少】存在两个安全缺陷:
缺陷1:软件下载站点提供的安装包,【未必】是纯洁的(可能已经被人做了手脚)
解释:
有的软件下载站点(或网盘),本身就是黑店——它们提供的软件包本身是植入后门的;
还有的软件下载站点(或网盘),因为管理员的疏忽——在收集软件包的时候没有仔细检查,混入了病毒/木马。
举例:XcodeGhost 事件
此事的根源在于:因为苹果公司官方的 Mac App Store 被 GFW 干扰,很多国内的程序员难以从 Mac 官网下载 Xcode(这是苹果系统的开发工具),有的程序员为了省事儿,直接通过网盘下载 Xcode。其中有些人下载到的 Xcode 是带有病毒/木马的。然后这些粗心的程序员又用这个带毒的 Xcode 去开发 iOS 应用,结果导致开发出来的 iOS 应用也是带毒的。
受波及的 app 【至少】包括:微信、网易云音乐、滴滴打车、高德地图、12306、中信银行、同花顺……(大公司倒下一片)
缺陷2:软件下载过程中,【可能】被篡改
解释:
如果下载过程中的传输是基于【明文的】HTTP 或 FTP,那么就存在【下载过程中被篡改】的风险。
缺陷3:没有及时升级新版本
大部分软件本身是不提供“自动升级”功能的,对这类软件,你就需要自己手动去更新到新版本。
自己手动更新,麻烦且不说,而且每一次更新,就又重复上述这两个风险。
◇“软件包管理机制”的好处何在?
刚才介绍了——传统方式下安装软件的风险。那么“软件包管理机制”如何规避这些风险捏?
好处1:更可信的来源
对于一个 Linux 发行版而言,它的口碑越好,通常也说明:它提供的软件包越可靠。
发行版的管理员是如何确保可靠性的捏?他们通常会从某个软件的官方网站直接获取“第一手材料”(减少了中间环节)。
好处2:自动的文件校验机制
完善的软件包管理器肯定会自带“文件校验”的方式(有的是基于“散列值校验”,有的是基于“数字签名”,有的是这两种相结合)。
有了文件校验的机制,如果软件包在下载过程中被篡改了,在【安装之前】就会被发现。
好处3:自动的软件升级机制
几乎所有的软件包管理机制,都会帮你实现“自动升级”。总是保持自动更新,可以大大降低安全漏洞的风险。
★Linux 有更严格的“文件权限”(此优点主要针对 Windows)——有助于降低病毒的流行
曾经有一个流传很广的【谬误】——因为 Windows 的用户数量大,所以才导致 Windows 下的病毒泛滥。
要反驳这种谬误很简单——如今“Android 装机总量”已经大大超越“所有版本 Windows 的装机总量”。但是 Android 并没有出现像 Windows 那么泛滥的病毒传播。
那么,是什么导致 Windows 的病毒泛滥捏?一个很重要的原因是——文件权限不合理:
◇FAT 文件系统,完全不支持“文件权限”
早期的 DOS 操作系统以及早期的 Win9x(Win95、Win98),只支持 FAT 格式的文件系统。而这种文件系统【不支持】文件权限。
没有文件权限就意味着——任何一个进程都可以修改 FAT 分区中的任何一个文件。这样的系统环境,简直就是病毒的天堂。
所以在 DOS 时代以及 Win9x 时代,病毒的流行程度很广;到了“NT 系列”开始普及(从 Win2000 开始普及),NTFS 文件系统用得多了(NTFS 支持文件权限),病毒的流行程度(相比 DOS 及 Win9x)就少了很多。
◇Windows 缺乏【严格的】“可执行权限”(默认情况下,仅仅 exe 扩展名就可以运行文件)
在 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 发行版来介绍这些傻瓜教程,
如果你想要推荐其它发行版(作为傻瓜教程的基础),可以在本文留言。
发表回复