趣话安全启动:迷思与启示 2021-10-08 操作系统 暂无评论 2230 次阅读 最近终于沉下心读完了当年明月大作《明朝那些事》。说实话,当朋友推荐这本书时,我的内心是拒绝的,多么低俗的笔名和书名!看过黄仁宇先生《万历十五年》等书和钱穆先生的大作的我,怎么也要读某些古籍书才更加合适吧?然而当我得知作者深厚的学术功底和上千万的销量时,还是以猎奇的心态开始了阅读。谁知一旦开始就完全停不下来,如饥似渴的读完全部七册才感叹历史也可以写得如此有趣。在这个快餐文化和娱乐文化盛行的年代,也许有趣和专业可以并行不悖,用诙谐的笔法写出准确的知识才是普及知识的正确姿势吧。 在前两篇关于安全启动和Bitlocker(Bitlocker、TPM和系统安全)的文章发布之后,不少读者提出了一个十分有趣而富含思考的问题:既然安全启动如此重要,那么为什么几乎所有BIOS都包含关闭安全启动的选项?如果能够这么做,安全启动又有什么意义?不得不说,这些读者是善于思考,勇于思考和脱离了低级趣味的人。这个问题的答案既非常简单,又非常复杂,我不得不从技术、历史和市场策略以及现实考量等方面全方位讲述,读者还可以顺便打包带走一些实用技巧: 1. 安全启动的优点和缺点。 2. 安全启动推出的历史背景与微软的窘境。 3. 安全启动是微软为了干掉Linux而搞的阴谋吗? 4. Linux世界的证书问题。 5. 如何关闭安全启动? 6. 结论和思考 7. 对先行者的致敬 当然如果你正在蹲坑,想要在一分钟内了解答案的话,也可以直接跳到结论部分,别忘了点赞哦。 #安全启动的优缺点 在前文(UEFI安全启动)我们详细介绍了安全启动固件中的所有知识点,也许比较晦涩(所以阅读量较低,哭)。这里我们来个一分钟快速了解版。 安全启动就是为了防止恶意软件在操作系统启动前得到执行,从而验证所有启动路径上的节点的签名的技术,如下图: ![sercure-boot-01.jpg](https://blog.moper.net/usr/uploads/2021/10/2465583736.jpg) 图片上半部分是原先的启动流程,下半部分是开启安全启动的流程。可以理解为,在开启安全启动后,在信任的组件运行结束后(如烧录在Flash上的UEFI固件PEI和DXE部分),固件接下来会要求所有运行应用和驱动都要有被认可的数字签名,否则不予执行。这些应用和驱动包括:Shell、扩展驱动和OS Loader。最后OS Loader也就是操作系统引导程序,它的本质是一个UEFI应用程序,它由操作系统厂商提供并签名。其后的操作系统的映像签名则由OS Loader来验证,由此构成一个信任链条,保证OS映像甚至内核驱动都是被签名验证过的。 安全启动的最大好处自不待言,那就是安全。信任链条的建立,有效的防止了恶意驱动的入侵。由于UEFI的开放性,自己制作一个UEFI应用是个十分方便的事情。如果能够在OS得到运行之前就插入启动路径,就可以监视OS,绕过了OS的重重防护,记录键盘等的输入也就是分分钟的事情。这样,微软为了保护数据安全苦心经营的种种防护手段就有被釜底抽薪之虞,微软的焦虑之情也就可想而知了。毕竟数据丢失了,用户不会找到主板厂商讨说法,微软则是个方便的目标。 安全性和易用性、兼容性往往是矛盾的。安全启动的缺点就缘于此。打开安全启动后麻烦事情接踵而至: 1. 兼容性怎么办?老的操作系统,老的OS驱动程序怎么办?总不能说是“难言之隐,一洗了之”吧。 2. Linux世界怎么办?谁给他们签名呢?就算有OS Loader有签名,驱动程序的证书由谁颁发呢? 3. 多重启动怎么办? 于是乎,在谷歌搜索安全启动,排在前面的都是如何关掉安全启动,英文网站也是如此。就连这个技术的推动者微软,也在官网上介绍如何关掉这个功能(参考资料2)。这不得不说是对安全启动的 一种讽刺。 那么安全启动是不是前途暗淡,是个失败的技术呢?答案当然是否定的,所谓安全问题无小事,路途虽然艰险,但是前行的动力却是巨大的。 #安全启动小史 微软的Windows的安全性一直深受诟病。随着操作系统层面的漏洞逐渐减少,黑客们盯上了BIOS固件。绝不能让西风压倒东风,微软和英特尔的工程师临危受命,日夜干活,哇啦,UEFI安全启动诞生了,从此世界和平,并永远和平!脱离了黑客困扰的人们,在wonderland里面幸福的生活了下去。 真希望现实世界如此简单美好。安全启动的生平却是另一番景象,可以用命运多舛来形容。微软在Windows 8推出的时候,顺势将开启安全启动列入了windows的logo验证清单中,寄希望于强势出击,一举荡平安全隐患。 说到这个logo验证,也许一般用户不太清楚,但对于主板厂商却是相当重要。通过了它,就可以在产品说明里面写上Design for Windows X,并可以在机器上傲娇地贴上黑色的象征荣誉出身的贴纸,格调立马高了不少,好处那是大大的。 微软希望强压主板厂商开启安全启动,以正本清源。结果在IT界引来巨大骚动,主板厂商还未发声,Linux世界却沸腾了!问题在于微软的windows只此一家,别无分号。OS loader签名就一个,主板厂商BIOS直接将微软CA加入固件中去就行了(通过PK)。但是Linux世界却是分崩离析的,大兄弟们(各种大发行版,Ubuntu, Fedora等等)就有好几个,小兄弟们更是数不胜数。加上还有不少home made私生子,就更复杂了。这些人谁也不服谁,叫他们公推个签名管理机构,那是别想了。大家虽然平时吵吵嚷嚷,但却公认最大而且最凶恶的 敌人只有一个,那就是微软!这下可好了,微软打上门来了,将来所有主板都不能刷Linux了,这是要我们的命啊!看来帝国主义忘我之心不死,于是大家平息争端,矛头一致对外,谴责强推安全启动的行为! 一时间黑云压城(别打我,我改口重正盈朝还不行吗),各种阴谋论此起彼伏。微软无奈使出了最后的绝招:逃跑!它弄了个一百八十度大转弯,修改了logo认证条款,不是要求必须开启安全启动,而是要求必须有“关闭安全启动”选项才给认证。你没有看错,差点就说必须关闭安全启动了(Windows RT除外,其还有必须有安全启动且不能关闭)。这才平息了风波,直到Windows 10。 Windows 10诞生的时候,Linux的签名问题已经得到缓解(后文介绍),于是,Logo条款变成“关闭安全启动是optional的”,要看主板自己的 选择。注意这里optional我没有翻译,大家可以细细体会整句个中滋味,不要被我个人思维所误导。 这次Linux社区比较平静,也许是签名问题不再是个大问题的原因。什么发生了变化呢? #Linux世界的签名问题 这个问题说复杂很复杂,说简单也很简单。就如我前面说过的,是个信任问题。主板厂商有PK,是可以加入新的CA,但是你总不能让他们加入几十个乱七八糟的CA吧,这样漏洞太多,还不如不加。要加加几个是可以的,但加谁的呢?你加了Ubuntu的,red hat不乐意了,我混了这么多年,怎么成小弟了,每次要你给我签名?弄个中立的机构,钱谁出?小兄弟这么多,有穷的,有富的,谁都不想让竞争对手搭便车。 微软比较慷慨,说你们别吵了,看在我要推广安全启动的份上,我来给你们的证书签名!钱也不要你们出,主板厂商只要我的CA就行了,当然也不能随便签名,还是要审查一下的。这下岂不两全齐美?可惜Linux大多数兄弟可不这么认为:这不是与虎谋皮吗?除了个别屈服外,大家还在探索另外的途径。 现在解决方案主要分为GRUB方案和Shim方案,为了不偏题,我们今后另开文介绍,敬请期待!(挖坑中。。。。) 不但有OS loader安全的问题,Linux中的驱动签名也是个问题,有很多讨论,可以参考后附的参考资料4和5。 #如何关闭安全启动 现在到了Bonus时间。我来介绍一下我最不愿意介绍的关闭安全启动部分。网上很多文章都有提及,为了避免有些读者舟车劳顿,我这里简单介绍一下。 1.如何进入BIOS? 也许你觉得这个问题很傻,其实你会很吃惊的发现,有许多老鸟也不知道。这也不能怪大家,进入BIOS的方式没有定数,有些主板是F2,有些是F10,奇葩的选Esc等等。加上现在都是UEFI+固态硬盘,启动飞快,谁看得到一闪而过的提示啊(有些主板根本不提示)!其实现在Windows8以上可以在操作系统里面选择进入BIOS设置界面。具体步骤是: A. 在选择reset时按住Shift ![sercure-boot-02.jpg](https://blog.moper.net/usr/uploads/2021/10/2274690425.jpg) B. 你会重启进入Advanced Options界面: ![sercure-boot-03.jpg](https://blog.moper.net/usr/uploads/2021/10/528140604.jpg) C. 选择UEFI Firmware Settings,并确认重启 ![sercure-boot-04.jpg](https://blog.moper.net/usr/uploads/2021/10/67782586.jpg) D. 哇啦,BIOS设置界面开始了。 2.如何关掉安全启动。由于BIOS的设置不同的主板不同,没有一定之规,但一般都在Boot选项卡里面,如下: ![sercure-boot-05.jpg](https://blog.moper.net/usr/uploads/2021/10/2472182303.jpg) 关掉即可。 #结论 现在我们回过头来回答这个问题:既然安全启动如此重要,那么为什么几乎所有BIOS都包含关闭安全启动的选项?如果能够这么做,安全启动又有什么意义? 在看了前面描述可以知道答案:非不为也,实不能也。关闭安全启动可以规避兼容性问题和法律风险,是个不得不做的选择。不等不承认,关闭安全启动的选项存在,是有漏洞可以钻的。在Windows 10大行其道的今天,关闭安全启动变成可选项,也许假以时日,所有可以关闭安全启动的选项都会消失。这个问题也会不再存在。 需要指出的是关闭安全启动需要在BIOS中进行,而BIOS是有密码保护的。安全启动并不能解决机器脱离控制,譬如被盗后被清密码的问题,毕竟把硬盘拿下了copy更加方便。它的目的是堵住固件和操作系统衔接阶段的漏洞,至于固件本身的安全和操作系统启动后的安全则由它们各自负责。 说句不负责任的话:安全责任靠大家。系统的整体安全,需要多种技术综合作用:譬如Boot Guard、TXT、Secure Boot和Bitlocker等等。这需要硬件厂商、BIOS厂商、主板厂商和操作系统厂商一起通力合作,才能确保系统安全无虞。 #题外话 本文和上文部分资料来自UEFI安全领域的先行者和专家:Vincent Zimmer。他的blog大家可以关注一下(参考资料6),里面有不少安全领域的最新动向。另外有篇博文可以看到他的真容: http://vzimmer.blogspot.com/2017/02/this-one-is-for-20-or-anniversarynext5.html 从一个帅小伙,变成比较苍老。有道是:一入BIOS深似海,从此萧郎是路人! 参考资料: 1. https://technet.microsoft.com/en-us/library/hh824987.aspx 2. https://technet.microsoft.com/en-us/library/dn481258.aspx 3. https://davescomputertips.com/the-truth-about-windows-10-uefi-and-secure-boot/ 4. https://askubuntu.com/questions/843656/is-it-safe-to-disable-secure-boot 5. https://askubuntu.com/questions/755238/why-disabling-secure-boot-is-enforced-policy-when-installing-3rd-party-modules 6. http://vzimmer.blogspot.com/2017/ 转自https://zhuanlan.zhihu.com/p/30136593 标签: uefi, boot 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。