购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

作者简介

洛伦·科恩费尔德(Loren Kohnfelder)从事编程行业已经超过50年了,他在美国麻省理工学院攻读硕士研究生期间发表的论文《关于一项实用的公钥加密系统》(Towards a Practical Public-key Cryptosystem)(1978年)首次描述了数字证书以及公钥基础设施(PKI)基础。

在他的软件职业生涯中涉及各式各样的编程工作,包括打孔卡、磁盘控制器驱动、链接加载器、电子游戏的编写,还包括在一家半导体研究实验室编写设备控制软件,以及两份在日本的编程工作。在微软公司供职期间,他又开始从事安全方面的工作,加入了微软的IE浏览器团队,之后又加入了.NET平台安全团队,参与了主动安全过程方法的设计。

前几年,他供职于谷歌公司,曾担任安全技术团队的软件工程师,此后又参与组建隐私技术团队,对大型商业系统进行了百次以上的安全设计审查。

技术审校者简介

自Commodore PET和VIC-20问世以来,克利夫·扬森(Cliff Janzen)就与技术相伴(甚至为技术着迷)。平时他的主要工作就是管理和指导一个优秀的安全技术专家团队,同时不断通过处理安全策略审查、渗透测试和事件响应来跟进技术的发展。他一直对能够从事自己热爱的行业和拥有一位支持自己的伴侣深感幸运。 Z3dhu5JXuIYSS0QT9c5UeDFCmn1JJ3uKGlm9wgajuws+BiBrNDEM7OGMhnS7y1MP



推荐序

你即将开始阅读的这本书在很多方面都是独一无二的。它篇幅不大,是一本精心编写的、代码很少却很专业的技术读物。这本安全技术图书并非为安全技术专家编写。正如本书的作者Loren所说,本书融汇个人针对技术的深入观点,是由包装过大型商业产品、发明过重要安全技术,并且在产品安全方面有丰富工作经验的专业人士撰写的。

2006年,我加盟了微软,负责对所有产品和服务进行威胁建模。我们采取的主要做法就是借助本书作者提出的STRIDE(STRIDE是一系列单词的首字母缩写)模型来思考欺骗(Spoofing)、篡改(Tampering)、抵赖(Repudiation)、信息泄露(Information disclosure)、拒绝服务(Denial of service)和权限提升(Elevation of privilege)所带来的威胁。STRIDE已经成为我工作中的一项重要组成部分(它的作用如此之大,我甚至经常需要澄清STRIDE并不是我的原创)。事实上,在我阅读本书之时,我惊喜地发现作者在提到我的“4个问题”框架时,与我提到STRIDE时的评价相差无几。这个框架通过对4个问题进行自问自答来接近问题的核心:我们的工作是什么?哪里有可能出错?我们打算怎么办?我们干得怎么样?本书的大部分内容证明,虽然我和作者从来没有真正在一起工作过,但我们俩是真正的“合作无间”。

如今,世界正在不断发生变化,安全缺陷已经登上了各大媒体的头版。我们的客户对安全性的期待之高前所未有,他们会通过采用自己的评估标准、起草合同条款、给销售和执行人员施加压力、催促兑现新的策略,来推动我们满足他们的需求。现在就是我们把更好的安全设计方案(从概念到代码)集成到软件当中的绝佳时机。本书围绕一个非常困难的主题展开,那就是如何设计出安全的软件。

这个主题之所以困难是因为存在两大挑战。第一大挑战在于,安全和信任既自然又微妙。这部分内容包含在本书的第1章,所以这里不再赘述。第二大挑战在于,软件专业人员往往希望软件不需要进行设计。与其他工程领域的产品不同,软件的可塑性几乎是无穷的。在其他工程领域中,人们只有先制作好模型,才能弯曲钢材、浇筑混凝土或者对硅实施光刻操作。对于软件而言,我们则会创建代码、对代码进行细化,再把代码发布出来,而不会采纳弗雷德·布鲁克斯(Fred Brooks)的著名建议:你搭建的第一个系统很快就会被你丢掉,所以你最好把它当成原型(prototype)。我们所介绍的、关于软件进化的故事很少停留在那些徒劳无功的经历上。我们不会探讨失败的经历,只会探讨提出合理设计方案的过程。即便如此,我也知道读者或许会觉得我(甚至觉得本书的作者)是在宣传自己的设计方案。我也得承认这个主题包含另一项挑战,这项挑战也是本书一直在着力解决的——提供软件设计方面的实用建议。

本书主要写给刚刚投身到安全领域的技术从业者,欢迎你们成为这个领域的一员。你们在阅读本书的过程中会发现,你们针对系统的决策会对系统的安全性构成影响。但是,并非顶尖的技术专家才能做出更好的决策。本书会带你走得足够远。如果你们中有一部分人还希望走得更远,业内也有大量材料可以供你们参考,其他人则只需要把从本书中学到的知识应用到位就可以了。

Adam Shostack
Shostack+ Associates总裁
《威胁建模:设计和交付更安全的软件》的作者
华盛顿大学保罗·艾伦计算机科学与工程学院副教授 1a6c5k173mhRelE98TlvV16ybInOVbrl+hf/HoNb5hX9FPs9ALizYSXcj/PNQssM



自序

如果你始终不能告诉别人你一直在做什么,那么你在做的事也就一文不值。

——埃尔温·薛定谔

同我一起用一次徒步旅行来领略软件安全的美吧!

我印象最为深刻的徒步旅行始于距离考爱岛顶部不远的一座热带雨林,那里经常被朦胧的雾气和细雨所笼罩。起初,徒步小径是一段缓坡,然后需要在一段险恶的地方走一段湿滑、陡峭的斜坡。接下来,我们开始穿越一片山谷,谷中长满了生姜和多刺的马缨丹灌木。这时,路越来越泥泞,我们也开始分心,不时地回头、转身。步行了几公里之后,树木渐渐变得稀疏,温度也开始升高。随着海拔降低,气候逐渐变得干燥。再向前走一段,太平洋的远景开始渐渐在我们眼前展开,这也让徒步团队欣喜不已。

根据我的经验,很多软件从业人员都认为保障安全是一段令人生畏的旅程。这段旅程弥漫着浓雾,甚至让人觉得诡谲难辨。这种认识当然也有合理之处。如果我们把编程与自然环境进行类比,这种体验大致就是如此。

我们徒步旅行的最后一公里是一片由松散火山岩凝结而成的危险地带,因为这座岛屿本身只存在500万年,还不足以形成土壤。代码也像岩石一样坚硬、冷酷,同时它也非常脆弱,一点点缺陷就足以让它全盘崩溃。好在我们对山岭中的徒步路线进行了仔细的遴选,每处最陡峭的位置都有一些天然形成的“把手”——要么是突出的坚固玄武岩,要么是铁心木露出的根部。

在徒步旅行的最后,我们发现自己正沿着峡谷的边缘行进,踩着脚下松软的土地就像踩在滚珠轴承上一样。我们的右手边是落差600多米的悬崖。有些地方,路径的宽度和我们肩膀的宽度差不多。我看到一些有恐高症的徒步旅行者在这里转过身,没有勇气继续前进。但大多数人依然信心满满,因为我们的徒步路径往山壁一侧微微倾斜,我们左侧的风险微乎其微。我们当然面临着同样的风险,但那只是一个缓坡,在最坏的情况下我们也只会滑落至多两米。在撰写这本书的时候,我经常想到这条道路。我也在努力为读者创造这样一条路径,利用这种故事和类比方法来解决那些最棘手的问题,我希望这样可以让读者有所收获。

保障安全是一项充满挑战的工作,其原因如下:安全非常抽象,但主题很庞大,而如今的软件不仅脆弱,且极为复杂。本书要怎样才能在深入解释安全复杂性并且与读者建立联系的同时,不让太多信息压垮读者呢?这里我用徒步旅行者行走在峡谷边缘的精神面对所有挑战。我不想让读者流失,所以对内容进行了简化,并省略了一些可有可无的细节。通过这种方式,我希望读者可免于“跌入峡谷当中”——被大量信息弄得晕头转向、意志消沉,最终选择放弃。希望本书成为一个跳板,激起读者继续探索软件安全实践的兴趣。

当读者来到徒步旅行的最后一段路时,山岭豁然开朗,道路变成康庄大道。绕过最后一段弯道,读者就可以领略到纳帕利海岸的壮丽全景。我们的右手边是一个青翠的悬空山谷,恰似从高山上雕琢而成。一条瀑布飞流直下,汇入下方蜿蜒的河流。错综复杂的海岸线一直延伸到远处,可以看到地平线上临近的岛屿。造访这里带给我们的惊喜永远不会过时。欣赏着美景,啜饮琼浆后,我们还要原路徒步返回。

恰如我永远无法领略这个岛屿的每一寸土地,我也不可能掌握与软件安全有关的所有知识。当然,也没有任何一本书可以完全涵盖所有的主题。我能够为读者展示的东西,只是我自己的经验而已,这一点就和带领我们徒步的导游一样。我们每个人都会围绕着这个主题讲述自己的故事,因此能够长时间从事这项工作实属幸事。我曾目睹这个行业的一些重要发展历程,并且从早期就开始关注技术和软件开发文化的演变。

本书的目的是向读者展示安全技术行业的布局,同时对其中的一些危险给予警告,让读者可以更加自信地自行探索。关于安全问题,基本没有放之四海而皆准的指导方针。我的写作目标是给读者展示一些简单的案例,首先激发读者的兴趣,进而加深读者对核心概念的理解。对于真实世界中的安全挑战,永远都是需要很多背景信息才能更好地评估各种可能的解决方案,最好的决策都是建立在对设计方案、实施细节等有深入了解的坚实基础之上。在读者掌握了基本的思想并且开始把它们付诸实践的时候,工作本身也会随着不断实践而越来越直观。好在,随着时间的推移,哪怕是一点点进步都会让我们觉得自己的努力是值得的。

回首自己供职于主流软件公司安全技术团队的时光,我总是会为失去的一次机会深感遗憾。在一家大型、利润丰厚的企业工作自然有很多好处:不仅有现场按摩和豪华咖啡厅,还有现场安全技术专家指导和设计审查流程。然而,其他软件开发工作很少能够享受到这种程度的安全专业知识和在设计方案中集成安全性所带来的好处。本书旨在让软件社区制定相关标准的实践方法。

设计人员需要平衡数不清的问题,其中那些优秀的设计人员固然知道需要考量哪些安全要素,但他们也很难让安全设计得到有效的审查(我没有从业内任何熟悉的人那里了解到顾问提供过什么服务)。开发人员拥有的安全知识层次也各不相同,除非他们中的一些人把安全知识当成一种专长来加以追求,否则他们的知识层次充其量只能算是零零散散、不成体系。有些企业确实非常重视安全问题,因此它们聘请了一些专家级顾问,不过这种事往往发生在整个流程的后期,它们是亡羊补牢,希望能够在软件发布之前提升它的安全性。在发布之前强化安全性已经成为业内的基本操作——这与实际的安全需求背道而驰。

在过去几年里,我一直都在潜移默化地向其他同事传播安全的理念。在这个过程中,我总能看到一些人心领神会,其他人则不知所云。人们的反应为何差距如此之大?这一直都是一个谜,或许心理层面的因素甚于技术因素,但是这让我们思考更多的问题——“获得”安全性到底指的是什么?我们又应当如何传授这方面的知识?我说的不是那种最前沿的知识,也不是说要让听众掌握这些知识,只是让他们能够充分了解我们所面临的挑战,让同事了解如何循序渐进地提升安全性。以这些作为起点,软件从业人员就可以通过自学来弥补知识方面的缺陷了。这就是本书要努力实现的目标。

在写作这本书的过程中,我对这项工作所面临的挑战了解得越发深入。一开始,我惊讶地发现市面上还没有同类图书;如今,我相信自己已经找到了原因。安全的概念往往和人们的直觉相反,攻击花样百出且相当隐蔽,而软件设计本身已经非常抽象了。如今的软件丰富多样,保护各类软件是一项艰巨的挑战。软件安全至今还是一个有待解决的问题,但是我们对软件安全已经拥有相当的了解,且还在不断改进——要是软件安全不是一个快速变化的目标就好了!我当然不可能对所有问题都给出无懈可击的解答。轻而易举就能给出答案的安全问题都已经被集成到我们的软件平台当中了,剩下的问题都没有那么容易解决。本书会在战略上强调安全意识的概念和发展,这可以让更多人参与到安全工作中来,从而提供各种各样的全新视角以及人们一致关注的安全要点。

我希望读者加入我的这个“私人旅行团”,沿着我最为倾心的路径来领略安全技术的风景,我则会在旅途中向读者分享最有趣的见解以及我为读者提供的有效方法。如果本书可以让读者相信,人们应该在设计阶段就把安全问题考虑在内,在软件开发的整个过程都应该考虑安全问题,以及读者应该在本书之外进行更多的学习和研究,那么我的目的就达到了。 1a6c5k173mhRelE98TlvV16ybInOVbrl+hf/HoNb5hX9FPs9ALizYSXcj/PNQssM

点击中间区域
呼出菜单
上一章
目录
下一章
×