Foundations of Security: What Every Programmer Needs To Know 读书小结
初略地看了一下这本书配套的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