安全基础概念
注意点:当我们遇到某一个特定的攻击或者安全问题时,往往看到的都是表象的影响,而能否找到根本原因并进行修复,才是安全投入的关键。
安全原则
机密性(Confidentiality)、完整性(Integrity)、可用性(Availability),我们可以简 称为 CIA 三元组,是安全的基本原则。
理论上来说,一个完整的安全保障体系,应该充分考虑到所有的 CIA 原则。当然,实际情况中,我们会根据企业需求,对安全在这三个方向 上的投入做取舍。我们平时在评判一个企业的安全水平时,也会分别从这三个方向进行考 量。 可以说,CIA 三元组原则,是安全领域内最基础也最重要的原则。
机密性
机密性用一句话来说就是,确保数据只被授权的主体访问,不被任何未授权的主体访问。简单来说,就是”不可见”。
例子:你不会允许陌生人查看你的个人隐私信息,但你可能会允 许父母、朋友查看部分信息。同样的,对于应用中的数据,比如微信的朋友圈,你可以允许 好友查看三天内的数据,但不允许好友查看三天前的数据。
机密性前提:机密性的一个前提是明确授权规则,也就是明确每一项数据可以被 什么样的主体访问。
在安全领域我们提出了很多访问控制机制和安全模型,对数据和访问主体打上标签或者进行分类,并制定相应的访问控制规则去自动进行授权。
针对机密性的攻击,都有哪些形式呢?
有的会直接针对保护技术进行破解。比如,去破解加解密算法、去逆向混淆代码等等。经过 长期的发展,这些保护技术普遍都趋于成熟,安全性也在不断地提高。
更多的时候,我们面临的机密性攻击,其实是人为原因导致的疏忽,也就是错误使用访问控 制机制或数据保护技术。比如,因为权限滥用,导致开发人员拥有敏感数据的无限制访问权 限;因为弱密钥,导致加密被破解;甚至显示器上的数据被别有用心的人窥探。所以说,当 前机密性保护的要点是引导人去做正确的事情,避免这类看似低级、实则普遍的漏洞发生。
机密性强调的是数据的“不可见”,但这并不代表数据是正确的。比如,将一 个“True”存成了“False”,这就不是机密性要考虑的事了,而这种错误的存储,则是完 整性需要考虑的事情。
完整性
完整性就是确保数据只被授权的主体进行授权的修改,简单来说,就是“不可改”。
所谓“授权的修改”,就是对主体可进行的操作进行进一步的限制。比如,只能追加数据的 主体无法执行删除的操作。以个人隐私信息为例,法律允许学校或者公司在个人档案内追加 信息,但不能做任何修改。又或者说,你自己发的朋友圈,不希望被其他人进行修改。这些 都是完整性的典型表现。
在授权方面,机密性中提到的访问控制机制同样适用。除此之外,完整性会更加强调对修改 行为的日志记录,并有合适的监督机制进行审计。在保护技术方面,主要是利用加密、签名 等技术,使得数据的完整性变得可验证。
针对完整性的攻击也和机密性一样,更多的是由于人为原因导致的疏忽。除了黑客本身对数 据的恶意篡改,已授权的主体也可能对数据完整性产生破坏,比如员工意外地误删除数据、 程序 bug 导致错误数据被写入、正常用户的一些无效输入等。
可用性
可用性就是确保数据能够被授权的主体访问到, 简单来说,就 是“可读”。
可用性会面临哪些挑战呢?
在运维层面上,有很多技术在为可用性提供支撑,比如,在基础建设上的机房建设(如 何在断电、高温、火灾等情况下保护设备)、多地冗余,以及在服务中的备份、资源冗余等。
在研发层面上,如何降低响应延迟、如何处理海量数据、如何在峰值进行扩容等,这些 问题其实都是在可用性上的挑战。
在攻击的角度上,黑客也会对可用性发起攻击,也就是我们常说的 DoS(Denial of Service,拒绝服务)攻击。比如,通过发送大量的流量来占满带宽资源。
什么是“黄金法则”?
黄金法则主要包含三部分:认证(Authentication)、授权(Authorization)、审计 (Audit)。为什么称它为“黄金”呢?一方面是因为,它包含的这三部分重要且通用;另 一方面是因为,这三个单词的前两个字母都是 Au,而 Au 在元素周期表中代表着“金”。 有的教材中,会给黄金法则加上问责(Accounting)这一部分,组成“4A 法则”;还有 的会加上身份识别(Identification),组成“IAAAA 法则”。不管被划分为几个部分,这 些法则的中心内容都是相似的,都是围绕着识别、认证、授权、审计、问责这五个部分展开 的。因此,黄金法则其实就是 IAAAA 法则更高一层的概括,它将识别和认证、审计和问责 归纳到了一起,更加强调了这两两之间的协同性质。
认证,授权,审计,这三部分其实是一种串联的关系,它描述的其实是用户在使用应用过程中的生命周期:先进行登录、再进行操作、最后留下记录。
身份识别和认证
认证其实包括两个部分:身份识别 和认证。身份识别其实就是在问“你是谁”,你会回答“你是你”。身份认证则会问“你是 你吗”,那你要证明“你是你”这个回答是合法的。
身份识别和认证通常是同时出现的一个过程。身份识别强调的是主体如何声明自己的身份, 而身份认证强调的是,主体如何证明自己所声明的身份是合法的。比如说,当你在使用用户 名和密码登录的过程中,用户名起到身份识别的作用,而密码起到身份认证的作用;当你用 指纹、人脸或者门卡等进行登入的过程中,这些过程其实同时包含了身份识别和认证。
通常来说,不管你以什么形式进行登入,在身份识别的过程中,这些形式最终都需要落地成 唯一的身份 id。在你后续的操作中,身份 id 都会始终跟随会话,记录在日志中。这也是后 续授权、审计和问责的基础。身份识别的过程并不关注合法性,因此,认证是这个部分中最 为关键的一环。 依据具体的认证场景,对安全等级、易用性等的综合考量,认证形式可以大致分为三种。按照认证强度由弱到强排序,分别是:
你知道什么(密码、密保问题等);
你拥有什么(门禁卡、安全令牌等);
你是什么(生物特征,指纹、人脸、虹膜等)
可信的身份认证是建立安全保障体系的第一步。
授权
在系统 或者应用中,我们的操作都会受到一定的限制。比如,某些文件不可读,某些数据不可修 改。这就是授权机制。除了对“你能做什么”进行限制,授权机制还会对“你能做多少”进 行限制。比如,手机流量授权了你能够使用多少的移动网络数据。
最原始和最安全的授权机制,一定是你的每一次操作,都经过了管理人员的审批和确认。比 如我们申请签证的过程,其实就是一次申请授权的过程。当部分国家的签证策略比较严格时 (如美国),那么我们每次出入境都需要重新申请签证,这也就意味着,会有很多的操作需 要进行授权审批,其效率肯定是无法保证的(可以想想美国大使馆门前的长队)。
因此,很多时候,我们会定义自动化的授权机制来进行更快速地响应。比如,某些国家会制 定免签或者落地签政策,只要符合一定的条件(如拥有中国护照),就能够直接出入境。这 就相当于将“是否拥有中国护照”当成了一种授权的规则。同样的,在安全领域中,也有很 多成熟的授权策略,如:自主访问控制、强制访问控制等。
审计和问责
当你在授权下完成操作后,安全需要检查一下“你做了什么”,这个检查的过程就是审计。 当发现你做了某些异常操作时,安全还会提供你做了这些操作的“证据”,让你无法抵赖。 这个过程就是问责。
审计和问责通常也是共同出现的一个过程,因为它们都需要共同的基础:日志。很容易理 解,所谓审计,就是去通过日志还原出用户的操作历史,从而判断是否出现违规的操作。而 问责则是通过日志的完整性,来确保日志还原出来的操作是可信的。想象一下,如果一份日 志可以被人任意地篡改,那我们基于这份日志去进行审计,即使发现违规操作,也无法证明 违规操作确实发生了,只能是白费功夫。
在授权中,我们需要平衡可用性和安全性,很多时候都会选择牺牲部分的安全保障,来降低 使用成本。而审计是事后的策略,它做的任何操作,理论上都不会直接影响用户,因此,能 够做到更全面更严格,也能发现更多的问题。所以,审计这一环节,对于发现安全问题、回 溯产生的攻击、完善安全保护体系来说,非常重要。
而问责,是对审计结果的一个保障,有的时候我们也称之为“不可否认性”。一方面,它保 证了黑客无法通过篡改日志或者仿造身份,来隐藏自己的行为;另一方面它也保证了,当审 计中发现了恶意的行为,需要寻求法律保护时,我们能够提供充分的证据。
大部分情况下,事前防御属于认证,事中防御属 于授权,事后防御属于审计。
密码学基础
对称加密算法
对称加密,代表加密和解密使用的是同一个密钥。
如果我想给你发一段消息,又不想被其他人知道。那么我作为 发送方,会使用加密算法和密钥,生成消息对应的密文;而你作为接收方,想要阅读消息, 就需要使用解密算法和一个同样的密钥,来获得明文。 我们常见的经典对称加密算法有 DES、IDEA、AES、国密 SM1 和 SM4。下面我们一起来 具体看看。
第一种对称加密算法是 DES(数据加密标准,Data Encryption Standard)。 DES 应该是最早的现代密码学算法之一。它由美国政府提出,密钥长度为 56 位。目前,它 暴力破解 56 位密码的时间,已经能控制在 24 小时内了。 DES 实际上是一个过时的密码学算法,目前已经不推荐使用了。关于 DES,还有一点特别 有意思。DES 包含一个关键模块:S 盒,其设计的原理一直没有公开。因此,很多人都相 信,这个 S 盒中存在后门,只要美国政府需要,就能够解密任何 DES 密文。
第二种对称加密算法是 IDEA(国际数据加密算法,International Data Encryption Algorithm)。 IDEA 由瑞士研究人员设计,密钥长度为 128 位。对比于其他的密码学算法,IDEA 的优势 在于没有专利的限制。相比于 DES 和 AES 的使用受到美国政府的控制,IDEA 的设计人员 并没有对其设置太多的限制,这让 IDEA 在全世界范围内得到了广泛地使用和研究。
第三种需要了解的对称加密算法是 AES(高级加密标准,Advanced Encryption Standard)。 在 DES 被破解后,美国政府推出了 AES 算法,提供了 128 位、192 位和 256 位三种密钥 长度。通常情况下,我们会使用 128 位的密钥,来获得足够的加密强度,同时保证性能不 受影响。目前,AES 是国际上最认可的密码学算法。在算力没有突破性进展的前提下, AES 在可预期的未来都是安全的。
最后一种是国密 SM1(SM1 Cryptographic Algorithm)和 SM4(SM4 Cryptographic Algorithm)。 我们知道,密码学作为安全的基础学科,如果全部依靠国外的技术,对于国家安全可能产生 不利影响。因此,中国政府提出了一系列加密算法。其中,国密算法 SM1 和 SM4 都属于 防止断更 请务必加 首发微信:1716143665 对称加密的范畴。SM1 算法不公开,属于国家机密,只能通过相关安全产品进行使用。而 SM4 属于国家标准,算法公开,可自行实现使用。国密算法的优点显而易见:受到国家的 支持和认可。
在加密通信中(如 HTTPS、VPN、SSH 等),通信双方会协商出一个加密算法和密钥,对 传输的数据进行加密,从而防止第三方窃取。在类似数据库加密这种存储加密技术中,通信 双方也是将存储空间中的数据进行加密,这样即使硬盘被物理窃取,也不会导致信息丢失。 在公司内部,为了避免用户的 Cookie 和隐私信息发生泄漏,也需要对它们进行加密存储。 对于大部分公司来说,选取 AES128 进行加解密运算,就能获得较高的安全性和性能。如 果是金融或政府行业,在涉及国家层面的对抗上,有一定的合规需求,则需要应用国密算法。
非对称加密算法
有对称就一定会有非对称。非对称加密代表加密和解密使用不同的密钥。具体的加解密过程 就是,发送方使用公钥对信息进行加密,接收方收到密文后,使用私钥进行解密。具体我也 画了一张图,你可以和上面的对称加密算法的图一起对照着看一下。可以看到,非对称加密 和对称加密算法的最大区别就是,加密和解密使用的密钥是不同的。
当使用对称加密算法的时候,你不仅要跟每一个通信方协定一个密钥,还要担心协商过程中 密钥泄漏的可能性。比如,我当面告诉了你一个密码,怎么保证不被偷听呢?而在非对称加 密算法中,公钥是公开信息,不需要保密,我们可以简单地将一个公钥分发给全部的通信 方。也就是说,我现在就可以告诉你一个公钥密码,即使这意味着所有阅读这篇文章的人都 知道了这个密码,那也没关系。因此,非对称密钥其实主要解决了密钥分发的难题。 除了加密功能外,大部分的非对称算法还提供签名的功能。这也就是说,我们可以使用私钥 加密,公钥解密。一旦接收方通过公钥成功解密,我们就能够证明发送方拥有对应的私钥, 也就能证实发送方的身份,也就是说,私钥加密就是我们说的签名。
你还可以这样理解,比如我现在和你说话,内容经过了我的私钥加密,你用公钥解得了明 文。因为私钥只有我拥有,所以只有我能够发出这段话来,别人都不可能。这也就是说,我 不可能狡辩称这段话不是我说的。
所有的非对称加密算法,都是基于各种数学难题来设计的,这些数学难题的特点是:正向计 算很容易,反向推倒则无解。经典的非对称加密算法包括:RSA、ECC 和国密 SM2。接下 来,我们一个个来看。 我们先看第一种非对称加密算法 RSA(RSA 加密算法,RSA Algorithm)。 RSA 的数学难题是:两个大质数 p、q 相乘的结果 n 很容易计算,但是根据 n 去做质因数 分解得到 p、q,则需要很大的计算量。RSA 是比较经典的非对称加密算法,它的主要优势 就是性能比较快,但想获得较高的加密强度,需要使用很长的密钥。
所有的非对称加密算法,都是基于各种数学难题来设计的,这些数学难题的特点是:正向计 算很容易,反向推倒则无解。经典的非对称加密算法包括:RSA、ECC 和国密 SM2。接下 来,我们一个个来看。 我们先看第一种非对称加密算法 RSA(RSA 加密算法,RSA Algorithm)。 RSA 的数学难题是:两个大质数 p、q 相乘的结果 n 很容易计算,但是根据 n 去做质因数 分解得到 p、q,则需要很大的计算量。RSA 是比较经典的非对称加密算法,它的主要优势 就是性能比较快,但想获得较高的加密强度,需要使用很长的密钥。
国密算法 SM2 也是基于椭圆曲线问题设计的,属于国家标准,算法公开,加密强度和国际 标准的 ECC 相当。而国密的优势在于国家的支持和认可。
我们前面说了,对比于对称加密算法,非对称加密算法最大的优势就是解决密钥分发的问 题。因此,现在大部分的认证和签名场景,其实使用的都是非对称加密算法。比如,在 SSH 登录、Git 上传等场景中,我们都可以将自己的公钥上传到服务端,然后由客户端保存 私钥。
散列算法
。大量的应用都在使用 MD5 或者 SHA 算法计算 一个唯一的 id。比如 Git 中的提交记录、文件的完整性校验、各种语言中字典或者 Map 的 实现等等。很多场景下,我们使用散列算法并不是为了满足什么加密需求,而是利用它可以 对任意长度的输入,计算出一个定长的 id。
作为密码学的算法,散列算法除了提供唯一的 id,其更大的利用价值还在于它的不可逆 性。当用户注册,提交账号密码时,作为一个安全的应用,是绝对不能够存储明文密码的。 因此,我们对用户的密码通过散列算法进行计算,存储最终的散列值。 在后续登录的过程中,我们如果计算出的用户提交的密码的散列值和你存储的散列值一致, 就可以通过验证了。这样一来,任何人(即使是内部员工)都不知道用户真实的密码是什 么,而用户也能够完成密码的校验。 除了刚才说的不可逆性,在密码学上,我们对散列算法的要求还有:鲁棒性(同样的消息生 成同样的摘要)、唯一性(不存在两个不同的消息,能生成同样的摘要)。
我们先来看第 1 种,MD5(消息摘要算法,Message-Digest Algorithm 5)。 MD5 可以用来生成一个 128 位的消息摘要,它是目前应用比较普遍的散列算法,具体的应 用场景你可以自行参阅。虽然,因为算法的缺陷,它的唯一性已经被破解了,但是大部 分场景下,这并不会构成安全问题。但是,如果不是长度受限(32 个字符),我还是不推 荐你继续使用 MD5 的。
第 2 种是 SHA(安全散列算法,Secure Hash Algorithm)。 SHA 是美国开发的政府标准散列算法,分为 SHA-1 和 SHA-2 两个版本,SHA-2 细分的 版本我们就不介绍了。和 MD5 相同,虽然 SHA 的唯一性也被破解了,但是这也不会构成 大的安全问题。目前,SHA-256 普遍被认为是相对安全的散列算法,也是我最推荐你使用 的散列算法。
第 3 种是国密 SM3(SM3 Cryptographic Algorithm)。 国密算法 SM3 是一种散列算法。其属于国家标准,算法公开,加密强度和国际标准的 SHA-256 相当。和国密 SM2 一样,它的优势也在于国家的支持和认可。
另外,我们在使用散列算法的时候,有一点需要注意一下,一定要注意加“盐”。所 谓“盐”,就是一串随机的字符,是可以公开的。将用户的密码“盐”进行拼接后,再进行 散列计算,这样,即使两个用户设置了相同的密码,也会拥有不同的散列值。同时,黑客往 往会提前计算一个彩虹表来提升暴力破解散列值的效率,而我们能够通过加“盐”进行对 抗。“盐”值越长,安全性就越高。
身份认证
首先,身份认证不仅仅是一个输入账号密码的登录页面而已,应用的各个部分都需要涉及身 份认证。在我看来,身份认证可以分为两个部分:对外认证和对内认证。 对外认证,其实就是应用的登录注册模块,它面向用户进行认证。对外认证的入口比较集 中,一个应用通常只有一个登录入口。因此,我们可以在登录这个功能上,实现很多种认证 的方式。这就可以用到我们之前提到的“你知道什么、你拥有什么、你是什么”。 除了应用本身需要有登录注册的模块,应用的各种内部系统同样需要涉及登录认证的功能, 比如:服务器的登录、数据库的登录、Git 的登录、各种内部管理后台的登录等等。这也就 是我所说的对内认证。 那么,对内认证和对外认证有什么区别呢?我觉得,它们最主要的区别在于认证场景的复杂 程度。从下面这张图中我们可以看出,对外认证是单一场景下的认证,对内认证是多场景下 的认证。
身份认证主要面临哪些威胁?
身份 认证面临的威胁主要包括无认证、弱密码、认证信息泄漏。
首先,没有认证环节是所有应用和公司存在的最普遍的问题。尤其是在对内认证的部分,我 们经常会看到,很多公司的数据库、接口、管理后台在使用的时候,并不需要经过认证这个 环节。 除了没有认证环节的直接“裸奔”,弱密码也是一个普遍存在的问题。我常常觉得,安全最 大的敌人是人类的惰性。设计一个好记的强密码并不是一件简单的事情,这也是弱密码屡禁 不止的原因。 说完了无认证和弱密码,接下来我们来聊一聊认证信息泄漏。所谓认证信息泄露,就是指黑 客通过各种手段,拿到了用户的密码信息和身份凭证这样的认证信息。常见的手段包括钓 鱼、拖库等等。更可怕的是,很多攻击对于用户来说都是无感知的。
除了密码的直接泄漏以外,大部分的登录系统都无法应对重放攻击。重放攻击简单来说就 是,黑客在窃取到身份凭证(如 Cookie、Session ID)之后,就可以在无密码的情况下完 成认证了。 总结来说,身份认证面临的威胁其实都是认证信息的泄漏。这其中,既可能是应用本身就没 有认证信息或者认证信息强度比较弱,使得黑客可以通过猜测的方式快速获取认证信息;也 有可能是黑客通过一些攻击手段(如窃听等),从用户那获取了认证信息,从而冒充用户进行登录。
身份认证的安全怎么保证?
在了解了身份认证环节会面临的各种威胁,以及这些威胁可能产生的影响之后,你可能要问 了,我们应该怎么解除这些威胁呢?
基本的解决方案
比如,对密码的强度进行限制(如强制使用字母、数字、特殊字符的组合密码,并达到一定 长度),强制用户定期修改密码,对关键操作设置第二密码(如微信、支付宝的支付密码) 等等。
当然,随着互联网的发展,我们也会不断地利用新技术去升级验证手段,帮助用户降低 被“攻击”的风险。比如,通过手机验证替代密码验证(因为丢失手机的几率比丢失密码的 几率低);通过人脸、指纹等生物特征替代密码。
除此之外,我们还可以通过加密信道(如 HTTPS)来防止窃听;也可以通过给下发的凭证 设置一个有效期,来限制凭证在外暴露的时间,以此来减少重放攻击带来的影响。
这里面有一点你要注意,身份认证的最大的问题还是在于身份管理。随着公司业务的不断扩 张,当账号体系变得越来越复杂时,如何对这些账号进行统一的管理,是解决身份认证问题 的关键。而单点登录就是一个非常有效的解决方案。
单点登录如何解决身份认证问题?
单点登录的概念很简单:用户只 需要进行一次认证,就可以访问所有的网页、应用和其他产品了。随着互联网产品形式的不 断发展,单点登录的实现方式也经历了多次的升级革新。下面我为你介绍几种典型的单点登 录方式,它们分别是:CAS 流程、JWT、OAuth 和 OpenID。
第一个要讲的是 CAS(Central Authentication Service,集中式认证服务)流程。 CAS 是一个开源的单点登录框架,它不属于某一种单点登录的实现方式,而是提供了一整 套完整的落地方案。整体的流程如下图所示,具体步骤我会通过访问极客时间 App 的例子 来为你详细讲解。
- 假如用户现在要访问某个应用,比如极客时间 App。
- 应用需要进行认证,但应用本身不具备认证功能。因此,应用将用户重定向至认证中心 的页面。比如,你在登录一个应用的时候,它显示你可以选择微信、QQ、微博账号进行 登录,你点击微信登录,就跳转至微信的登录页面了。
- 用户在认证中心页面进行认证操作。如果用户之前已经在其他应用进行过认证了,那么 认证中心可以直接识别用户身份,免去用户再次认证的过程。
- 认证完成后,认证中心将认证的凭据,有时会加上用户的一些信息,一起返回给客户端。也就是你在微信登录完成后,回到了极客时间 App。
- 客户端将凭据和其他信息发送给应用,也就是说,极客时间 App 将微信的登录凭据发送 给了极客时间后端。
- 应用收到凭据后,可以通过签名的方式,验证凭据的有效性。或者,应用也可以直接和认证中心通信,验证凭据并获取用户信息。这也就是为什么极客时间能够拿到你的微信头像了。
- 用户完成认证。
JWT(JSON Web Token)是一种非常轻量级的单点登录流程。它会在客户端保存一个凭 证信息,之后在你每一次登录的请求中都带上这个凭证,将其作为登录状态的依据。JWT 的好处在于,不需要应用服务端去额外维护 Cookie 或者 Session 了。但是,正是因为它 将登录状态落到了客户端,所以我们无法进行注销等操作了。
OAuth(Open Authorization)的主要特点是授权,也是我们通常用 QQ、微信登录其他 应用时所采用的协议。通过 OAuth,用户在完成了认证中心的登录之后,应用只能够验证 用户确实在第三方登录了。但是,想要维持应用内的登录状态,应用还是得颁发自己的登录 凭证。这也就是为什么 QQ 授权后,应用还需要绑定你的手机号码。这也就意味着,应用 是基于 QQ 的信息创建了一个自身的账号。
OpenID(Open Identity Document)和 OAuth 的功能基本一致。但是,OpenID 不提 供授权的功能。最常见的,当我们需要在应用中使用微信支付的时候,应用只需要收集支付 相关的信息即可,并不需要获取用户的微信头像。
在实际情况中,基于各种业务需求的考虑,很多公司都倾向于自己去实现一套 SSO 的认证 体系,它的认证流程如下图所示:
在这个流程中,应用的服务器直接接收用户的认证信息,并转发给认证中心。对用户来说, 这个认证中心是完全透明的。但是,这个流程给予了应用过多的信任,从安全性方面考量的 话,是不合理的。在这个过程中,应用直接获取到了用户的认证信息,但应用能否保护好这 些信息呢?我们并没有有效的办法去做确认。
访问控制
访问控制模型
首先,在探讨访问控制的机制之前,我们先要来了解一下,访问控制的场景是什么。这也是 你去理解访问控制机制的一个基础。我把访问控制模型抽象成了下图的模型,你可以看看。 具体来说就是,一个主体请求一个客体,这个请求的授权由访问控制来完成。
如何具体的理解这个模型呢?你可以这样想:在用户去读取文件的过程中,用户是主体,读 取这个操作是请求,文件是客体。下面我来详细介绍一下。
主体:请求的发起者。主体可以是用户,也可以是进程、应用、设备等任何发起访问请 求的来源。
客体:请求的接收方,一般是某种资源。比如某个文件、数据库,也可以是进程、设备等接受指令的实体。
请求:主体对客体进行的操作。常规的是读、写和执行,也可以进一步细分为删除、追 加等粒度更细的操作。
常见的访问控制机制
我们先来第 1 种,DAC(Discretionary Access Control,自主访问控制)。 DAC 就是让客体的所有者来定义访问控制规则。想象一下,你想要从图书馆中拿走一本 书。这个时候,管理员说,“你经过这本书的所有人同意了吗?”这个过程就是 DAC。 在 DAC 中,访问控制的规则维护完全下发到了所有者手上,管理员在理论上不需要对访问 控制规则进行维护。因此,DAC 具备很高的灵活性,维护成本也很低。相对的,尽管 DAC 降低了管理员的工作难度,但是会增加整体访问控制监管的难度,以至于安全性完全取决于 所有者的个人安全意识。 这么说来,DAC 的特性其实就是将安全交到了用户手中,因此,DAC 适合在面向用户的时 候进行使用。当用户需要掌控自己的资源时,我们通常会采取 DAC,来完成访问控制。比 方说,Linux 中采用的就是 DAC,用户可以控制自己的文件能够被谁访问。
2 种是 role-BAC(role Based Access Control,基于角色的访问控制)。 role-BAC 就是将主体划分为不同的角色,然后对每个角色的权限进行定义。我们还是以图 书馆为例。当你想借书的时候,管理员说,“你是学生吗?”这个过程就是 role-BAC。管理员只需要定义好每一个角色所具备的功能权限,然后将用户划分到不同的角色中去,就完 成了访问控制配置的过程。 role-BAC 是防止权限泛滥,实现最小特权原则的经典解决方案。试想一下,假如没有角色 的概念,那么管理员需要给每一个用户都制定不同的权限方案。当用户的岗位或职责发生变更时,理论上管理员需要对这个用户的权限进行重新分配。但是,准确识别每一个用户需要 哪些权限、不需要哪些权限,是一个很有挑战的工作。如果采用了 role-BAC,那么管理员 只需要简单地将用户从一个角色转移到另一个角色,就可以完成权限的变更。 因此,role-BAC 更适合在管理员集中管理的时候进行使用。在这种情况下,所有的权限都 由管理员进行分配和变更,所以,使用 role-BAC 可以大大降低管理员的工作难度,提高他们的工作效率。同样的原理也适用于应用,应用可以对不同的角色限定不同的操作权限,比 如:运维人员给开发、产品、运维划分不同的机器操作权限。
第 3 种是 rule-BAC(rule Based Access Control,基于规则的访问控制)。 rule-BAC 就是制定某种规则,将主体、请求和客体的信息结合起来进行判定。在 ruleBAC 的控制机制中,如果你想要在图书馆借书,管理员会说,“根据规定,持有阅览证就 可以借书。”
相比较来说,DAC 是所有者对客体制定的访问控制策略,role-BAC 是管理员对主体制定 的访问控制策略,而 rule-BAC 可以说是针对请求本身制定的访问控制策略。
最后一种是 MAC(Mandatory Access Control,强制访问控制)。 MAC 是一种基于安全级别标签的访问控制策略。只看这个定义你可能不太理解,我们还是 用图书馆的例子来解释一下,当你在图书馆排队借书的时候,听到管理员说:“初中生不能 借阅高中生的书籍。”这就是一种强制访问控制。在互联网中,主体和客体被划分为“秘 密、私人、敏感、公开”这四个级别。MAC 要求对所有的主体和客体都打上对应的标签, 然后根据标签来制定访问控制规则。 比如:为了保证机密性,MAC 不允许低级别的主体读取高级别的客体、不允许高级别的主 体写入低级别的客体;为了保证完整性,MAC 不允许高级别的主体读取低级别的客体,不 允许低级别的主体写入高级别的客体。这么说有些难以理解,我们可以这样来记:机密性不 能低读、高写;完整性不能高读、低写。
MAC 是安全性最高的访问控制策略。但它对实施的要求也很高,需要对系统中的所有数据 都进行标记。在实际工作中,想要做到这一点并不容易。每一个应用和系统,每时每刻都在 不停地生产新的数据,数据也不停地在各个系统之间流转。你需要对这些行为进行全面的把 控,才能将标签落地。因此,MAC 仅仅会出现在政府系统中,普通公司在没有过多的合规 需求下,不会采取 MAC。
威胁评估的步骤
威胁评估主要有三个步骤:识别数据、识别攻击、识别漏洞。
我们先来看一下识别数据。我们知道,安全保护的核心资产就是数据。因此,威胁评估的第 一步就是去识别数据。识别数据的最终目的是,当发生攻击,某一份数据的 CIA 受到影响 时,会对公司造成多大的损失。这也是我们衡量安全投入高低的一个主要指标。
一般情况下,在识别完数据之后,我们就能推测出黑客会采取哪些方式进行攻击,这也就到 了第二个步骤:识别攻击。识别攻击的核心就是,明确什么样的数据有价值被攻击。比如, 对于公开的数据,没有被窃取的意义,所以黑客只会通过爬虫来抓站,而不会花费更大的成 本去盗号。
在识别了数据和攻击之后,我们就需要根据应用去识别可能的漏洞了。这也就是第三个步 骤:识别漏洞。比如,对于 Web 应用,它可能出现诸如 XSS、SQL 注入等 Web 漏洞。关于这一点,业内将常见的攻击和漏洞进行了总结。比如,近两年来由 MITRE 提出的 ATTACK框架比较知名。在识别漏洞的时候,我们可以基于这些总结性框架去进行罗列。
通过对数据、攻击、漏洞的识别,你就能够知道,公司当前面临了哪些潜在的威胁,从而可 以去思考解决方案,并推动它的落地。通常来说,我们需要定期(比如每年)对公司进行一 次全面的威胁评估工作,并且随着公司的发展,不断调整安全方案。