如果你始终不能告诉别人你一直在做什么,那么你在做的事也就一文不值。
——埃尔温·薛定谔
同我一起用一次徒步旅行来领略软件安全的美吧!
我印象最为深刻的徒步旅行始于距离考爱岛顶部不远的一座热带雨林,那里经常被朦胧的雾气和细雨所笼罩。起初,徒步小径是一段缓坡,然后需要在一段险恶的地方走一段湿滑、陡峭的斜坡。接下来,我们开始穿越一片山谷,谷中长满了生姜和多刺的马缨丹灌木。这时,路越来越泥泞,我们也开始分心,不时地回头、转身。步行了几公里之后,树木渐渐变得稀疏,温度也开始升高。随着海拔降低,气候逐渐变得干燥。再向前走一段,太平洋的远景开始渐渐在我们眼前展开,这也让徒步团队欣喜不已。
根据我的经验,很多软件从业人员都认为保障安全是一段令人生畏的旅程。这段旅程弥漫着浓雾,甚至让人觉得诡谲难辨。这种认识当然也有合理之处。如果我们把编程与自然环境进行类比,这种体验大致就是如此。
我们徒步旅行的最后一公里是一片由松散火山岩凝结而成的危险地带,因为这座岛屿本身只存在500万年,还不足以形成土壤。代码也像岩石一样坚硬、冷酷,同时它也非常脆弱,一点点缺陷就足以让它全盘崩溃。好在我们对山岭中的徒步路线进行了仔细的遴选,每处最陡峭的位置都有一些天然形成的“把手”——要么是突出的坚固玄武岩,要么是铁心木露出的根部。
在徒步旅行的最后,我们发现自己正沿着峡谷的边缘行进,踩着脚下松软的土地就像踩在滚珠轴承上一样。我们的右手边是落差600多米的悬崖。有些地方,路径的宽度和我们肩膀的宽度差不多。我看到一些有恐高症的徒步旅行者在这里转过身,没有勇气继续前进。但大多数人依然信心满满,因为我们的徒步路径往山壁一侧微微倾斜,我们左侧的风险微乎其微。我们当然面临着同样的风险,但那只是一个缓坡,在最坏的情况下我们也只会滑落至多两米。在撰写这本书的时候,我经常想到这条道路。我也在努力为读者创造这样一条路径,利用这种故事和类比方法来解决那些最棘手的问题,我希望这样可以让读者有所收获。
保障安全是一项充满挑战的工作,其原因如下:安全非常抽象,但主题很庞大,而如今的软件不仅脆弱,且极为复杂。本书要怎样才能在深入解释安全复杂性并且与读者建立联系的同时,不让太多信息压垮读者呢?这里我用徒步旅行者行走在峡谷边缘的精神面对所有挑战。我不想让读者流失,所以对内容进行了简化,并省略了一些可有可无的细节。通过这种方式,我希望读者可免于“跌入峡谷当中”——被大量信息弄得晕头转向、意志消沉,最终选择放弃。希望本书成为一个跳板,激起读者继续探索软件安全实践的兴趣。
当读者来到徒步旅行的最后一段路时,山岭豁然开朗,道路变成康庄大道。绕过最后一段弯道,读者就可以领略到纳帕利海岸的壮丽全景。我们的右手边是一个青翠的悬空山谷,恰似从高山上雕琢而成。一条瀑布飞流直下,汇入下方蜿蜒的河流。错综复杂的海岸线一直延伸到远处,可以看到地平线上临近的岛屿。造访这里带给我们的惊喜永远不会过时。欣赏着美景,啜饮琼浆后,我们还要原路徒步返回。
恰如我永远无法领略这个岛屿的每一寸土地,我也不可能掌握与软件安全有关的所有知识。当然,也没有任何一本书可以完全涵盖所有的主题。我能够为读者展示的东西,只是我自己的经验而已,这一点就和带领我们徒步的导游一样。我们每个人都会围绕着这个主题讲述自己的故事,因此能够长时间从事这项工作实属幸事。我曾目睹这个行业的一些重要发展历程,并且从早期就开始关注技术和软件开发文化的演变。
本书的目的是向读者展示安全技术行业的布局,同时对其中的一些危险给予警告,让读者可以更加自信地自行探索。关于安全问题,基本没有放之四海而皆准的指导方针。我的写作目标是给读者展示一些简单的案例,首先激发读者的兴趣,进而加深读者对核心概念的理解。对于真实世界中的安全挑战,永远都是需要很多背景信息才能更好地评估各种可能的解决方案,最好的决策都是建立在对设计方案、实施细节等有深入了解的坚实基础之上。在读者掌握了基本的思想并且开始把它们付诸实践的时候,工作本身也会随着不断实践而越来越直观。好在,随着时间的推移,哪怕是一点点进步都会让我们觉得自己的努力是值得的。
回首自己供职于主流软件公司安全技术团队的时光,我总是会为失去的一次机会深感遗憾。在一家大型、利润丰厚的企业工作自然有很多好处:不仅有现场按摩和豪华咖啡厅,还有现场安全技术专家指导和设计审查流程。然而,其他软件开发工作很少能够享受到这种程度的安全专业知识和在设计方案中集成安全性所带来的好处。本书旨在让软件社区制定相关标准的实践方法。
设计人员需要平衡数不清的问题,其中那些优秀的设计人员固然知道需要考量哪些安全要素,但他们也很难让安全设计得到有效的审查(我没有从业内任何熟悉的人那里了解到顾问提供过什么服务)。开发人员拥有的安全知识层次也各不相同,除非他们中的一些人把安全知识当成一种专长来加以追求,否则他们的知识层次充其量只能算是零零散散、不成体系。有些企业确实非常重视安全问题,因此它们聘请了一些专家级顾问,不过这种事往往发生在整个流程的后期,它们是亡羊补牢,希望能够在软件发布之前提升它的安全性。在发布之前强化安全性已经成为业内的基本操作——这与实际的安全需求背道而驰。
在过去几年里,我一直都在潜移默化地向其他同事传播安全的理念。在这个过程中,我总能看到一些人心领神会,其他人则不知所云。人们的反应为何差距如此之大?这一直都是一个谜,或许心理层面的因素甚于技术因素,但是这让我们思考更多的问题——“获得”安全性到底指的是什么?我们又应当如何传授这方面的知识?我说的不是那种最前沿的知识,也不是说要让听众掌握这些知识,只是让他们能够充分了解我们所面临的挑战,让同事了解如何循序渐进地提升安全性。以这些作为起点,软件从业人员就可以通过自学来弥补知识方面的缺陷了。这就是本书要努力实现的目标。
在写作这本书的过程中,我对这项工作所面临的挑战了解得越发深入。一开始,我惊讶地发现市面上还没有同类图书;如今,我相信自己已经找到了原因。安全的概念往往和人们的直觉相反,攻击花样百出且相当隐蔽,而软件设计本身已经非常抽象了。如今的软件丰富多样,保护各类软件是一项艰巨的挑战。软件安全至今还是一个有待解决的问题,但是我们对软件安全已经拥有相当的了解,且还在不断改进——要是软件安全不是一个快速变化的目标就好了!我当然不可能对所有问题都给出无懈可击的解答。轻而易举就能给出答案的安全问题都已经被集成到我们的软件平台当中了,剩下的问题都没有那么容易解决。本书会在战略上强调安全意识的概念和发展,这可以让更多人参与到安全工作中来,从而提供各种各样的全新视角以及人们一致关注的安全要点。
我希望读者加入我的这个“私人旅行团”,沿着我最为倾心的路径来领略安全技术的风景,我则会在旅途中向读者分享最有趣的见解以及我为读者提供的有效方法。如果本书可以让读者相信,人们应该在设计阶段就把安全问题考虑在内,在软件开发的整个过程都应该考虑安全问题,以及读者应该在本书之外进行更多的学习和研究,那么我的目的就达到了。