Foundations of Security: What Every Programmer Needs To Know 读书小结

Sina WeiboBaiduLinkedInQQGoogle+RedditEvernote分享




初略地看了一下这本书配套的PPT,有些想法想写下来和大家交流一下。我个人的背景是对网络,操作系统比较熟一点,但是对安全的理解顶多就是个初学者。虽然我在几个做网络安全设备的公司工作过,现在也还在从事建造网络安全设备的工作。但是,做网络设备盒子和安全还是有很大的不同。最近闲来下来,正好可以补充一下自己这方面的知识,也顺便和业界的同仁交流一下心得。

知识要形成体系才能在做系统的时候,把方方面面都考虑进来。虽然面面俱到是不可能的,但至少有一个坚实的基础,或这为未来预留一定的空间。这也是弯曲的陈首席经常强调的系统工程师,而不是网络工程师或者内核工程师的原因。做为一个系统工程师,当然需要考虑如何建造系统,让系统显得壮观,坚实,但是也不能忽略系统安全方面的需求。安全的重要性不用多说,但不是每个系统工程师都能意识到。

给大家推荐这本书《Foundations of Security: What Every Programmer Needs To Know》。理由是这本书的思路足够清晰,问题能讲清楚,而且页数也不多,英语足够简单易懂。最重要的,是有配套的PPT,这样没时间看书的人可以浏览一下PPT,抓住重点就可以了。当然,安全的实践是没有那么简单的,业界的牛人基本上都是在寻找漏洞,攻击系统,很少有人从设计,编码,测试,以及应用角度去解决安全的问题,这也是我努力的方向之一。

说到安全,首先要关注安全目标,书中列出了几个安全目标:

1) Authentication

2) Authorization

3) Confidentiality

4) Data / Message Integrity

5) Accountability

6) Availability

7) Non-Repudiation

具体的意思就不一一解释了,wiki或者是百度百科搜一下就都明白了,至于是不是真的明白了,要看实践的效果如何了。

为了达到这些安全目标,我们会采用不同的安全措施和产品。比如身份认证,加密,防篡改,入侵检测等等。不同的安全产品所达到的安全目标是不一样的,所以定位就很重要。懂产品的读者可以说说这方面的考虑。

我们来看看攻击是如何影响安全目标的:(攻击的类型也是引用这本书列出的攻击,更多的读者可以自己补充)

1)Defacement,书中的例子是网页被篡改,这个影响的是Data/Message integrity。

2)Infiltration(入侵),这个影响的是认证(authentication)和authorization(授权)。

3)Phishing,这个影响的是认证(authentication),用户需要检查相应网站是否是真实合法的网站。

4)Pharming,DNS被篡改,这个影响的是Data/Message integrity。

5)Insider Threats,这个影响的是认证和授权,也可以包括日志审计(Accountability)。

6) Click Fraud,这个影响的是认证。

7)Denial of Service (DoS),这个影响的是可用性(Availability)。

8)Data Theft and Data Loss,这个影响的是认证,授权和保密(Confidentiality)。

为什么这些攻击能够成功,可能有两个原因:一是没有防护措施,二是防护措施失效了(被绕过了,或者是检查不够严密)。防护措施失效可能有多种原因,但是没有防护措施是说不过去的。所以系统安全设计的目标是如何有效利用安全措施以保证系统安全。安全设计有一些很好的最佳实践(good practice)和原则(principle),下面是书中列出的实践和原则。

1)Principle of Least Privilege:最小权限。给予完成工作所需的最小权限,只做权限范围内的事。权限的范围与具  体的任务和角色相关。最直观的一个例子就是wordpress的权限管理。wordpress默认定义了如下几种角色:

“订阅者”,“投稿者”,“作者”,“编辑”,“管理员”,每个角色的权限范围不同。wordpress的权限是  包含的,比如“投稿者”就拥有“订阅者”的权限。有些时候可能需要完全隔离的角色,比如一些安全设备里面的“策略编辑”和“日志审计”就需要完全独立的权限。额外的权限意味着暴露更多系统的接口,就越容易被攻击。

2)Defense-in-Depth:深度防御。也可以解释为多层次防御。比如从L3到L7的的多层防御,或者是从操作系统层到应用程序层的多层防御。不同层次看到的东西是不一样的,所以深层防御并不是做重复的事。

3)Diversity-in-Defense:多种防御手段。不多说了。

4)Securing the Weakest Link:保护最薄弱环节。不多说了。

5)Fail-Safe Stance:安全地失败。最简单的一个例子就是口令认证。如果口令三次错误,需要锁定账号,而不是无限地尝试下去。

6)Secure By Default:缺省的安全。一个简单的例子,防火墙的缺省策略应该是禁止所有,这样才能起到访问控制的作用。如果是允许所有,那么在禁止策略失效的情况下,系统就成了不设防的堡垒。

7)Simplicity:简单。哪里都适用的原则,不管是做系统,还是设计安全功能。

8)Usability for Security:安全的可用性。可用性,易用性是和安全矛盾的目标吗?这个在弯曲评论上有很多争论,看结论是可用性,易用性和安全是可以统一的目标。并不是安全产品就很难用,就应该难用。但是,如何达到这样的统一?

9)Security Features Do Not Imply Security:使用了安全产品并不一定就意味着安全。这句话听起来有点矛盾。 但是另一句话可能更清楚一点“Security is a process, not a product”。有些安全目标是安全产品可以达到,但 有些不是。这里面最重要的是人的因素。产品需要人用,风险需要人去评估和克服。常说安全是“三分技术,七分管理”,这个当然是见仁见智。但是从更大的范围来说,某一个安全产品只能算是一道屏障,而不是全部。一个产品,不但是能用,好用,还要看怎么用。还有一句话是“Security is about risk management“,使用安全产品只能降低风险,而不能完全消除风险,所以,相应的风险管理措施也必须有。

现在做安全设备的厂商,出问题更多的是系统的稳定性,性能,网络功能的实现等等。很少有专门提到某个安全功能不好用,或者失效的情况。这也可能是不同的厂商有自己的强项和侧重点。从网络设备转过来的厂商,安全功能差一点;从一开始就做安全的厂商,网络功能差一点。两方面都强的,谁能举个例子?

说完原则和最佳实践之后,就是具体的技术,暂时还没有什么可以拿出来说的东西,等以后明白点了,再写出来和大家分享。重要的不是说,而是做,与读者共勉。

参考资料:

1)http://www.foundationsofsecurity.com

2)http://code.google.com/intl/zh-CN/edu/submissions/daswani/

3)https://www.owasp.org/index.php/Main_Page

4)http://www.webappsec.org/

(没有打分)

雁过留声

“Foundations of Security: What Every Programmer Needs To Know 读书小结”有5个回复

  1. kernelchina 于 2011-08-05 7:36 上午

    弯曲最近文章比较少,就把这个当做是抛砖引玉吧。软件系统的安全设计,目前看到的大多都是如何编写安全代码,以及测试相关的一些内容。但是关于安全架构,安全设计,安全模式方面的东西比较少。在企业级开发里面,安全实践有很多(SOA相关的),但是对于从事系统软件或者嵌入式开发的,这方面的实践就非常少。本文就是想介绍一些关于系统安全设计的一些知识,希望能够激起更多关于这方面的评论和讨论。

  2. LTEer 于 2011-08-05 7:51 下午

    给个下载链接?thx

  3. zedware 于 2011-08-06 8:28 上午

    有些特殊的情况需要特殊的办法:例如管理IT主机或数据库的管理员在国内的职位一般都比较低,但是管理的数据可能很重要。领导会觉得我看的数据只有一部分,你看的数据反而是全部。

  4. aking 于 2011-08-07 7:46 下午

    是否可以发下那个PPT? 多谢!
    chinawillok@gmail.com

  5. aking 于 2011-08-07 7:55 下午