架构设计重点难点 (架构设计原则和模式)

菜鸟程序员到架构师之路

每个程序员都有一个成为架构师的梦想,奈何手里无枪无法点燃心中奇梦。本系列文章分享如何让你手里有枪,只要努力,技术的梦想一定能实现,这应该是众多梦想中离地表最近的一个。

安全

安全本身是一个庞大而又复杂的技术领域,并且一旦出问题,对业务和企业形象影响非常大。 例如:

  • 2016年雅虎爆出史上最大规模信息泄露事件,逾5亿用户资料在2014年被窃取
  • 2016年10月美国遭史上最大规模DDoS攻击,东海岸网站集体瘫痪
  • 2013年10月,为全国4500多家酒店提供网络服务的浙江慧达驿站网络有限公司,因安全漏洞问题,致2千万条入住酒店的客户信息泄露,由此导致很多敲诈、家庭破裂的后续事件

正因为经常能够看到或者听到各类安全事件,所以大部分技术人员和架构师,对安全这部分会多一些了解和考虑。 从技术的角度来讲,安全可以分为两类:一类是功能上的安全,一类是架构上的安全。

  1. 功能安全 常见的XSS攻击、CSRF攻击、SQL注入、Windows漏洞、密码破解等,本质上是因为系统实现有漏洞,黑客有了可乘之机。 黑客会利用各种漏洞潜入系统,这种行为就像小偷一样,黑客和小偷的手法都是利用系统或家中不完善的地方潜入,并进行破坏或者*取盗**。因此形象地说,功能安全其实就是“防小偷”。

从实现的角度来看,功能安全更多地是和具体的编码相关,与架构关系不大。 现在很多开发框架都内嵌了常见的安全功能,能够大大减少安全相关功能的重复开发,但框架只能预防常见的安全漏洞和风险(常见的XSS攻击、CSRF攻击、SQL注入等),无法预知新的安全问题, 而且框架本身很多时候也存在漏洞(例如,流行的Apache Struts2就多次爆出了调用远程代码执行的高危漏洞,给整个互联网都造成了一定的恐慌)。

所以功能安全是一个逐步完善的过程,而且往往都是在问题出现后才能有针对性的提出解决方案,我们无法预测系统下一个漏洞在哪里,也不敢说自己的系统肯定没有任何问题。 换句话讲,功能安全其实也是一个“攻”与“防”的矛盾,只能在这种攻防大战中逐步完善,不可能在系统架构设计的时候一劳永逸地解决

2. 架构安全 如果说功能安全是“防小偷”,那么架构安全就是“防强盗”。强盗会直接用大锤将门砸开,或者用*药炸**将围墙炸倒;小偷是偷东西,而强盗很多时候就是故意搞破坏,对系统的影响也大得多。

因此架构设计时需要特别关注架构安全,尤其是互联网时代,理论上来说系统部署在互联网上时,全球任何地方都可以发起攻击。 传统的架构安全主要依靠防火墙,防火墙最基本的功能就是隔离网络,通过将网络划分成不同的区域,制定出不同区域之间的访问控制策略来控制不同信任程度区域间传送的数据流。 例如,下图是一个典型的银行系统的安全架构。

架构设计演化分析,架构设计关键要求

从图中你可以看到,整个系统根据不同的分区部署了多个防火墙来保证系统的安全。

防火墙的功能虽然强大,但性能一般,所以在传统的银行和企业应用领域应用较多。 但在互联网领域,防火墙的应用场景并不多。

因为互联网的业务具有海量用户访问和高并发的特点,防火墙的性能不足以支撑;尤其是互联网领域的DDoS攻击,轻则几GB,重则几十GB。 2016年知名安全研究人员布莱恩·克莱布斯(Brian Krebs)的安全博客网站遭遇DDoS攻击,攻击带宽达665Gbps,是目前在网络犯罪领域已知的最大的拒绝服务攻击。 这种规模的攻击,如果用防火墙来防,则需要部署大量的防火墙,成本会很高。 例如,中高端一些的防火墙价格10万元,每秒能抗住大约25GB流量,那么应对这种攻击就需要将近30台防火墙,成本将近300万元,这还不包括维护成本,而这些防火墙设备在没有发生攻击的时候又没有什么作用。 也就是说,如果花费几百万元来买这么一套设备,有可能几年都发挥不了任何作用。

就算是公司对钱不在乎,一般也不会堆防火墙来防DDoS攻击,因为DDoS攻击最大的影响是大量消耗机房的出口总带宽。 不管防火墙处理能力有多强,当出口带宽被耗尽时,整个业务在用户看来就是不可用的,因为用户的正常请求已经无法到达系统了。 防火墙能够保证内部系统不受冲击,但用户也是进不来的。对于用户来说,业务都已经受到影响了,至于是因为用户自己进不去,还是因为系统出故障,用户其实根本不会关心。

基于上述原因,互联网系统的架构安全目前并没有太好的设计手段来实现,更多地是依靠运营商或者云服务商强大的带宽和流量清洗的能力,较少自己来设计和实现。