1 软件开发控制概述
- 由于恶意的/粗心的开发人员创建后门、缓冲区溢出漏洞或其他导致系统被恶意人员利用的弱点,定制解决方案可能存在巨大的安全漏洞,为了防范这些漏洞,在系统开发的声明周期内引入安全性是至关重要的
1.1 软件开发
- 系统开发的每个阶段都应当考虑安全性,这些阶段包括整个软件开发过程,开发人员应该力求在他们开发的所有应用程序中构建安全性,并且为关键的应用程序和敏感信息的应用程序提供更高级别的安全性
1、编程语言- 使用二进制数字的语言被称为机器语言
- 高级语言分为编译型和解释型,变异语言,编程人员可以使用被称为编译器的工具将高级语言转换为在特定 操作系统中使用的可执行文件,解释型语言,编译人员会分源代码,源代码中包含以高级语言编写的指令
2、面向对象编程 - 面向对象编程关注交互设计的对象,可以间这些对象视为被请求执行特定操作或显示特定行为的一组对象,对象一起共奏,从而提供系统的功能或能力
- 面向对象编程提供了抽象的黑盒方法,用户需要知道对象的接口细节,但不一定需要知道内部如何有效的使用它们来工作
- 面向对象编程术语:
- 消息:对象的通信或输入
- 方法:定义对象执行响应消息操作的内部代码
- 行为:由对象呈现的结果或输出是一种行为,行为是通过方法处理消息的结果
- 类:定义对象行为的一组对象的公共方法的集合就是类
- 实例: 对象是包含对象方法的类的实例或例子
- 继承:某各类的方法被另一个子类集成时就会出现继承性
- 委托:某个对象将请求转发给另一个对象或委托对象,如果某个对象没有处理特定消息的方法,就需要委托
- 多态性:对象的特性,当外部条件变化时允许以不同的行为响应相同的消息或方法
- 内聚:描述相同类中方法目的之间的关系强度
- 耦合:对象之间的交互级别,好的程序应该是高内聚低耦合
3、保证
- 确保新应用程序中构建的安全控制机制能够在系统的整个生命周期内正确的实现安全策略,保证过程只是据此在系统生命周期内构建信任的正规过程
4、避免和缓解系统故障 - 系统在某些时候可能出现故障,可以通过许多方法来避免故障,包括使用极限检测或创建故障防护或应急开发过程:
- 输入验证:输入验证核实用户提供的值是否匹配程序员的期望,之后才允许进一步处理,
- 通过代码检测确保数字落在一个可接受的范围内,被称为限制检测,
- 输入验证程序改变输入,移除风险特征序列,以及用安全的值代替,这个过程被称为换码输入,
- 输入验证应该存在于事务处理的服务端
- 故障防护和应急开放:应用程序会遭遇不可预测的或无法解释的情况,当应对系统故障做计划时有两个基本选择:
- 故障防护状态将系统置入高级别安全(甚至可能完全禁用),直至管理员能够诊断问题并将系统还原至正常操作状态
- 应急开放状态允许用户绕开失败的安全控制,此时用户获得的特权过高
- 输入验证:输入验证核实用户提供的值是否匹配程序员的期望,之后才允许进一步处理,
1.2 系统开发生命周期
- 在系统或应用程序的整个生命周期内斗进行计划和管理,安全性是最有效的,项目管理使用生命周期模型进行组织,以便指导开发过程,使用正规的声明周期模型有助于确保良好的编程实践以及在产品开发的每个阶段都嵌入安全性
- 系统开发过程的动作:
- 概念定义:为系统创建基本的概念声明,规定项目的用途以及答题需求,定期阅读概念声明能够帮助开发团队重新瞄准自己的目标
- 功能需求确定:这个阶段,具体的系统功能都会被列出来,并且开发人员开始考虑系统的这些部分应当如何相互协作,以便满足功能需求,整个开发团队都应该在全部阶段参考功能需求文档,以确保项目正常进行,最后的测试和评估阶段,项目管理者应当使用这份文档当做核对清单,确保所有功能需求得到满足
- 控制规范的开发,首先恰当的访问控制必须被设计到所有系统中,其次系统必须通过使用正确的加密和数据保护技术来维护关键数据的机密性,再次系统不仅应当提供审计跟踪来强制实施个人的可问责性,还应当提供对非法活动的检测机制,最后系统的危险程度必须解决可用性和容错问题,安全性设计必须主动进行,每次对涉及规范进行重大改动时应当再次参考安全需求
- 设计评审,在设计的过程中,设计人员要正确的确定系统的不同部分将如何相互操作以及如何布置模块化的系统结构
- 代码审查走查,根据特定模块的代码副本进行走差,寻找逻辑流中的问题或其他设计/安全性缺陷,有助于确保不同开发团队开发的代码依据规范执行
- 用户验收测试,一旦完成这个阶段,代码可能会转移转移部署,与任何关键的开发过程一样,保存一份书面的测试计划和测试结果是非常重要的,可供将来审查
- 维护和变更管理, 任何代码的变更都要通过正式的变更流程来进行
1.3 生命周期模型
- 合适的管理模型能够改善最终的产品,实施SDLC模型的初始步骤之一包括获得管理层的批准
1、瀑布模型- 将系统开发的生命在后期看做一个系列反复活动,瀑布模型的主要批评:只准许开发人员后退一个阶段,瀑布模型没有对开发周期后期发现错误做出相应规定
2、螺旋模型 - 螺旋模型封装了许多迭代的其他模型,所以被称为元模型或“模型的模型”
3、敏捷软件开发 - 采用替代的、强调客户需求的和快速开发的新功能并以迭代的方式满足这些需求
4、软件能力成熟模型(CMMI) - 通过实现从特别混沌的过程到成熟的、有纪律的软件过程的发展路径,从而帮助软件组织改善软件过程的成熟度和质量
- SW-CMM具有初始级、定义级、管理级、优化级
5、 IDEAL 模型 - IDEAL模型具有以下阶段:
- 启动:概述更改业务的原因,为举措提供支持,以及准备好恰当的基础建设
- 诊断:工程师分析组织的当前状态,并且为更改给出一般性建议
- 建立:组织采用诊断阶段的一般建议,并且开发帮助实现这些更改的具体动作计划
- 行动:停止“讨论”开始“执行”,组织开发解决方案,随后测试、改进和实现解决方案
- 学习:组织不断分析其努力的结果,从而确定是否已实现期望的目标,必要时建议采取新的行动,使组织重返正轨
- 将系统开发的生命在后期看做一个系列反复活动,瀑布模型的主要批评:只准许开发人员后退一个阶段,瀑布模型没有对开发周期后期发现错误做出相应规定
1.4 甘特图和PERT
- 甘特图是一种显示不同时间项目和调度之间相互关系的条形图,提供了帮助计划、协调和跟踪项目中特定任务的调度图表
- PERT被用于直接改进项目管理和软件编程,以便开发更有效的软件
1.5 变更和配置管理
- 变更必须有组织的方式管理所请求的变更,变更必须记录到中央存储库,以支持将来的审计、调查和分析需求
- 变更管理流程
- 请求变更: 请求控制过程提供了一个有组织的框架,在这个框架内,用户可以请求变更,管理者可以进行成本/效益分析,开发人员可以优化任务
- 变更控制:开发人员使用变更控制过程来重新创建用户遭遇的特定情况,并且分析能够进行弥补的适当变更,变更控制过程也提供一个有组织的框架,变更控制包括:遵守质量控制约束,开发用于更改或更改部署的工具,正确记录任何编码变化,以及将新代码对安全性的负面影响最小化
- 发布控制:发布控制必要的步骤是复核并确保更改过程中作为编程辅助设计插入的任何代码,还包括验收测试,从而确定对终端用户工作任务的任何更改都是可理解的和有用的
- 配置管理过程用户控制整个组织范围内使用的软件版本,并且正式跟踪和控制对软件配置的更改,配置管理的主要组件:
- 配置标识:配置标识过程中,管理员记录整个组织范围内的软件产品的配置
- 配置控制:配置控制确保对软件版本的更改要与更改控制和配置管理策略一致,只有符合这些策略的授权分发才能够执行更改操作
- 配置状态统计:用于跟踪所有发生的授权更改的正规过程
- 配置审计: 定义配置审计能够确保实际的生产环境与统计记录一致,以及确保没有发生未授权的配置变更
1.6 Devops方法
- devops模型与敏捷开发方法紧密配合,旨在显著的缩短开发、测试和部署软件更改所需的时间
1.7 应用编程接口
- API 允许应用程序开发人员绕过传统的网页,并通过函数调用直接与底层服务进行交互,API带来的机会也带来的安全风险
- API必须考虑认证 要求,API也必须彻底测试安全缺陷
1.8 软件测试
- 组织在内部分发(或市场发布)任何软件之前都应当对其进行彻底测试,测试的最佳时间是设计模块之时,
- 测试软件时,应该应用于组织其他方面所使用相同的责任分离规则,
- 软件测试方法:
- 白盒测试:检测程序内部逻辑结构并逐行执行代码
- 黑盒测试:从用户的角度检查程序
- 灰盒测试:白盒和黑盒的组合,从用户角度处理软件,分析输入和输出,也会访问源代码,并且使用源代码来帮助设计测试
- 两种用于评估应用程序安全性的测试类别:
- 静态测试:通过分析源代码或编译的应用程序来评估软件的安全性
- 动态测试:运行时环境中评估软件的安全性,并且通常是部署了由其他人编写的应用程序的组织的唯一选择
1.9 代码仓库
- 代码仓库作为开发人员放置源代码的中心存储点,还提供版本控制、错误跟踪、web托管、发布管理和支持软件开发的通信功能
- 代码仓库的安全风险
- 开发人员必须适当的控制对仓库的访问
1.10 服务等级协议
- 服务等级协议是服务提供商和服务供应商都认同的确保组织内部和/或外部客户提供服务,并保持适当服务水平的一种方法,如果不能维持协议,服务级别协议通常还包括财务和和其他合约商讨好的补救费用
1.10 软件采购
- 企业使用的大多数软件都不是内部开发的,而是从供应商那里采购的,都应该考虑安全性,安全专业人员必须了解软件的正确配置以满足安全目标,还关注安全公告和补丁保持警惕,以纠正新发现的漏洞
- SaaS环境中,大多数安全责任由供应商负责,但是组织的安全人员也不能逃脱责任
2 创建数据库和数据仓储
2.1 数据库管理系统的体系结构
- 数据管理系统(DBMS)体系结构,层次式数据库和分布式数据库
1、层次式和分布式数据库- 层次式数据库模型将关联的记录和字段组合成一个逻辑树结构,层次数据库以一种分层的方式来存储数据,并且对于适合该模型的专有应用程序是有用的
- 分布式数据库模型将数据存储在多个数据库中,这些数据库是逻辑连接,分布式数据库的数据映射是多对多
2、关系数据库 - 关系数据库是由行和列组成的平面二维表,关系数据库的主要构件是表(也称为关系)
- 关系中行的数量被视为基数,列的数量被视为度,关系的域是一组属性可以采用的允许值,表的基数经常变化,表的度不会频繁变化
- 记录可能由多种键进行标识,应当熟悉的三种键
- 候选键:被用于唯一标识表中记录的属性子集,每个表可能有一个或多个候选键
- 主键:从表的这组候选键后选出的用来唯一标识表中记录的键被称为主键,每个表都只有一个主键
- 外键:用于强制在两个表之间建立关系
- 所有关系数据库都使用一种标准语言,即结构化查询语言(SQL)
- SQL主要的安全特性是其授权的粒度,意味着SQL允许为每个极细的级别设置许可,能通过表、行、列、甚至是单独的单元来限制用户访问
- SQL本身被分为两个截然不同的组件:数据定义语言(DDL),允许创建和更改数据库的结构;数据操纵语言(DML),允许用户与模式内包含的数据交互
2.2 数据库事务
- 关系数据库支持事务的显式或隐式使用,从而确保数据的完整性,事务提交可以是显式的,使用SQL的commit命令,可以是隐式的,成功到达事务结束进行提交
- 数据库的4个必须的特征
- 原子性:数据库事务必须是原子的,必须要么全有,要么全无的事物,如果事务的任何部分失败,整个事务就会被回滚
- 一致性:所有事务都必须在与数据库所有规则一致的环境中开始操作
- 隔离性: 要求事务彼此之间独立操作
- 持久性:数据库事务必须是持久的,也就是说一旦提交给数据库,就会被保留下来,数据库通过备份机制确保持久性
2.3 多级数据库的安全性
- 多级安全性数据库包含大量不同分类级别的信息,他们必须对分配给用户的标签进行验证,并且根据用户的请求只提供是回档的信息
- 不同的数据混合在一起被称为数据库污染,这是一个重大的安全风险,通常,管理员会通过部署可信前端为旧式的或不安全的DBMS添加多级安全性
1、并发性- 并发性或编辑控制是一种预防性的安全机制,这种机制通过数据库中存储的数据时钟是正确的,或者至少使其完整性和可用性受到保护
2、其他安全机制 - 使用DBMS时,管理员可以部署其他一些安全机制,这些特性的实现相对简单,并且是业内常见的,如:
- 语义完整性:确保用户的动作不会出现违反任何结构上的规范,还检查存储的所有数据烈性都位于有效的 域范围内,确保只存在逻辑值,并且确认系统遵守任何和所有的唯一性约束
- 数据库内能够细粒度的控制对象,内容相关的访问控制重点基于要访问的内容或有效载荷进行控制,内容相关的访问控制增加了开销,细粒度的另一种形式就是单元抑制,是对单独的数据库字段或单元隐藏或强加更安全的约束
- 上下文相关的访问控制,是对每个对象、数据包或字段如何与总体的活动或通信相联系,任何单个元素本身看上去无关紧要,但在较大的上下文环境中就会表露出有意还是有害的
- 数据库分区技术,用来防止聚合、推理和污染漏洞
- 多实例:同一个关系数据库表中,两行或更多行具有相同的主键元素,但是包含在不同分类级别使用的不同数据,就会出现多实例,多实例常常被用作针对某些推理攻击类型的防范措施
- 管理员可以利用噪声和干扰在DBMS中插入错误的或欺骗的数据,从而重定向或阻扰信息机密性攻击
- 并发性或编辑控制是一种预防性的安全机制,这种机制通过数据库中存储的数据时钟是正确的,或者至少使其完整性和可用性受到保护
2.4 ODBC
- 开放数据库互连(ODBC)是一种数据库特性,允许应用程序与不同数据库类型通信
3 存储数据和信息
- DBMS安全性只适用于通过传统的“前门”渠道访问信息,数据还通过计算机的存储资源(内存和物理介质)进行处理,为了确保这些基本的资源免受安全漏洞的威胁,必须采取预防措施
3.1 存储器的类型
- 主(实际)存储器由系统的CPU可以直接访问的主要存储资源组成,主存储器通常由意识形态的随机访问的存储器组成,并且一般是系统可以使用的性能最高的存储资源
- 辅助存储器由许多较链家的、非易失性的、可供系统长期使用的存储资源组成,典型的辅助存储器资源包括磁性的和光学的介质,如磁带、磁盘、硬盘和CD/DVD存储
- 虚拟内存准许系统利用辅助存储器模拟额外的主存储器资源,如利用硬盘的一部分作为直接CPU寻址使用
- 虚拟存储器准许系统利用主存储器模拟辅助存储器的资源,虚拟存储器的最常见例子是作为辅助存储器提供给操作系统的RAM磁盘
- 随机访问存储器准许操作系统请求介质上任意位置的内容,RAM和硬盘都是随机访问存储器
- 顺序访问存储器需要从头到指定地址进行整个介质扫描,磁带是常见的顺序访问存储器的例子
- 易失性存储器在资源断电时会丢失上面的存储内容,RAM是最常见的易失性存储器
- 非易失性存储器不依赖电源的供电来维持存储内容,磁性的/光学的介质和非易失性RAM都是非易失性存储器的例子
3.2 存储器威胁
- 无论使用哪种类型的存储器,都存在对存储器资源的非法访问
- 隐蔽通道是对存储器资源的第二种主要威胁,隐蔽通道准许通过直接或间接的操纵共享存储介质
4 理解基于知识的系统
4.1 专家系统
- 专家系统试图具体化人类在某个特殊学科累积的知识,并且以一致的方式将他们应用于将来的决定,专家系统有两个主要的组件:知识库和推理引擎
- 知识库包含专家系统已知的规则
- 推理引擎对知识库中的信息进行分析,从而得到正确的决策
- 专家系统的优点是决策不涉及情绪影响,可能再一些情况中扮演重要的角色
4.2 神经网络
- 在神经网络中,计算单元链被用来尝试模仿人脑的生物学推理过程,在神经网络中建立了相互插入和最终合计生成预期输出结果的计算决策长链
- 神经网络的优点包括线型、输入-输出映射和自适应
4.3 决策支持系统
- 决策支持系统(DSS)是一种知识型应用,它分析业务数据并且以更容易做出业务决策的形式提供给用户
- DSS常被知识型员工和销售服务人员所使用,这种应用可以以图形方式提供信息,从而连接概念和内容并指导操作者,通常DSS得到了控制某个数据库的专家系统支持
4.4 安全性应用
- 下一代入侵检测专家系统(NIDES),系统提供了一个推理引擎和知识库,从网络的多种审计日志中提取信息,并且在单个用户的饿操作与他们的标准应用描述不同时向管理员发出通知
网友评论