是时候聊聊网络安全网格了。

温馨提示:全文4458字,阅读需要10分钟
前不久,Gartner在2022年重要战略技术趋势报告里再一次提到了网络安全网格(Cybersecurity Mesh,CSMA),这已经是Gartner连续第二次在年度技术趋势报告里提到了。可见,过去的一年里这一趋势还在持续发展,且越发明朗。

Gartner在2020年对网络安全网格的描述

Gartner在2021年对网络安全网格的描述
报告里的只言片语并未对网络安全网格做明确的定义,寻遍了国内外网站,我也只能找到寥寥数篇相关报道。最后从Gartner研究副总裁Jay Heiser的一篇关于网络安全网格的分析文章里,算是对网络安全网格有了一些初步认识:
01
分布式网络架构
分布式网络架构不是新技术,但最近却被经常提到:区块链的底层网络是去中心化的分布式架构,Web3.0的底层网络是去中心化的分布式架构,就连最近异常火热的元宇宙也需要分布式的架构。
为什么要分布式网络架构?因为实体业务在现实物理空间里已经分布式地存在了,并且还在越来越碎片化,网络架构要服务于业务架构,所以网络架构必须要升级自己,去适应分布式的业务。
在一个企业里,员工可能位于全球任何一个地方,业务系统可能部署在任意云或者数据中心里。人也好、系统也好,会根据个人或业务的需要随时变换位置。换句话说,我们当前面临的内部业务环境是一个覆盖全球的、随时可能变化的、越来越碎片化的全网互联结构。
物理网络由各种路由器、交换机、网元设备组成,是一种静态的,以云、数据中心为中心,从固定场所接入的结构。通过VPN或者将服务直接暴露在互联网的方式满足远程接入和移动接入的需求。无论是在灵活性或安全性上当前的物理网络都无法满足随时变化的、越来越碎片化的业务环境要求。
我们不能期待物理网络可以变成一个灵活的、分布式的网络,做这样的改造成本太高了。但我们可以在静态的物理网络之上构建一层由软件定义的逻辑网络,这个逻辑网络可以是灵活的、分布式的结构。员工的个人终端和业务系统,在这个逻辑网络里形成一种Full-Mesh结构,任意两个网络实体之间在逻辑网络里都是直连关系。

把复杂网络简单化
这种结构有2个明显优势:
·摆脱了物理网络限制,在任何物理位置上的终端或者业务系统,随时都可以接入到这个Full-Mesh结构的逻辑网络中,无需考虑物理网络环境。
·复杂网络简单化,所有网络主客体之间在逻辑上都是点对点直连关系,没有复杂的中间网络。这种极简结构让策略管理变得扁平化,给集中管控和行为分析带来了天然优势。
02
集中策略编排和决策,分布式执行
说到分布式,很多人容易把它跟去中心化搞混,事实上这完全是两个不同维度的东西:分布式是物理位置上的概念,而去中心化是在业务层面上的概念。所有的去中心化系统都是采用分布式结构,而分布式结构在业务层面上可能是中心化也可能是去中心化的。例如:区块链就是分布式去中心化结构,而云计算就是分布式中心化结构。
去中心化结构的好处是人人都是中心,没有任何权威中心能完全控制,区块链就是利用这种优势进行集体记账,实现了无人能抵赖的特性。但无人能控制是把双刃剑,去中心化结构下的执行力非常低,事情的走向完全不可控,是一种无政府主义的乌托邦,在我看来人类还未进化到这个地步,如果在企业里用去中心化的方式管理,结果只能是一团糟。
有很多管理者都希望企业的组织架构扁平化,这实际上就是一种分布式系统,工作效率要比等级森严的组织架构要高得多。但在企业治理上,管理者希望企业有非常强的执行力,也就是中心化治理方式。
现在我们构建了一个与物理位置无关的分布式的网络,那在业务层面上我们选择中心化还是去中心化呢?很显然,企业是集权主义组织,需要的是分布式中心化结构。
回到我们的主题,在网络安全网格架构下,每一个网络实体在网络控制层面上是分布式的结构,但在整个分布式网络的策略决策层面上采用的是中心化的结构。
注意,在网络安全网格中访问控制的执行点变了,访问控制引擎是分布式的、点对点的,这与我们常见的网关型访问控制不一样,网络控制能力分布在了网络的每一个地方,任意位置随时可控,不存在性能瓶颈或控制盲区。
这样的网络安全网格架构即保证了高效的治理效率,同时又满足了终端和业务碎片化的实际环境,完全符合了当前的企业网发展趋势。
03
让身份成为安全边界
让身份成为安全边界,看到这句话大家一定会联想到零信任网络。确实,网络安全网格本身就是一种零信任网络,但零信任网络不一定就是网络安全网格。
从什么时候开始,我们着急的要让身份成为安全边界了?原来的安全边界不香了吗?是的,不但不香,还越来越臭。
我们先从几个场景来看下,为什么会出现这种情况:
场景一
某业务系统在数据中心部署上线了,这个系统是给企业所有业务人员使用的,但业务人员分布在全国所有职场,也有可能出差全国跑。安全管理员只能在网络层上给所有职场都开放了访问权限,给每个业务员分配VPN帐号,通过业务系统自身的应用层帐号来限制只有具备权限的人才能登陆访问。但某个非业务员工,坐在某个分公司办公室,直接就能打开业务系统登录页面,通过暴力破解,就轻松登录进去了。
场景二
为了防止攻击,安全管理员又在数据中心出口部署了入侵检测系统,对所有访问流量进行实时检测。某天发现有多个攻击行为告警,所有攻击源都指向一个IP地址。但经过排查,这个IP地址是某分公司出口IP,安全管理员无奈了,不能封禁,去分公司逐一排查又来不及,明明知道当前有人在攻击业务系统,甚至已经在窃取数据了,但没办法,只能干瞪眼。
场景三
公司的敏感文件被发现在互联网上公开了,初步排查公司邮箱遭到渗透。从邮件系统日志里看是某个内部员工帐号登陆到邮箱服务器,但从流量日志上看,登陆行为又来自于互联网的一个公网IP地址,有可能是员工帐号被窃取。攻击者拿着员工帐号登陆,所有操作都是合法的,没有触发任何告警,所有网络监测系统全部失效。所有线索最终指向一个公网IP地址就完全中断了,调查也就只能到此为止。(是不是有点像Operation Aurora?这就是BeyondCorp的起源)
场景四
吃一堑长一智,公司花重金买了数据安全产品,期望能把所有人访问敏感数据的行为都记录下来,及时发现偷数据的情况。接上流量日志后,确实把所有访问业务的流量记录下来了。但问题也来了,上千人访问业务,每天上千万条流量日志全都混杂在一起,根本区别不开到底哪条流量日志是哪个人访问的。所有基于人的行为检测规则、关联分析规则、机器学习算法、行为建模,全都是个花架子,听起来挺美,用起来完全不是这么一回事,这钱打水漂了。
大部分的CSO、安全主管们对这些场景应该很熟悉,从事网络安全行业20余年对安全从业者的工作感同身受。
导致这种问题的根本原因在于一直以来我们都是用IP地址在网络上执行身份锚定和访问控制,但在业务逐渐碎片化的趋势下,网络也开始碎片化,IP地址与人的关系越来越弱,用IP地址作为边界的安全体系成本越来越高,效果越来越差,最终会走向完全失效。唯一的解决办法就是不再用IP来作为边界,而是用身份。
那什么才叫做用身份作为边界?
所有的网络数据包都实名制
互联网是自由的,但自由的前提是遵守法律和道德底线。所有阴暗的勾当都喜欢完全匿名,匿名者知道自己的行为是不合法不道德的,害怕被人指认出来,要用完全匿名的方式既满足私欲,又躲避责罚,不愿担当,比如说“暗网”。

暗网交易(截图来自于互联网新闻报道)
完全匿名的网络下只会滋生罪恶,但罪恶可不是互联网的初衷。试想一下,元宇宙里每个人都是完全匿名的,这个元宇宙里会发生什么?
每一个网络数据包都实名,从任意一个数据包里我们都能看到是什么人用了哪个终端做了什么事情,这本身就是一种威慑,是先于攻击者意图的防御。
干掉IP地址,用身份来管控网络
先有网络,再有的网络安全,网络安全的发展整体滞后于网络的发展。网络先驱们最初在设计网络协议的时候并未考虑身份的事情,而是在网络世界里简单的用IP地址来锚定人的身份。这种方式在网络建设初期还能应付,但如今的网络早已不像当初,多分支、混合云、移动互联网、物联网,早已将网络堆砌成一个动态变化的庞杂环境,在这种环境下用IP地址锚定人的做法在安全领域就越来越捉襟见肘了。
在企业网络里,我们一直在用防火墙来设置安全边界。之所以只能用基于IP地址的访问控制模型来设置边界,是因为网络流量里只有IP地址可以用于区分访问主客体。而现在我们让所有的网络数据包都实名制了,每个数据包都带有身份信息,完全可以用身份来作为访问控制的基础。
是时候将基于IP的防火墙
升级为基于身份的防火墙了
要想实现让身份作为边界,那就先让每个数据包都实名制,然后干掉安全系统对IP地址的依赖,构建分布式的、基于身份的网络防火墙,让所有安全管控和分析研判以身份为基础。
这就是我理解的“让身份作为边界”。
04
是其他安全系统的基础设施
前面已经解释了网络安全网格具备分布式点对点网络架构,分布式策略执行,集中策略管理,在完全身份化的网络里用身份重新构建安全边界这些特性。
在这些前提下,我们再去看“网络安全网格正迅速成为成为分布式身份结构、基于上下文的安全分析、情报和响应、集中式策略管理和编排、ZTNA、CASB 和 SASE的安全网络基础设施”就很好理解了。
网络安全网格为企业构建了一个全新的轻量级安全网络基础设施。
说它轻,是因为这个架构与物理网络并不冲突,企业实施一套网络安全网格并不需要大费周章的做网络改造,而是在现有网络上一点点迁移就行。开放的架构可以对接企业已建的IAM、SSO、SIEM、SOC、态势感知等安全系统,也可以对接已建专线、SD-WAN这样的网络服务,分布式架构天生就是用来构建超大规模网络的。
也许下一次,领导再来视察的时候,看到态势感知大屏上的各种告警就不会再问攻击者是谁了,因为大屏上已经显示了这个人的名字。如果领导说赶紧处理下,安全主管只需点下鼠标,也就处置完了,或者,系统早就已经自动处置了。
这才是一个可信企业网该有的样子。
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?