导图社区 应用开发系统安全数据库管理框架思路
1. 前言 随着计算机技术的飞速发展,数据库的应用十分广泛,深入到各个领域,但随之而来产生了数据的安全问题。各种应用系统的数据库中大量数据的安全问题、敏感数据的防窃取和防篡改问题,越来越引起人们的高度重视。数据库系...
编辑于2022-11-14 14:20:10 广东应用开发系统安全数据库管理框架思路
数据库管理
数据库
以一定的格式组织并存储数据、 记录文件,允许用户存取、管理和更新
焦点:数据采集、存储、恢复
最终用户数据(end-user data)
元数据(metadata)
本质:有关数据的数据
有关数据源定义,目标定义,转换规则等相关的关键数据。
和数据库管理系统
管理和控制数据访问的程序集
用户和数据的中介
提供对数据的高级操作,包括创建和修改、访问控制等
最关注完整性,其次是可用性,最后是保密性
组件:
数据库
软件
硬件
用户
特点:
数据一致性
操作必须遵守每个数据库的完整性策略, 完成交易数据保持一致
数据共享
同一时刻可以有多个用户访问数据库, 借助并发控制
数据恢复
若发生错误或系统崩溃,系统可以恢复。 检查在崩溃时候正处理的交易或者回滚, 或者向前已完成一次交易,维护数据的一致性
检查点是一种常见的恢复技术
安全控制
提供各种安全控制,以限制用户访问
数据库语言
数据定义语言(DDL), 例如:CREATE、DROP、ALTER等语句。
数据操作语言(DML), 例如:SELECT(查询)、INSERT(插入)、 UPDATE(修改)、DELETE(删除)语句。
数据控制语言(DCL), 例如:GRANT、REVOKE等语句。
事务控制语句(TCL), 例如:COMMIT、ROLLBACK等语句。
数据完整性
语义完整性 (Semantic interrity)
保证结构化规则和语义规则得到遵守, 防止语义上不正确的数据进入数据库。 可以通过规则约束的规则来实现
引用完整性 (Referential interrity)
任何数据库记录都不能引用一个不存在的主键, 如果一个包含有主键的记录被删除了, 所有被引用的记录都必须删除掉。
实体完整性 (Entity interrity)
数据库由主键值唯一确定
确保有效途径或过程
压缩:研所数据并节省存储空间和I/O的能力
重组:回收不用的空间
重构:添加和改变记录、数据、访问控制、 磁盘配置、处理方法的能力
数据库模型
关系数据库模型
特点:以属性(列)和元组(行)
笛卡尔积的组合
基本组件:
数据定义语言(DDL)
定义数据库的架构(Structure)和数据架构(Schema)
结构:说明表的大小、键的位置、视图和数据元素关系
架构:描述数据库存储和操作的数据类型及其属性
定义数据库的机构、访问操作和完整性过程
数据操作语言(DML)
用户操作命令
数据控制语言(DCL)
创建用户访问和授权对象
查询语言(QL)
对数据库提出查询请求
报表生成器
用户定义方式的数据过程输出
数据字典:
是一种描述数据元素及其关系的中心库, 可存储数据用法、数据关系、数据来源和数据格式等关键信息
数据字典是一个控制数据库数据的集中管理部分, 描述了数据元素和数据库间的交叉引用
描述数据元素定义、模式对象和引用键的集合
模式对象包括表、视图、索引、过程、函数和触发器
数据管理软件读取数据字典,确定模是否存在,并检查特定 用户进程的访问权限,还定义了对每个用户的视图权限设置
需要增加新记录、表、视图或模式时,更新数据字典
主键和外键
主键是一条记录的唯一标示,并在关系数据库中编写索引
外键:如果一个表中的某个属性值与另一个表中的主键相匹配, 并且建立了某种关系,那么这个属性就视为外键
层次数据库模型
逻辑树结构,由在逻辑树结构中相关联的记录和字段组成
树形结构包含许多分支,每个分支又具有许多叶子或数据字段
通常用于一对多映射
访问需要明确路径, 不适合经常更改,适合于经常性查询
示例:轻量级目录访问协议LDAP、注册表结构
网状数据库模型
用有向图表示实体类型及实体间联系。 类似于网状的冗余结构,非严格树形结构
每个数据元素拥有多个父节点和自己录
与层次模型相比检索速度更快
面向对象数据库模型
将面向对象编程中的对象数据模型与DBMS结合在一起, 可存储图像、语音、视频等数据。
面向对象的数据库使用类来定义其对象的属性和过程
对象-关系数据库模型
数据库编程接口
开放数据库互连,ODBC
对象连接和嵌入数据库,OLEDB
ActiveX数据对象,ADO
Java数据库互连,JDBC
数据库漏洞和威胁
完整性 (integrity)
回滚
终止当前事务,取消更改,恢复前一状态
提交
提交,终止当前事务,执行用户进行的修改, 如果不能执行成功则回滚
保存点/检查点
如果检测到错误,用户可以返回相应的位置。
应对并发操作的威胁使用锁机制
聚合 (Aggregation)
一些信息片段分开时并不敏感,但放在一起就敏感。
解决方法
严格控制聚合函数的访问
禁止用户直接访问数据,可以通过视图方式
推理 (Inference)
聚合想要达到的结果
推理得不到显示可用的信息
解决方法:
访问控制
基于内容相关的访问控制
基于上下文相关的访问控制
单元抑制 (Cell suppression)
用于隐藏特定单元的技术
数据库分割 (database partition)
将数据库分成不同的部分
噪声和扰动 (noise and perturbation)
在数据库中插入伪造信息的技术
数据库视图
多实例
建立具有相同主键的多个元组和 由安全级别定义的实例之间的关系
死锁 (DeadLocking)
其他威胁
Subtopic
数据库
联机事务处理,OLTP
ACID原则
原子性(Atomicity)
要么所有修改都提交,要么数据库回滚
一致性(Consistency)
遵循数据库完整性, 保证不同数据库中数据的一致性
隔离性(Isolation)
事物之间互不影响
持久性(Durability)
一旦提交无法进行回滚
使用与操作人员、底层管理人员
适用于联机交易等
联机分析处理,OLAP
OLAP是数据仓库系统的主要应用
适用于决策人员和高级管理人员
数据仓库和数据挖掘
为了实现信息检索和数据分析, 将多个数据库或数据源组合成一个大的数据库
数据挖掘
分类:根据共同的相似性对数据分组
可能性:标识数据之间的相互依赖关系, 并将可能性应用与他们之间的关系
统计:标识数据元素之间的关系,并使用规则发现
系统开发安全
项目启动
明确需求,确定产品的基本安全目标
风险分析评估,评估威胁和脆弱性, 估计不同安全对策的成本/收益比
风险管理
风险分析
功能设计分析和规划
安全需求
系统或应用程序的功能需求
标准和指导原则
出口限制
数据的敏感度级别
相关的安全策略
成本/收益分析结果
达到目标所需的保护级别
系统详细设计
用于描述用户需求和系统内部行为的工具
软件需求
信息模型
规定被处理信息的类型以及处理方式
如病毒特征、被修改的系统文件、关键文件的检验一级病毒活动
功能模型
应用程序需要执行的任务和功能
行为模型
说明应用程序在特定事务处理发生 过程中和发生之后的状态
设计
数据设计
抽取数据设计和信息模型数据, 转换为数据结构
体系结构设计
定义了主要结构和应用程序组件之间的关系
过程设计
将结构化组件转换为描述性过程
需要考虑的问题
后续阶段的工作分解结构(WBS)
产品的细节和实现产品的环境
产品的模块化合重用问题
软件开发
测试类型
单元测试
验证数据结构、逻辑和边界条件
集成测试
验证组件是否按照设计规范中协同工作
验收测试
确保代码满足客户的需求
回归测试
进行系统变更后会从新测试,以 确保功能性、性能和保护级别
功能测试
性能测试
环境分离,职责分离
验证 (verification)
确保满足了产品规范
确认 (validation)
确保项目的主要目标得到满足
安装/实现
着重于如何使用和操作开发好的系统或应用程序
认证 (Certification)
对一个IT系统的技术和非技术安全特性以及其 防护措施安全评价,衡量特定设计和实施满足 一套规定的安全需求的程度,位认可过程提供支持。
一个检查和评估安全控制的过程
外部独立的检查机构执行
鉴定或认可 (Accreditation)
权威机构正式声明,某个IT系统已经得到批准,能 够运行于特定的安全模式,该安全模式采用了满足可接受 风险等级的一套规定的安全措施
管理层对系统的获赠是认可
对风险的明确接受
运作/维护
正确配置安全环境
持续进行脆弱性测试,监控系统活动和审计事件
如果发生重大变更执行风险评估, 并执行认证和鉴定过程
处理
根据数据敏感程度,销毁数据。
销毁方法
重写
消磁
物理破坏
事后回顾
经验教训总结
应用开发关注点
架构模式
三层架构
用户
前端
复杂中间件
数据仓库
错误跟踪和安全功能
客户端/服务器
客户端:用户接口,本地数据库操作、通信机制
服务器:执行和处理数据请求,返回结果
浏览器/服务器
环境控制V应用控制
多种控制手段的平衡
理解环境控制和应用控制的界限
安全性V功能性
软件功能和安全手段的平衡
功能需求、安全需求和安全机制的平衡
安全性V用户体验
通常成反比
安全功能V配置安全
默认安装无法保证安全性
配置安全未启用(应该默认拒绝访问)
未遵循最小安装原则
后期补丁安装
软件开发方法
软件开发模型
瀑布模型(waterfall)
Subtopic
螺旋模型
结构化编程开发
迭代开发
改进原型模型
探索模型
联合分析开发
快速应用开发
重用模型
净室
组件型开发
极限编程
变更和配置管理
安全设计方法
威胁建模
攻击面最小化分析
净化输入输出
Subtopic
安全开发方法
安全代码检查
安全编码规划
代码静态分析
安全测试方法
模糊测试
渗透测试
代码扫描
能力成熟度模型
初始
可重复
定义
管理
优化
3,4级是一个分水岭
补丁管理
基础设置
研究
MD5比较指纹和数字签名
文件完整性检查
评估和测试
测试环境中测试补丁
缓解(“回滚”)
部署(“首次展示”)
现在不太关键的系统上部署
确证、报告和日志记录
补丁更新日志,记录存档
防病毒软件
特征性检测法
启发式检测
可疑性计数器
有的防病毒软件可疑创建一个沙盒, 动态分析可疑代码
分类:
审查一段代码有关的信息称为静态分析法
允许一部分代码在虚拟机中运行则称为动态分析法
免疫程序
针对某种病毒,使其认为已被感染。
行为阻止器
Subtopic
防病毒程序
通过行政、物理和技术方法来防止病毒
威胁
缓冲区溢出 (Buffer Overflow)
隐蔽通道 Convert Channel
计时(timing)
存储(storage)
内存重用/对象重用 (Memory reuse/Object reuse )
社会工程学
Trapdoor/Backdoor
欺骗攻击 (spoofing attack)
web安全
故意破坏
用修改过的图片和标题替换核发图片和标题
认知及现实
金融欺诈
虚拟环境下的服务和交易的欺骗
特权访问
限制特权用户的访问
盗窃交易信息
盗窃知识产权
拒绝服务攻击
特定安全
信息收集
管理接口
身份验证与访问控制
配置管理
输入确认
参数确认
会话管理
移动代码
java applet
java语言由字节码构成,java虚拟机 将其转换成机器能够识别的机器码。
applet在沙箱
ActiveX控件
僵尸网络
僵尸程序是一种恶意软件,是一段潜伏 的代码,也成僵尸
病毒
特点:繁殖和破坏,需要宿主
宏病毒
引导区病毒
可以删除引导区的数据或重新引导区
压缩病毒
自身附加在可执行程序上,并使用用户的权限进行压缩
隐蔽性病毒
隐藏他对文件盒引导记录所做的修改
变形病毒
制作变化的,但仍然可用的自身副本
通过噪声或伪造指令,变异引擎和随机数 生成器来改变指令顺序,逃避检测
分体病毒
同时感染硬盘引导区和可执行文件
自乱病毒
通过打乱自身代码来逃避防病毒软件检测
脚本病毒
隧道病毒
将自己安装在防病毒程序下,杀毒软件 检测病毒时,七拦截这个调用
蠕虫
可以不需要宿主进行自我复制
通过邮件、web站点下载等方式传播
逻辑炸弹
特定事件发生时,逻辑炸弹被执行
特洛伊木马
一种伪装成另外一个程序的程序
rootkit
垃圾邮件检测
贝叶斯过滤
拒绝服务攻击
特点
消耗受害者的网络带宽
消耗受害者的资源
分类
smurf攻击
利用ICMP协议的缺陷
fraggle攻击
利用UDP协议的缺陷
smurf和farggle是两种利用协议缺陷和 使用放大网络发动DoS的例子
SYN洪泛攻击
利用TCP连接的三次握手
泪滴攻击
利用发送很小的分片包来利用这个设计缺陷
分布式拒绝服务攻击
应用程序开发方法
结构化程序设计
自顶向下的分析设计; 自底向上的逐步实施
面向用户的观点,严格区分工作阶段
缺点:开发周期长、开发过程繁琐和复杂 审计比较较困难,用户交流不直观
面向对象程序设计
类 类(Class)定义了一件事物的抽象特点。通常来说,类定义了事物的属性和它可以做到的(它的行为)。举例来说,“狗”这个类会包含狗的一切基础特征,例如它的孕育、毛皮颜色和吠叫的能力。类可以为程序提供模版和结构。一个类的方法和属性被称为“成员”。 我们来看一段伪代码: 类 狗 开始 私有成员: 孕育: 毛皮颜色: 公有成员: 吠叫(): 结束 在这串代码中,我们声明了一个类,这个类具有一些狗的基本特征。关于公有成员和私有成员,请参见下面的继承性一节。 对象 对象(Object)是类的实例。例如,“狗”这个类列举狗的特点,从而使这个类定义了世界上所有的狗。而莱丝这个对象则是一条具体的狗,它的属性也是具体的。狗有皮毛颜色,而莱丝的皮毛颜色是棕白色的。因此,莱丝就是狗这个类的一个实例。一个具体对象属性的值被称作它的“状态”。(系统给对象分配内存空间,而不会给类分配内存空间,这很好理解,类是抽象的系统不可能给抽象的东西分配空间,对象是具体的) 假设我们已经在上面定义了狗这个类,我们就可以用这个类来定义对象: 定义莱丝是狗 莱丝.毛皮颜色:=棕白色 莱丝.吠叫() 我们无法让狗这个类去吠叫,但是我们可以让对象“莱丝”去吠叫,正如狗可以吠叫,但没有具体的狗就无法吠叫。 方法(秩序;条例) 方法(Method,可看成能力)是定义一个类可以做的,但不一定会去做的事。作为一条狗,莱丝是会叫的,因此“吠叫()”就是它的一个方法。与此同时,它可能还会有其它方法,例如“坐下()”,或者“吃()”。 对一个具体对象的方法进行调用并不影响其它对象,正如所有的狗都会叫,但是你让一条狗叫不代表所有的狗都叫。 如下例: 定义莱丝是狗 定义泰尔是狗 莱丝.吠叫() 则泰尔是会叫——但没有吠叫,因为这里的吠叫只是对对象“莱丝”进行的。 消息传递 一个对象通过接受消息、处理消息、传出消息或使用其他类的方法来实现一定功能,这叫做消息传递机制(Message Passing)。 继承 继承性(Inheritance)是指,在某种情况下,一个类会有“子类”。子类比原本的类(称为父类)要更加具体化,例如,“狗”这个类可能会有它的子类“牧羊犬”和“吉娃娃犬”。在这种情况下,“莱丝”可能就是牧羊犬的一个实例。子类会继承父类的属性和行为,并且也可包含它们自己的。我们假设“狗”这个类有一个方法叫做“吠叫()”和一个属性叫做“毛皮颜色”。它的子类(前例中的牧羊犬和吉娃娃犬)会继承这些成员。这意味着程序员只需要将相同的代码写一次。 在伪代码中我们可以这样写: 类牧羊犬:继承狗 定义莱丝是牧羊犬 莱丝.吠叫() /* 注意这里调用的是狗这个类的吠叫方法。 */ 回到前面的例子,“牧羊犬”这个类可以继承“毛皮颜色”这个属性,并指定其为棕白色。而“吉娃娃犬”则可以继承“吠叫()”这个方法,并指定它的音调高于平常。子类也可以加入新的成员,例如,“吉娃娃犬”这个类可以加入一个方法叫做“颤抖()”。设若用“牧羊犬”这个类定义了一个实例“莱丝”,那么莱丝就不会颤抖,因为这个方法是属于吉娃娃犬的,而非牧羊犬。事实上,我们可以把继承理解为“是”。例如,莱丝“是”牧羊犬,牧羊犬“是”狗。因此,莱丝既得到了牧羊犬的属性,又继承了狗的属性。 我们来看伪代码: 类吉娃娃犬:继承狗 开始 公有成员: 颤抖() 结束 类牧羊犬:继承狗 定义莱丝是牧羊犬 莱丝.颤抖() /* 错误:颤抖是吉娃娃犬的成员方法。 */ 当一个类从多个父类继承时,我们称之为“多重继承”。多重继承并不总是被支持的,因为它很难理解,又很难被好好使用。 封装性 具备封装性(Encapsulation)的面向对象程序设计隐藏了某一方法的具体执行步骤,取而代之的是通过消息传递机制传送消息给它。因此,举例来说,“狗”这个类有“吠叫()”的方法,这一方法定义了狗具体该通过什么方法吠叫。但是,莱丝的朋友蒂米并不需要知道它到底如何吠叫。 从实例来看: /* 一个面向过程的程序会这样写: */ 定义莱丝 莱丝.设置音调(5) 莱丝.吸气() 莱丝.吐气() /* 而当狗的吠叫被封装到类中,任何人都可以简单地使用: */ 定义莱丝是狗 莱丝.吠叫() 封装是通过限制只有特定类的实例可以访问这一特定类的成员,而它们通常利用接口实现消息的传入传出。举个例子,接口能确保幼犬这一特征只能被赋予狗这一类。通常来说,成员会依它们的访问权限被分为3种:公有成员、私有成员以及保护成员。有些语言更进一步:Java可以限制同一包内不同类的访问;C#和VB.NET保留了为类的成员聚集准备的关键字:internal(C#)和Friend(VB.NET);Eiffel语言则可以让用户指定哪个类可以访问所有成员。 多态 多态(Polymorphism)是指由继承而产生的相关的不同的类,其对象对同一消息会做出不同的响应。[2]举例来说,狗和鸡都有“叫()”这一方法,但是调用狗的“叫()”,狗会吠叫;调用鸡的“叫()”,鸡则会啼叫。 我们将它体现在伪代码上: 类狗 开始 公有成员: 叫() 开始 吠叫() 结束 结束 类鸡 开始 公有成员: 叫() 开始 啼叫() 结束 结束 定义莱丝是狗 定义鲁斯特是鸡 莱丝.叫() 鲁斯特.叫() 这样,同样是叫,莱丝和鲁斯特做出的反应将大不相同。多态性的概念可以用在运算符重载上,本文不再赘述。 抽象性 抽象(Abstraction)是简化复杂的现实问题的途径,它可以为具体问题找到最恰当的类定义,并且可以在最恰当的继承级别解释问题。举例说明,莱丝在大多数时候都被当作一条狗,但是如果想要让它做牧羊犬做的事,你完全可以调用牧羊犬的方法。如果狗这个类还有动物的父类,那么你完全可以视莱丝为一个动物。
采用类和对象两部分组成
类 (Class)
类(Class)定义了一件事物的抽象特点
类定义了事物的属性和它可以做到的(它的行为)
一个类的方法和属性被称为“成员”
对象 (Object)
对象(Object)是类的实例。
系统给对象分配内存空间,而不会给类分配内存空间; 类是抽象的,系统不可能给抽象的东西分配空间,对象是具体的
对象=属性+方法
属性:
描述了对象的结构和状态特征
方法:
对象能够执行的功能或过程
对象间通信的方法:消息传递
多态性 (polymorphism)
封装最简单的理解就是包装,指隐藏对象的属性和实现细节, 仅仅对外公开接口,即对象的内部状态对外界是透明的。
封装性 (Encapsulation)
意味着将对象信息隐藏
公有成员
私有成员
继承 (inheritance)
是一种由已存在的类创建一个或多个子类型的机制.
软件体系结构
数据结构
对数据元素之间逻辑关系的表示
标量
链表
层次树
聚合和耦合
内聚
反应某个模块能够执行多少种不同类型的任务
内聚越高,就越容易对其进行更新和修改, 而不会影响到与其它交互的其他模块
耦合
一个模块执行任务时需要进行多少交互
低耦合更加容易重复使用,修改时也不会影响其他模块
分布式计算
通用对象请求代理体系结构 (COMBA)
微软COM模型
EJB
专家系统
基于规则的编程
规则基于if-then逻辑单元
组成
推理机
推理机提供用户界面、外部文件、计划和程序访问能力
知识库
知识库包含特定问题或者领域相关的数据
专家系统通常呗IDS用于自动审查安全日志
人工神经网络
基于人脑神经结构的电子模型
大脑以模式的形式存储信息
ANN具有学习能力
当学习到某个事物并经常使用时, 到信息存储单元的连接路径就会加强
直觉很难用电子电路或逻辑门复制
模糊逻辑和其他数学定律被用于直觉、预告和只能猜测
神经网络被设定位拥有决策和学习能力, 通过大量的试探和错误决策过程改善其功能
模糊数学最有效的应用例子是故事预测、保险和金融风险评估。 它们需要从金融专家那里得到大量的变量和决策信息