计算机安全
- Secrecy, Integrity, Availability 保密性,完整性,可用性。
- Threat Model 威胁模型
- 身份验证三种方式:
What you know 你知道什么
What you hava 你有什么
What you are 你是什么 - 访问控制 Access Control
- Bell LaPadula Model 不能向上读取,不能向下写入
- 隔离Isolation,沙盒Sandbox
不是每个使用网络的人都会规规矩矩,不损害他人利益。就像现实世界中用锁和栅栏保证物理安全。
需要网络安全减少虚拟世界中的犯罪,计算机没有道德观念,只要给计算机写清具体问题,它们很乐意的闪电般算出答案。
破坏医院计算机系统的代码和保持病人心跳的代码对计算机来说没有区别。
就像“原力”一样,计算机可以被拉到“光明面”或“黑暗面”。网络安全就像绝地武士团给网络世界带来和平与正义。
计算机安全的范围,和计算能力的发展速度一样快,可以把计算机安全,看成是保护系统和数据的:保密性,完整性和可用性。
“保密性”是只有有权限的人才能读取计算机系统和数据。
“完整性”是只有有权限的人才能使用和修改系统和数据。
“可用性”是有权限的人应该随时可以访问系统和数据(拒绝服务攻击DDOS,发大量的假请求到服务器,让网站很慢或挂掉)。
威胁模型
实现这“保密性”,“完整性”,“可用性”的目标,安全专家从抽象层想象“敌人”可能是谁,这叫“威胁模型分析”。
模型会对攻击者大致描述:能力如何,目标可能是什么,可能用什么手段,攻击手段又叫“攻击矢量”。
“威胁模型分析”能为特定情境做准备,不被可能的攻击手段熟练锁淹没,因为手段是在有太多种了。
假设想确保笔记本计算机的“物理安全”,威胁模型是“好管闲事的室友”。为了保证保密性,完整性和可用性可以藏在脏兮兮的洗衣篮里。换句话说,要怎么保护,具体看对抗谁。
通常威胁模型分析里,会以能力水平区分,比如“某人可以物理接触到笔记本计算机,而且时间无限”在给定的威胁模型下,安全架构师要提供解决方案,保持系统安全,只要某些假设不被推翻,比如没人会告诉攻击者密码,保护计算机系统,网络和数据的方法有很多。
身份验证
很多安全问题可以总结成2个问题:
- 你是谁?
- 你能访问什么?
权限应该给合适的人,拒绝错误的人。所以,为了区分谁是谁,用“身份认证(authentication)”,让计算机得知使用者是谁。
身份认证有三种,各有利弊:
- 你知道什么。 基于某个秘密,只有用户和计算机知道。比如用户名和密码。这是如今使用最广泛的,因为最容易实现。但如果黑客通过猜测或其他方式,知道了你的密码。可以通过“暴力攻击”,因为只是试遍一切可能。如果错误尝试3词,有些系统会阻止你继续尝试,或让你等一会儿。
- 你有什么。是基于用户有特定物体,比如钥匙和锁,这避免了被人“猜中”的问题,而且通常需要人在现场,所以远程攻击就更难了。但如果攻击者距离比较近,那么也不安全,钥匙可以被复制,手机可能被偷,锁可以撬开。所以需要“你是什么”这种验证。
- 你是什么。是基于你把特征展示给计算机进行验证,生物是被验证器,比如指纹识别器和虹膜扫描仪就是典型但例子。这些非常安全,但最好的识别技术仍然很贵,而且,来自传感器的数据每次会不同。
“你知道什么”和“你有什么”。这俩中验证是“确定性”的,要么正确,要么错误。如果知道密码或有钥匙,那么100%能获得访问权限;如果没有,就绝对进不去。但“生物识别”是概率性的,系统有可能认不出你,因为环境外音,光线不好等,更糟糕是把别人错认成对的人,比如双胞胎,在现实世界中的几率很低,但不是零。
生物认证的另外一个问题是无法重设,你只有这么多手指,如果攻击者拿到你指纹数据怎么办,还有拍个照都有可能伪造虹膜,所以也不靠谱。所有认证方法都有优缺点。它们都可以被攻破,所以,对于重要账户,建议用俩种或俩种以上的认证方式。这叫“多因素”或“双因素”认证,攻击者可能猜出你的密码,或偷走你的手机:但俩个都做到,会比较难。
访问控制
“身份验证”后,就是“访问控制”。一旦系统知道你是谁,它需要知道你能访问什么。
因此应该有个规范,说明谁能访问什么,修改什么,使用什么。这可以通过“权限”或“访问控制列表”(ACL)来实现。其中描述了用户对每个文件,文件夹和程序对访问权限。
“读”权限允许用户查看文件内容;“写”权限允许用户修改内容;“执行”权限允许用户运行文件
,比如程序。
有些组织需要不同层级对权限,比如间谍机构,“访问控制列表”的正确配置非常重要,以确保保密性,完整性和可用性。
不能向上读取,不能向下写入
假设三个访问级别:公开,机密,顶级机密。
- 第一个普遍的好做法是,用户不能“读上”,不能读等级更高的信息,如果用户能读“机密”文件,那么不应该有权限读“顶级机密”文件。但能访问“机密”和“公开”文件。
- 第二个法则是用户不能“写下”,如果用户等级是“顶级机密”,那么能写入或修改”顶级机密“文件,但不能修改”机密“或”公共“文件。
有最高等级也不能改等级更低但文件,但这样确保了”顶级机密“不会意外泄漏到”机密“文件或”公共“文件里。
这个”不能向上读,不能向下写“的方法,叫Bell-LaPadula
模型,他是为了美国国防部“多层安全政策”制定的,还有许多其他访问控制模型,比如“中国墙”模型和“比伯”模型。哪个模型最好,取决于具体情况。
“身份验证”和“访问控制”帮助计算机知道“你是谁”,以及“你可以访问什么”。但做这些事情的软硬件必须是可信的,这个依赖很重要。
如果攻击者给计算机装了恶意软件,控制了计算机的操作系统,怎么确认安全程序没有给攻击者6留后面?短回答是,无法确定。
仍然无法保证程序或计算机系统的安全,因为安全软件在理论上可能是”安全的“,实现时可能会不小心留下漏洞,但有办法减少漏洞出现的可能性,比如已找到就马上修复,以及当程序被攻破时尽可能减少损害,大部分漏洞都是具体实现的时候出错了,为了减少执行错误,减少执行。
系统级安全的圣杯是”安全内核“,或”可信计算基础“:一组尽可能少的操作系统软件,安全性都是接近可验证的,构建安全内核的挑战在与决定内容应该有什么,代码越少越好。
在最小化代码数量之后,要是能”保证“代码是安全的,会非常棒,正式验证代码的安全性,是一个活跃的研究领域,现在最好的手段,叫”独立安全检查和质量验证“,让一群安全行业内的软件开发者来审计代码。这就是为什么安全型代码基于都是开源的,写原始代码的人通常很难找到错误,但外部开发人员有新鲜的眼光和不同领域的专业知识,可以发现问题。
隔离Isolation,沙盒Sandbox
即便尽可能减少代码,并进行了安全审计,聪明的攻击者还是会找到方法入侵,优秀的开发人员,应该计划当程序被攻破后,如何限制损害,控制损害的最大程度,并且不让它危害到计算机上其他东西。这叫”隔离“。要实现隔离,可以用”沙盒“程序。只能损毁自己的沙堡,不会影响到其他。
操作系统会把程序放到沙盒里,方法是给每个程序独有的内存块,其他程序不能动。一台计算机可以运行多个虚拟机,虚拟机模拟计算机,每个虚拟机都在自己的沙箱里,如果一个程序出错,最糟糕的情况是它自己奔溃或者搞坏它处于的虚拟机,计算机上其他虚拟机是隔离的,不受影响。
发表回复