计算机科学基础_10 - 计算机安全
计算机安全
- 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
即便尽可能减少代码,并进行了安全审计,聪明的攻击者还是会找到方法入侵,优秀的开发人员,应该计划当程序被攻破后,如何限制损害,控制损害的最大程度,并且不让它危害到计算机上其他东西。这叫”隔离“。要实现隔离,可以用”沙盒“程序。只能损毁自己的沙堡,不会影响到其他。
操作系统会把程序放到沙盒里,方法是给每个程序独有的内存块,其他程序不能动。一台计算机可以运行多个虚拟机,虚拟机模拟计算机,每个虚拟机都在自己的沙箱里,如果一个程序出错,最糟糕的情况是它自己奔溃或者搞坏它处于的虚拟机,计算机上其他虚拟机是隔离的,不受影响。
黑客与攻击
- 社会工程学
- 钓鱼
- 假托
- 木马
- NAND镜像
- 漏洞利用
- 缓冲区溢出
- 边界检查
- 代码注入
- 零日漏洞
- 计算机蠕虫
- 拒绝服务攻击
有些黑客会寻找并修复软件漏洞,让系统更安全,这些黑客叫“白帽子”。另一方面,也有“黑帽”黑客,他们窃取,利用和销售计算机漏洞和数据,黑客的动机有很多种,有些是好玩和好奇,而网络犯罪一般是为了钱,还有的叫“黑客行动主义者”,通过黑客手段影响社会或达到政治目的。
入侵原理
黑客入侵最常见的方式,不是通过技术,而是欺骗别人。这叫“社会工程学”,欺骗别人让人泄密信息,或让别人配置电脑系统,变得易于攻击。
最常见的攻击是网络钓鱼,银行发邮件教你点击邮件里的链接,登陆账号,然后你会进入一个像官网的网站,但实际上是个假网站,当输入用户名和密码时,信息会发给黑客,然后黑客就可以假扮你登陆网站。即使成功率只有1/1000,发一百万封钓鱼邮件,也有一千个账户中招。
另一种方法叫 假托,攻击者给某个公司打电话,假装是IT部门的人,攻击者但第一通电话一般会叫人转接,这样另一个人接的时候,电话看起来像内部的,然后让别人把电脑配置得容易入侵,或让他们泄漏机密信息,比如密码或网络配置。只要预先做一点研究,攻击者可以装得很像真的,比如关键员工的名字,也许要10通电话才能找到一个受害者,但只要一个人上当就够了。
邮件里带“木马”也是常见手段,木马会伪装成无害但东西,比如照片或发票,但实际上是恶意软件,恶意软件有很多种,有的会偷数据,比如银行凭证,有的会加密文件,交赎金才解密,也就是“勒索软件”。
如果攻击者无法用木马或电话欺骗,攻击者只能被迫用其他手段,方法之一是暴力尝试,尝试所有可能的密码,知道进入系统,大多数现代系统会加长等待时间,来抵御这种攻击,每次失败就加长等待时间,甚至失败超过一定次数后,完全锁住。出现一种攻破方法叫“NAND镜像”,如果能物理接触到电脑,可以往内存接上几根线,复制整个内存,复制之后,暴力尝试密码,直到设备让你等待。这时只要把复制的内容覆盖掉内存,本质上重置了内存,就不用等待,可以继续尝试密码了。更新的设备有机制阻止了这种攻击,如果无法物理接触到设备,就必须远程攻击,比如通过互联网。远程攻击一般需要攻击者利用系统漏洞,来获得某些能力或访问权限,这叫“漏洞利用”
一种常见的漏洞利用叫“缓冲区溢出”,缓冲区是一种概称,指预留的一块内存空间。有很多方法阻止缓冲区溢出,最简单的方法是,复制之前先检查长度,这叫“边界检查”,程序也会随机存放变量在内存种的位置,这样黑客就不知道应该覆盖内存的哪里。易导致更容易让程序崩溃,而不是获得访问权限,程序也可以在缓冲区后,留一些不用的空间,让后跟踪里面的值,看是否发生变化。如果发生了变化,说明有攻击者在乱来,这些不用的内存空间叫“金丝雀”。
另一种经典手段叫“代码注入”,最常用于攻击数据库的网站,几乎所有大网站都用数据库。就像缓冲区溢出攻击一样,应该总是假设外部数据,是危险的,应该好好检查,很多用户名和密码表单,不让输入,特殊字符,比如分号或者括号,作为第一道防御,好的服务器也会清理输入,比如修改或删除特殊字符,然后放到数据库查询语句里,管用的漏洞利用一般会在网上贩卖或分享,如果漏洞很流行,或造成的危害很大,价格会越高,或者名气越大,有时甚至政府也会买漏洞利用。
当软件制造者不知道软件有新漏洞被发现了,那么这个漏洞叫“零日漏洞”。黑帽黑客经常赶时间,抢在白帽程序员作出补丁之前,尽可能利用漏洞,所以保持系统更新非常重要,很多更新都是安全性补丁,如果有足够的电脑有漏洞,让恶意程序可以在电脑间相互传播,那么叫“蠕虫”。
如果黑客拿下大量电脑,这些电脑可以组成,“僵尸网络”,可以用于很多目的,比如发大量垃圾邮件,用别人电脑的计算能力和电费挖Bitcoin或发起“拒绝服务攻击”简称DDos,攻击服务器。
DDos就是僵尸网络里的所有电脑发一大堆垃圾信息,堵塞服务器,要么迫使别人交钱消灾,或纯粹为了作恶,尽管白帽黑客努力工作,漏洞利用的文档都在网上,编程软件有很多“最佳实践”,网络攻击每天都在发生。每年损害全球紧急差不多5000亿,并且随着我们依赖计算机系统,这个数字只会增加。
加密
- 多层防御
- 加密,解密
- 凯撒解密
- 替换加密
- 移位加密
- 列移位加密
- 德国 Enigma 加密机
- 1977年“数据加密标准”
- 2001年“高级加密标准”
- 密钥交换
- 用颜色来距离“单向函数”和“密钥加密”的原理
- 迪菲-郝尔曼密钥交换
- 非对称加密
- 非对称加密算法 RSA
世上不存在100%安全的系统,总会有漏洞存在,所以系统架构师会部署“多层防御”,用多层不同的安全机制来阻碍攻击者。
计算机安全中最常见的防御形式:密码学。