计算机安全
- 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%安全的系统,总会有漏洞存在,所以系统架构师会部署“多层防御”,用多层不同的安全机制来阻碍攻击者。
计算机安全中最常见的防御形式:密码学。
密码学(cryptography)一词来自crypto和graphy,大致翻译成“秘密写作”,为了加密信息,要用加密算法(Cipher)把明文转为密文,除非知道如何解密,不然密文看起来只是一堆乱码,把明文转为密文叫“加密”(encryption),把密文恢复回明文叫“解密”(decryption),加密算法早在计算机出现前就有了。
朱利叶斯.凯撒 用“凯撒解密”的方法,来加密私人信件。会把信件中的字母,向前移动三个位置,所以A会变成D。为了解密,接收者要知道,1.用了什么算法。 2. 要偏移的字母位数。
有一大类算法叫“替换加密”,凯撒密码是其中一种,算法把每个字母替换成其他字母,但有个巨大的缺点是,字母的出现频率是一样的。例如:E在英语中是最常见的字母,如果把E加密成X,那么密文中X的出现频率会很高,熟练的密码破译者,可以从统计数据中发现规律,进而破译密码。
另一类加密算法叫“移位加密”,“列移位加密”。网格,可以任意选择列数网格。 选择55,为了加密信息,网格中的信息按照一定规则信息去写,比如从左边开始,从下往上,一次一列。加密后字母的排列不同。解密的关键是,知道读取方向和网格大小是55。如果接收者知道密文和加密方法,才能解密得到原始信息。
转子,反射器,
反射器,它每个引脚会连到另一个引脚,并把信号发回给转子,最后,机器前方有一个插板,可以把输入键盘到字母预先进行替换,又加了一层复杂度。
如果按下"H"键,电流会先通过插板,然后通过转子,到达反射器,然后回来转子,回来插板,并照亮键盘灯板的字母“L”.这样H就加密成L。电路是双向的,所以,如果是按下“L”的话,对应加密也是“H”。换句话说,加密和解密的步骤是一样的。只需要确保,发送机和接受机的初始配置一样就行。
随着计算机的出现,加密从硬件转往软件,早期加密算法中,应用最广泛的是IBM和NSA于1977年开发的“数据加密标准”。
DES最初用的是56bit长度的二进制密钥,意味这有2的56次方,或大约72千万亿个不同密钥。
在1999年,一台25万美元的计算机能在俩天内把DES的所有可能密钥都试一遍,让DES算法不再安全。
对称加密
在后面出了:高级加密标准(AES),AES用更长的密钥-128位/192位/256位-让暴力破解更加困难。
128位的密钥,用现在地球上所有的计算机也要上万亿年才能试遍所有组合。
AES将数据切成一块一块,每块16个字节,然后用密钥进行一系列替换加密和移位加密。再加上一些其他操作,进一步加密信息。每一块数据,会重复这个过程10次或以上。
基于性能的权衡,128位较于合适,对于一些加密信息,网站的性能而言都是平衡的。
AES在性能和安全性间取得平衡。
需要某种方法,在公开的互联网上传递密钥给对方,通过的是“密钥交换”。密钥交换是一种不发送密钥,但依然让两台计算机在密钥上达成共识的算法。
通过“单项函数”,单项函数是一种数学操作,很容易算出结果,但想从结果逆向推算出输入非常困难。例如:将颜色混合在一起很容易,但想只想混了什么颜色很难。要尝试很多种可能才知道。
首先,有一个公开的颜色,所有人都可以看到,但选择其中俩种颜色,只有自己知道。为了交换密钥,把选中的秘密颜色和公开颜色混在一起,发送给对方,收到之后,把选中的秘密颜色加进去,现在三种颜色混合在一起,就能够有相同的颜色。外部窥探者可以知道部分信息,但无法知道最终颜色。
在Diffie-Hellman
中,单向函数是模幂运算,意思是先做幂运算,拿一个数字当底数,拿一个数字当指数。
例如:假设想算3的5次方,模31。先算3的5次方,得到243,然后除以31,取余数,得到26.
如果只是余数和基数,很难得知指数是多少。如果把数字变长一些,比如几百位长,想找到秘密指数是多少,几乎是不可能的。
用模幂运算,算出双方共享的密钥:
- 首先,有公开的值 - 基数和模数
- 为了安全向目的电脑发送信息,选择一个秘密指数:X。
- 然后算出
B^X mod M
的结果,然后把这个数字发送到目的电脑上。 - 目的电脑也一样做,选一个秘密指数:Y,然后把
B^Y mod M
的结果发送回来。 - 为了算出,双方共享的密钥,把目的电脑给的数,用秘密指数X,进行模幂运算。数学上等于
B^XY mod M
。 - 目的电脑也是拿着数字,进行模幂运算,最终得到一样的数字。双方有一样的密钥,即使从来没有给对方发过个自己的秘密指数。
RESULT OF
(B^Y mod M)^X
// B^YX mod M
RESULT OF
(B^X mod M)^Y
// BYX mod M
可以用这个大数字当作密钥,用AES之类的加密基数来加密通信。Diffie-Hellman 密钥交换
是建立共享密钥的一种方法。双方用一样的密钥加密和解密消息,这叫“对称加密”,因为密钥一样。
密钥交换
凯撒加密, 英格玛,AES都是“对称加密”。
有两个不同密钥,称之为“非对称加密”,一个是公开的,另一个是私有的,用公钥加密信息,只有有私钥的人才能解开。
知道公钥只能加密但不能解密,它是“不对称”的。
公钥密码学
反过来也可以,私钥加密后,用公钥解密。这种做法用于签名,服务器可以用私钥加密,任何人都可以用服务器的公钥解密。就像一个不可伪造的签名。因为只有私钥的持有人,能加密。
这能证明数据来自正确服务器或个人,而不是某个假冒者。
目前最流行的非对称加密技术是RSA
。
当访问一个安全的网站,比如银行官网,绿色锁图代表了,用了公钥密码学。验证服务器的密钥,然后建立临时密钥。然后用对称加密保证信息通信安全。