华为的可信设计与重构专业级考试(科目四)一直是很多华为人无法逾越的拦路虎,这门考试通过需求分析、可信设计、软件建模、设计模式、重构分析等几个部分,涵盖了整个软件工程中最核心的模块。这需要我们花很多时间学习并彻底灵活运用各个知识点才能考过。我将通过一个系列的的文章来带大家理解这几个模块。本篇我们将理解 可信设计。可信设计从安全架构与设计、产品网络安全、密码学、隐私保护等方面来展开。
安全架构与设计
1. 安全架构设计与方法
当今越来越多互联网IT企业在产品系统架构设计时就考虑网络安全架构,主要表现在以下几个方面:网络的物理安全、网络拓扑结构安全、应用系统安全、网络管理安全等;公司高层开始关注产品线的网络安全设计问题,对产品的架构设计,特别是安全架构设计提出更高要求;当前云计算业务发展迅速,开放网络和业务共享场景更加复杂多变,这就对云计算的底层架构(IaaS和PaaS层)虚拟化技术的安全性提出了更高要求;业界加大了安全标准的制定,CC、FIPS安全认证、ISO27001标准等越来越多国际标准认证组织关注安全架构设计方面的评估。以上的一系列因素构成了当前安全架构设计诉求的来源。大量历史经验表明,越早在架构设计阶段考虑到安全设计的系统,比那些在越晚的开发设计阶段才考虑安全设计的系统,要安全得多。
- 软件系统架构的定义:
- 安全架构的定义:
那么安全架构主要关注哪些问题呢?应该是关注而不限于如下问题:
- 从系统架构层上分析安全威胁,及针对这些威胁如何在整个架构中组合各个安全组件,保证安全组件、机制的选择满足纵深防御的要求;
- 保证系统的机密性、可用性、完整性;
- 安全架构是可自保护、可自检测、可适应未来安全发展的模型。
业界经典的安全架构,例如阿里金融云安全架构示意图:
我们也可以通过公司某产品的的安全功能实例图来了解,需要从哪些方面去了解整个产品的安全架构:
2. 基于8维度设计框架的安全架构设计方法
华为云在参考CC的安全功能项、NIST控制集,总结汇总成产品安全架构设计8维度24子项,牵引架构设计人员系统、全面地进行安全架构设计,避免架构级安全设计遗漏。8维度安全架构实在参考架构级的NIST控制项,再与 High Level 威胁分析问卷融合,最终输出的此框架方案。8维度安全架构设计包括以下几个方面:
3. 架构级安全威胁分析 —— ASTRIDE High Level
High Level威胁建模分析是指对产品架构进行安全威胁识别,制定对应的消减建议,优化产品架构的安全性。如何将STRIDE方法的High Level部分与系统架构设计结合,并成为系统安全架构设计中的一个重要部分?我们对原有STRIDE方法的High Level部分进行了改造,使之尽可能成为架构级的威胁建模方法。ASTRIDE High Level威胁建模方法的主要变化有哪些呢?
- 数据流图的变化
- 传统的STRIDE采用数据流图作为分析输入,其优点在于:1.数据流与攻击流类似,适合找到可能的攻击点;2.数据流图元素的标准化;
- 但数据流图也有明显的局限性,不太适用于描述产品架构;
- 我司在产品架构设计时更多用到的是功能视图和逻辑视图;
- 因此,我们在ASTRIDE中,将逻辑视图作为分析输入,并将接口、组件作为逻辑视图中的标准元素;
- ASTRIDE High Level威胁建模方法的主要变化
- 不再基于数据流图,而是基于产品的系统架构视图分析;
- 将STRIDE的6种威胁与数据流图中的标准元素进行结构化重构,重点分析架构视图中的业务组件和接口2个关键元素;
- 消减建议的变化
- 消减建议标准化:根据8维度安全架构设计框架,将安全消减建议与8大安全维度对应
- 消减建议方案化:在架构设计中,不能只考虑单点的消减建议,而更多需要在架构层面进行拉通,形成相应的解决方案;如很多地方都需要加密,那么在架构设计时就需要有统一的加密和密钥管理方案; 华为云安全架构设计方法流程示意图:
4. 安全三要素与安全设计原则
安全三要素主要包含:
- 可用性 —— 系统必须及时的服务,不能拒绝向授权用户提供服务
- 完整性 —— 信息和程序不能受到故意或无意的非授权操纵
- 机密性 —— 私密的数据不能透露给非授权的个体 1974年美国麻省理工学院的Jerry Saltzer教授提出了八条设计与实现安全机制的基本原则。 这八条原则充分体现了简单性和限制性的设计思想:
- 开放设计原则
- 失败-默认安全原则
- 职责分离原则
- 最小权限原则
- 最小公共化原则
- 经济适用原则
- 完全仲裁原则
- 心里可承受原则 经过业界多年的发展和总结,又发展引申出其他一些安全原则,例如纵深防御原则、保护隐私原则、不要轻易信任原则、保护最薄弱环节原则等
ASTRIDE Low Level威胁分析
在软件系统中存在许多潜在的安全威胁、明确风险并建立相应的的消减机制需要我们通过 ASTRIDE分析 来实现。我们一起看下常见的问题场景:
- 红线要求:口令不能明文传输。于是,口令(passwd)使用SHA512(passwd)哈希后传输?安全吗?
- 红线要求:使用单独的操作系统的非管理员账号来运行数据库?为什么?
- 在linux系统中,root用户修改口令不需要旧口令? 为什么?
- WEB场景中,会话ID要用安全的随机数生成,并且还有长度要求。为什么?
- WEB场景中,CSRF采用安全随机数防护,是否就真的万无一失了?
- 系统采用了用户名口令认证,是否就安全?
- 系统使用了TLS,是否就安全?
ASTRIDE LowLevel威胁建模流程
威胁建模 是一种结构化的方法,帮助产品通过威胁建模识别产品存在的潜在威胁,提高设计的安全性。 目标是评估产品设计的安全性,并不能识别编码级的安全问题。与产品设计同步进行,在TR2阶段结束前前完成Lowlevel威胁分析。
-
Step 1:绘制数据流图
-
Step 2:威胁分析
- Spoofing 仿冒
- Tampering 篡改
- Repudiation 抵赖
- Imformation Disclosure 信息泄漏
- Denial of Service 拒绝服务
- Elevation of Privilege 权限提升
- Privacy 隐私(非法处理个人数据)
威胁分析 —— 增量分析场景:对于增量特性,可在继承已有分析结果的情况下,仅对增加/变化部分进行分析,可以减少分析工作量,威胁分析过程增加 变更识别 的步骤:
威胁分析 —— 扩展化场景:对于数据流图中的公共部件或者已经分析过的业务场景,可以直接引用其分析结果:
-
已有相关场景化图元,绘制数据流图时可以直接使用场景化图元;
-
已有业务场景基线(组合图元),可以先继承已有的基线,再基于基线修改数据流图
-
Step 3:风险评估 安全风险 = 攻击者接入位置 * 缺陷利用的技术条件 * 影响
-
攻击者接入位置:攻击者发动针对目标系统的攻击时需要具备的接入条件。接入环境越开放,风险越高
-
缺陷利用的技术条件:攻击者利用该缺陷时,必须具备的、技术上的前提条件(技术资源、权限、攻击时间窗、用户交互),利用难度越低,风险越高。
-
影响:指的是如果该缺陷被利用,目标系统遭受的损失,包括完整性、机密性、可用性所受到的影响。缺陷被利用后,对系统的影响越大,风险越高 隐私风险 = 国家/角色* 缺陷利用的技术条件 * 影响
-
国家/角色:指的是产品发往的国家和产品自身所处的角色。不同国家对隐私的重视程度不同,不同产品角色所承担的法律风险不同
-
缺陷利用的技术条件:攻击者利用该缺陷时,必须具备的、技术上的前提条件,利用难度越低,风险越高。
-
影响:指的是系统中存在的缺陷对隐私的合理性和合法性所产生的影响。当缺陷被发现后,对隐私的合理性和合法性影响越大,风险越高
-
Step 4:指定消减措施
-
Step 5:产品响应
产品网络安全红线
公司指定产品网络安全红线的目标:
- 避免安全危机:合法合规,遵从区域法规,消除政治炒作的口实
- 避免信任危机:满足大T基本安全门槛,避免对华为整体信任危机
- 减少安全事故:解决安全现网问题,实现网络安全的基本保障 安全红线的来源:
- 安全法规,政府组织的安全要求
- 大T运营商准入需求
- 大T运营商标书需求
- 现网安全问题总结
- 技术分析、业界趋势 安全红线的分类:
- 合法/合规要求的红线(A1类)
- 需撇清安全责任的红线(A2类)
- 基本安全功能的红线(B类)
密码学应用
现代密码学是基于密钥安全的,因为密码算法都是公开的,权威机构认证的密码算法都是安全的,所以密钥的安全在很大程度上决定了密码体系的安全强度。在这样的前提下,通过攻击获取 密钥 就成了获取明文最直接的方式。
安全强度是对破解密码算法或者系统所需要的工作量的一个数值度量,用来衡量密码算法或者密码系统的安全性。密码算法的安全强度由算法本身和使用的密钥长度决定。穷举攻击的难度在一定程度上可以衡量密码算法的破解难度。随着计算机技术的不断发展,当前还是被认为安全可靠的密码算法,可能在不久的将来就能被轻易破解了。因此我们对密码算法的选择也要与时俱进,及时更新当前业界认可的安全密码算法。
随机数的使用场景
- 用于产生密钥 —— 直接作为密钥;密钥协商过程中作为密钥材料
- 用于产生不可测的IV —— IV(初始化向量);对称密码算法的某些算法模式要求必须提供的一段作为初始输入的数据段,IV无须保密,但是对于某些算法模式(如CBC、CFB模式),要求IV必须具有不可预测性
- 用于产生“盐值” —— 单向散列函数的输出总是既定的,盐值用于混淆单向散列函数的既定输出;单向散列函数就像把盘子掰成2半,对于相同的盘子(数据),使用相同的掰法(单向散列函数),掰出来的碎片总是相同的2块;但如果随意的往地上摔盘子(加入盐值)、盘子碎片数目就变成不可预计的N块。这样有效的混淆了盘子本身的 尺寸和形状,有效的增加了攻击的难度。 业界认为真正意义上的随机数其结果是不可预测的。 计算机中通常利用一些不确定因素(如指令集执行时间)结合特定的随机数产生算法获得随机数,这种方式获取的随机数是伪随机数。伪随机数分为密码学安全的伪随机数和非密码学安全的伪随机数。密码学关注的随机数是密码学安全的随机数。安全随机数要求:尽可能的不可预测、足够随机! 推荐的安全随机数产生器RNG有:
- OpenSSL库的RAND_bytes()
- 中软iPSI组件的CRYPT_random()
- JDK的java.security.SecureRandom ()
- 类Unix平台的/dev/random文件
- Windows平台的RtlGenRandom ()
- VxWorks平台CCI组件的cciRand ()
对称密码算法
现代密码算法主要分为对称密码算法和非对称密码算法。在对称密码算法中,加密密钥和解密密钥是一样的,或者彼此之间容易相互确定。
如下图所示,对称机密算法分为流密码算法和分组密码算法。
- 流密码算法 —— 对称密码算法的一种,它使用算法和密钥一起产生一个随机码流(密钥流),将其与数据流XOR产生加密后的密文数据流。实践中数据通常是一个比特bit,加解密使用相同的密钥流。典型算法是RC4算法,在1987年由RSA公司的Rivest开发,密钥长度在40-256比特之间,应用于Remote Desktop, Skype等软件,SSL协议也支持RC4算法。其缺陷是所有的流密码算法都存在结构上的弱点。替代方案是NIST推荐使用AES算法的流加密工作模式(CTR或OFB)来代替流加密。
- 分组密码算法 —— 将明文消息划分为固定长度的分组,每个分组使用相同的密钥和算法计算出密文。实际加密应用中,通常需要加密任意长度的消息(数据),而分组密码算法通常处理的消息(数据)长度是固定的,因此就引入了分组密码算法的工作模式来解决该问题。
非对称密码算法
非对称密码算法,又称公钥密码算法。算法使用两个密钥,一个公钥,一个私钥。公钥可以向所有使用者公开,私钥需要保密。非对称密码算法广泛应用于密钥协商、数字签名、数字证书等安全领域。常用的非对称密码算法有RSA, DSA, DH, ECC等。
- 数字签名 —— 数字签名是一种类似写在纸上的普通的物理签名,但它使用了公钥加密技术,可以用于签发和鉴别数字信息。一套数字签名通常定义两种互补的运算:一个用于签名,一个用于验证,签名过程使用私钥,验证过程使用公钥。签名算法要结合安全的哈希算法一起使用;只对来源可信的数据进行签名;在同时进行加密和签名时,使用先签名后加密的方式
- RSA 算法 —— RSA算法是第一个既能用于数据非对称加密也能用于数字签名的算法。选取安全的密钥长度,密钥长度大于等于2048bits;选取合适的公共指数e,通常取216+1,即0x10001;RSA加密时的填充:应优先选择OAEP填充方式;加密和签名要使用不同的密钥对
- ECC 算法 —— 椭圆曲线密码学(ECC , Elliptic curve cryptography)是基于椭圆曲线数学的一种公开密钥加密方法。ECC算法也同时提供非对称加密和数字签名两种功能。常见使用ECC的算法包括ECDSA和ECDH,以及国密的SM2算法。RSA适合于校验频度高而签名频度低的场景,ECDSA适合于签名和校验频度相当的场景; 使用标准中推荐的曲线参数, 选取安全的密钥长度,密钥长度大于等于256bits;使用ECDSA算法时,不要使用二进制域的ECDSA认证方式。
- DH 算法 —— Diffie-Hellman算法也叫DH密钥交换算法,由Whitfield Diffie和Martin Hellman于1976发布,它也是世界上第一个公开密钥算法。其安全性取决于在有限域上计算离散对数比计算指数更为困难的数学事实。DH算法大大简化了以往对称密钥体制实现密钥分发的工作。它可以让通信双方在完全没有对方任何预先信息的条件下通过不安全信道协商双方共享的对称密钥。加密通讯信道建立前可以采用该DH算法,保证密钥分发的机密性。OpenSSL支持DH作为密钥协商算法。DH算法容易受到“中间人”攻击,需要签名或者身份认证机制配合使用。
Hash 算法
在密码学中,哈希算法(Hash Function)常用于构造MAC或在数字签名方案中用于提取数字指纹,也经常应用于数字签名、软件完整性保护、密钥导出、口令单向保存等场景。常见Hash算法有MD5、SHA-1、SHA256…MD2、MD4和MD5均已经被证明是不安全的Hash算法,SHA-1已被证明用于数字签名时其安全强度不足( 破解复杂度263 ),在数字签名场景下禁用。
- 消息摘要(Message Digest)算法 —— 数字摘要的大小一般远远小于其对应的消息大小。以SHA-1为例,消息长度最大可以是摘要值长度的250倍。所以Hash函数是一个不可逆的“压缩函数”。这种设计可以大大减小为了保证数据完整性而传输的额外信息。
- 数字指纹(Digital Fingerprint)算法 —— 数字指纹类似于人的指纹,每个人都有唯一的指纹,哪怕是双胞胎的指纹也不相同。对于数字信息,信息的微小改动(如:1个比特),都会造成信息的Hash值的巨大变化。哈希函数这种对于篡改非常“敏感”的特性,特别适用于保护数据完整性。
- 单向散列(One-way Hash)算法 —— Hash函数的安全性取决于其“单向性”。就像我们不能从破碎的瓷盘碎片还原出完好无缺的盘子一样,攻击者无法从Hash值还原出执行Hash操作前的信息。Hash算法不是加密算法,因为无法“解密”出明文信息