只接受发布货源信息,不可发布违法信息,一旦发现永久封号,欢迎向我们举报!
1064879863


软件开发安全

发布时间:2019-10-12 17:55:30  来源:网友自行发布(如侵权请联系本站立刻删除)  浏览:   【】【】【
1 创建好的代码质量在某种意义上来说意味着适用性。质量指的是某事物能否满足其预期使用目标。代码审查和接口测试是确保安全质量的关键。滥用案例监测,其目标是让我们确定对手可能试图破坏代码的方式,然后找出可
软件开发安全

1 创建好的代码

质量在某种意义上来说意味着适用性。质量指的是某事物能否满足其预期使用目标。

代码审查和接口测试是确保安全质量的关键。滥用案例监测,其目标是让我们确定对手可能试图破坏代码的方式,然后找出可阻止他们的控制措施。

在开发的不同阶段,进行多种威胁模型和风险的分析。目标是降低脆弱性和系统破损的可能性。

理解应用程序的安全需求,实现正确的安全控制和安全机制,彻底测试这些安全机制以及他们在应用程序中的集成方式,遵循结构化开发方法,提供安全可靠的分发方法。

2 何处需要安全

满足安全性的困难在于:在安全编码方面,传统的编程人员并没有受到良好教育;操作系统和应用程序从一开始就没有建立在安全的架构只上;软件开发过程也不是面向安全的;在事后再集成安全使得开发过程困难重重。

2.1 不同的环境需要不同的安全

需要开发客户前端、复杂的中间件和位于第三层的数据仓库,并且它们必须无缝集成在一起配合工作。

2.2 环境与应用程序

主要依赖操作系统控制的一个弱点是:尽管操作系统可以控制主体对不同客体的访问,限制主体在系统内的动作,但对应用程序内部的主体却不一定能进行这样的控制。如果应用程序自己的编程代码中存在一个安全威胁,那么操作系统很难预测或者控制这个脆弱性。

尽管应用程序可通过限制输入数据类型或者不允许特定用户查看保存在数据库敏感字段中的数据来保护数据的安全,但是并不能阻止用户在地址协议解析(ARP)表中插入伪造的数据,这是操作系统及其网络栈的责任。操作系统和应用程序控制具有它们的用途和限制。窍门在于,找出一种控制在何处停止作用,从而使另一种控制能够接过保证安全的接力棒。

每种途径都需要遵循系统的方法,充分考虑到每种可能的场景,并进行测试以提供更深的保证级别。重要的是,每个模块都能独立地测试,并与其他模块一致。这种级别的理解和测试将通过捕捉可能被利用的弱点而使产品更加安全。

认证(certification)出于认可的目的而对安全组件及其一致性进行全面的技术评估。一个认证过程可以使用防护措施评估、风险分析、验证、测试和审计技术来估计特定系统的适用性。

认可(accreditation)是管理层对系统整体安全和功能的充分性的正式认定。认证信息提交给管理层或者负责部门,由管理层未提问、复查报告和裁定结果,并且决定产品是否可以接受,以及是否需要采取任何修正措施。

认证是评定安全机制和评估安全效果的一种技术性审查,认可是管理层正式接受认证过程中的调查结果。

Accreditation鉴证(认可):管理层决定是否接收风险

认可是在SDLC哪个阶段结束后完成?at the end of,指在末期)实施(认可之后才可以上线)

2.3 功能与安全

2.4 实现和默认配置问题

当安全软件或者安全设备初始安装时,应该默认设置为“拒绝访问”。

在网络环境中,实现错误和错误配置是造成大量安全问题的常见原因。很多人并没有认识到在系统安装时启用了大量服务。这些服务为攻击者提供了攻击过程中可以使用的信息,甚至很多服务本身就是进入环境内部的一种手段。例如,NetBIOS服务含有很少的安全控制(如果有),这个服务可以被启用并允许在Windows环境中共享资源。

实现和安全中的另一个问题是存在大量未进行修补的系统。一旦发现安全问题,软件供应商会开发安全补丁来解决和修补这些安全漏洞。

添加安全补丁(或服务补丁)可能会对系统内的其他机制产生不利影响。在补丁正式应用到产品服务器和工作站之前, 应当测试补丁的这些活动,以帮助防止服务中断或影响到网络运行和员工生产。当然,首先从软件开发开始是减少补丁需求最好的办法,这是我们接下来要关注的问题。

3 软件开发生命周期

软件开发生命周期(SoftwareDevelopment Life Cycle,SDLC)

? 需求收集确定为什么创建软件、软件有什么功能和为谁开发。

? 设计解决软件将如何完成被封装进入功能设计中的既定目标。

? 开发编程软件代码以符合设计阶段的规定。

? 测试/验证验证软件,确保目标实现,软件按计划工作。

? 发布/维护部署软件,然后确保它得到正确配置、打补丁和监控。

3.1 项目管理

安全计划应当在项目开发之初制定并集成到功能计划中,以保证安全不被忽视。

安全计划和项目管理活动需要进行审计,以保证与安全相关的决定能被理解。当系统需求保证被确认时,就表明在生命周期的各个阶段和所有的过程、开发、决策中都已经考虑了安全因素,并且项目中发生的一切活动都将被审查。因此重要的一点是,反映系统或者产品如何建立和在环境中实现后如何运作的文档必须准确。

如果某个软件产品是为特定客户开发的,那么往往需要开发一个工作声明(Statement of Work,SOW),描述产品和客户的要求。详细的SOW将有助于开发人员正确理解需求,而不是靠假想和猜测行事。

工作分解结构(Work Breakdovm Structure,WBS)是一个项目管理工具,用来定义和有序分组项目的各工作单元。这是将项目故意分解为:目标是明确定义的可交付成果的任务和子任务。应该以WBS格式来描述SDLC,这样每个阶段都会得到妥善解决。

3.2 需求收集阶段

涉及的每个人都想方设法理解需要该项目的原因和该项目所涵盖的范围。或者某一具体客户需要一个新的应用程序,或者市场上需求这个产品。在这个阶段,团队收集软件需求和拟题功能,召开头脑风暴会议,审视明显的限制。

隐私影响评级(Privacy Impact Rating),指明可访问数据或者将要处理的数据的敏感级别。

? P1高度隐私风险:功能、产品或服务存储或者传输个人可识别信息(Personally Identifiable Information,PII);监控到用户正在不断传输匿名数据;更改设置或文件类型关联;安装软件。

? P2适度隐私风险:影响功能、产品或服务中的隐私的唯一行为是一次性的用户启动的匿名数据传输(比如用户点击了一个链接后去了另一个网站)。

? P3低度隐私风险:在功能、产品或者服务中没有影响隐私的行为存在。没有匿名或者个人数据在传输,计算机上没有存储着PII,没有人以用户的名义修改设置,没有软件被安装。

需要开发一个明确的风险级别验收标准来确保把减灾工作放在首位。风险级别是否可接受取决于安全和隐私评估结果。根据所评估的威胁和脆弱性来估计不同安全对策的成本/收益率。每个安全属性的级别都应该被关注到,这样对安全控制便会有一个明确的方向,在设计和开发阶段便可以遵循这个方向。

3.3 设计阶段

设计阶段是一个开始把理论用于实践的阶段。理论是前面阶段标识的所有需求,设计是让产品真正地实现这些需求。

软件设计阶段是用来描述需求和软件产品内部行为的一个过程。它把这两种元素联系在一起,以显示内部行为如何真正实现已定义的需求。

软件需求往往来自下面3种模型:

?信息模型规定要处理的信息类型和处理方式。

?功能模型概述应用程序需要执行的任务和功能。

?行为模型解释在具体事务处理发生过程中和发生之后应用程序的状态。

从安全角度讲,下列事项也应该在设计阶段完成:

?攻击面分析

?威胁建模

攻击面是攻击者用来攻击产品的地方。开发团队应该尽可能多地减少攻击面,因为软件的攻击面越大,攻击者的进入途径越多,破坏成功的可能性因而越大。

攻击面分析的目的是识别和减少可以被不可信用户访问的代码和功能的数量。减少攻击面的基本策略是减少运行代码的数量、减少不可信用户可用的进入点、尽可能多地降低权限级别和删除不必要的服务。攻击面分析通常是通过专门工具来对产品的不同部分进行列举并把结果汇总成一个数值。攻击面分析仪仔细检查文件、注册表键、内存数据、会话信息、进程和服务细节。

威胁建模,它是了解不同威胁如何实现、破坏如何成功进行的系统方法。

软件开发团队往往会画威胁树,这个工具可让开发人员了解特定威胁实现的所有方式,有助于他们掌握应该实施哪些类型的安全控制措施,从而消除与每种威胁相关的风险。

3.4 开发阶段

开发阶段,编程人员将深度介入。设计阶段创建的软件设计被拆分成己定义的可交付物,编程人员开发代码来满足这些可交付物的需求。

编程人员可以使用多种计算机辅助软件工程(Computer Aided SoftwareEngineering,CASE)工具来生成代码、测试软件和进行调试活动。用自动化工具来从事这类活动时,开发工作通常迅速且错误少。

MITRE组织的常见漏洞枚举(CWE)计划被称为“社区开发的软件漏洞类型词典”,维护了最危险的软件漏洞列表。

对SQL命令中使用的特定元素处理不当(SQL注入)

对OS命令中使用的特定元素处理不当(操作系统命令注入)

在没有检测输入大小的情况下复制缓冲区(经典的缓冲区溢出)

网页生成过程中输入处理不当(跨平台脚本攻击)

缺少关键功能的验证

缺少授权

使用硬编码的证书

缺少对敏感数据的加密

对危险类型文件的上传不加限制

在安全决策中信赖不可信的输入

用不必要的权限执行

跨站请求伪造(CSRF)

不当地将路径名限制为受限的目录(路径穿透)

下载代码却不进行完整性检查

不正确授权

包括来自不被信任控制的功能

对重要的资源赋权不当

使用潜在危险的功能

使用被破解或者有风险的加密算法

缓冲区大小计算不正确

不恰当的限制过度认证尝试

重定向到不受信任站点的URL(开放重定向)

不受控制的格式字符串

整型溢出和环绕

使用不带Salt的单向散列

许多软件问题直接是由不恰当的或者错误的编程实践导致。在要解决的问题中,编程人员需要检查输入长度,以防发生缓冲区溢出:检查代码,防止隐蔽通道的出现:检查适当的数据类型,确保检查点不会被用户绕过:核查句法和核实校验。应该演练不同的攻击场景,研究代码被未授权攻击(或者修改)的方式是什么。同行开发人员应该进行代码审核和调试,一切都应该清楚地记录下来。

输入验证是详细审查的一个极重要的领域。不适当的验证会造成严重漏洞。缓冲区溢出是个典型的技术示例,这个技术就是使用了不适当的输入验证。当太多数据被输入到特定程序中时,就会产生缓冲区溢出。通过将任意数据放入不同的储存段,并在特定内存地址中插入一组精心设计的恶意指令,程序的储存缓冲区就会溢出。

缓冲区溢出也会导致特权提升。特权提升是开发程序或配置设置的过程,以获取程序或其用户通常无法使用的资源。例如,攻击者可攻击普通用户的账户并升级其特权,以便在那台计算机上获取管理员甚至系统特权。这种攻击通常利用用户程序和设备驱动程序以及底层操作系统之间的复杂相互作用。结合输入验证以及配置系统以最小权限运行,有助于降低权限升级的威胁。

静态分析(Static analysis)是一种调试技术,在不执行程序的情况下检查代码,因此在程序被压缩之前进行。静态分析一词通常指辅助编程人员和开发人员的自动化工具,而人工所做的检查通常称为代码审核。

静态代码分析从不暴露逻辑错误和设计缺陷,因此必须与人工代码审核结合使用,确保进行透彻的评估。

3.5 测试/验收阶段

成熟的开发者会在他们开始编码前,为模块开发单元测试,或者至少在编码的同时进行。这种方法被称为测试驱动开发(test driven developme),这样就会产生更高质量的代码和明显更少的漏洞。

单元测试目的是模拟一个范围的输入来验证哪些代码可能会被利用。这些输入的范围包括常规预期、意外以及故意恶意输入。这样做的目的是确保代码始终以预期和安全的方式运行。一旦完成一个模块及其单元测试,单元测试(通常在自动化框架中)就在该代码上运行。这种类型的测试目标是隔离软件的各个部分,并证明每个部分都是正确的。

单元测试通常贯穿于整个开发阶段。正式测试应当由完全不同于开发人员的另一组人员进行。这是职责分离的一个示例。编程人员应当不能包揽软件的开发、测试和发布。越多的人检查代码和进行测试,在软件发布之前发现软件缺陷的机会就越大。

职责分离,不同的环境类型(开发、测试和生产)应当被正确分离,并且功能性和操作不应该重叠。开发人员不应访问生产过程中使用的代码。代码必须经过测试,提交到代码库,然后发送至生产环境。

? 单元测试 个体组件位于一个受控的环境中,编程人员在这里确认数据结构、逻辑和边界条件。

? 集成测试 验证组件是否按设计规范中概述的那样协同工作。

? 验收测试 确保代码满足客户的需求。

? 回归测试 进行系统变更后重新测试,以确保功能性、性能和保护级别。

一个全面的安全测试包括手动测试和自动化测试。自动化测试有助于定位通常由于粗心或者与错误代码实现有关的大量缺陷。自动化测试通常使用的程序有模糊器、脆弱性扫描仪和代码扫描仪。模糊器使用复杂的输入来削弱程序执行。

模糊指发送随机数据到目标程序从而触发故障的行为。攻击者接下来会利用这些错误和缺陷,把他们自己的代码注入系统中来破坏它的安全性和稳定性。模糊工具往往可以成功识别缓冲区溢出、DoS脆弱性、注入弱点和验证缺陷以及一些其他能造成软件卡死、崩溃或投放意外错误的活动。

手动测试用来分析程序中需要人凭直觉和通常使用计算机技术才能判断的一些方面。测试者也是试图寻找设计缺陷。其中包括逻辑错误,攻击者可通过使用精心制作的程序序列来访问较大权限或者绕过身份验证机制来操作程序流。手动测试是由以安全为中心任务的编程人员进行代码审计,他尝试使用流氓输入和逆向工程技术来修改逻辑程序结构。手动测试模拟真实攻击中出现的场景。有些手动测试也使用社会功能来分析那些可能导致系统破损的人类弱点。

动态分析指对程序进行实时评估,如在它运行时。一旦程序完成了静态分析且基本的编程缺陷被处理掉之后,便开始进行动态分析。动态分析支持开发人员跟踪软件中可能引起安全混乱的细微的逻辑错误。这种技术的主要好处是它无须创建人为导致错误的场景。动态分析也适用于进行兼容性测试、探测存储器泄露和识别依赖、关系,它无须访问软件真正的源代码便可以对软件进行分析。

在这个阶段,测试过程中发现的问题以问题报告的形式传达给开发团队。开发人员解决问题并对程序重新测试。这是一个持续不断的过程,直到人人满意,产品可以投入生产。如果是具体客户,那么他会对产品进行一系列测试后才正式接受该产品。如果是通用客户,那各种潜在客户和机构会对产品进行beta测试。然后产品才会正式投放到市场或者交付给客户。

开发人员会在产品中植入几行代码,以允许他们简单地按几个键就可以进入应用程序。这使得他们能绕过任何安全和访问控制机制,从而快速进入应用程序的代码。这称为“后门”或“维护挂钩”,在代码产品化后应当去除。

3.6 发布/维护阶段

验证和确认

验证(verification)判断产品是否准确体现和满足了产品规范。毕竟,开发出来的产品有可能与初始规范不匹配。这一步骤能确保正确满足了规范。

确认(validation)判断产品是否为所针对的实际问题提供了必要的解决方案。在大型项目中,大方向往往很容易被忽略。这一步能确保项目的主要目标得到了满足。

零日漏洞是目前还没有找到解决方案的漏洞。如果发现了一个脆弱性,且预先没有修补方式(补丁、配置和升级),就被成为是零日漏洞。

SDLC软件开发生命周期的主要阶段及其具体安全任务如下:

需求收集:安全风险评估;隐私权风险评估;可接受的危险级;信息、功能和行为需求。

设计:攻击面分析;威胁建模

开发:自动化CASE工具;静态分析

测试/验证:动态分析;模糊;人工测试;单元、集成、接受和回归测试;

发布/维护:最终安全审核

4 安全软件开发最佳实践

十大web应用安全风险列表:

? Al: 注入

? A2: 无效的认证和会话管理

? A3: 跨站脚本攻击(XSS)

? A4: 不安全的直接对象引用

? A5: 安全配置错误

? A6: 敏感数据泄露

? A7: 功能级权限控制缺失

? AS: 跨站请求伪造(CSRF)

? A9: 使用已知安全隐患组件

? AIO: 未经验证的重定向和转发

5 软件开发模型

5.1 边做边改模型

这不是一个保证质量的主动方法,却是问题出现后处理时的一般做法。这个模型无法正确评估过程、质量或风险,很多次发现问题后就需要一个重要的设计翻修,因为事情在一开始就没有正确地考虑并计划过。虽然用这种方法让软件产品能够尽快销售出去,但解决问题所涉及的费用,在产品发布后仍会继续增加。

5.2 瀑布模型

在这种模型下,所有需求都要在初始阶段收集,但如果越来越多的信息可用或需求发生变化,这种模型没有正式的方式能够集成变化。

对于较小的项目而且能够充分理解需求的情况,这种十分严谨的方法会比较适用,但对于复杂的项目,这是一种危险的模型,因为这种项目通常包含许多变量,它们将影响项目是否能够继续。

5.3 V形模型(V模型)

V形模型是在瀑布模型后开发的。在软件开发过程中不再按照平面的线性方法,而是遵循V型格式的步骤,这种模型强调产品在每个阶段进行验证和确认,并为每个编码阶段实施提供了正式的开发测试计划。

V形模型就像瀑布模型一样,仍是非常严格的。这种程度的严格水平不允许有更多的灵活性,因此变更依旧很困难,变更成本也很高。这个模型不允许并行处理事件,它没有整合迭代环节。也没有像后面的模型那样包含风险分析活动。这种模型适用于前期可以理解所有需求而且变更范围很小的场合。

5.4 原型模型

在投入大量时间和资源之前,可以开发软件代码的样品或模型(原型)来探索特定问题的解决之道。如果一个团队使用原型开展工作,将可以标识可用性和设计上的问题,并能根据需要调整工作方法。在软件开发行业有3个主要的原型模型己经被发明和普及。它们是快速原型、演化原型和运行原型。

快速原型的特点是让开发团队快速设计原型(样品),进而验证当前对项目需求理解的正确性。在一个软件开发项目中,团队可以快速开发出原型,看看想法是否可行,看看他们是否应该按照目前的解决方案继续前行。快速原型方法(也称为抛弃型)是一个“应急”方法,它创建一段代码,判断每个人是否都在正确的轨道上或者是否应该开发另一种解决方案。快速原型的开发不是用来组建产品的,而是在完成服务目的后被丢弃的。

演化原型开发的目标是渐进式改进。不像快速原型方法那样开发完原型后将其抛弃,演化原型方法中的原型将持续改进,直至达到最后的产品阶段。每个开发阶段获得到的反馈都用来改进原型,逐渐实现客户的需求。

运行原型是演化原型方法的延伸。当收集到更多的反馈数据时,使用这两个模型(运行型与演化型)方法都能提高原型的质量,但是运行原型被设计为微调后即可安装在生产环境中。在收集到客户反馈后就可对运行原型进行升级,而且软件变更都发生在工作场所。

因此,快速原型的开发是为了能够快速理解建议性的解决方案,演化型原型是在实验室环境中创建和改进的,而运行型原型是在生产环境中开发和改进的。

5.5 增量模型

这种模型的好处是,在早期开发阶段,该软件就可以使用:该模型的灵活性允许变更出现:因为需要在每次迭代后进行测试,所以测试环节发现问题的速度比瀑布模型要快很多,每次迭代都是一个易于管理的里程碑。

由于每个发行版都提交了一个可运行的产品,所以客户可对每个版本进行反馈建议并帮助开发团队进一步完善。由于最初的产品能比其他模型实现更快速地交付,所以最初的产品交付成本将比较低,客户也能更早地获得其功能罗关键变更的导入风险也会降低。

当涉及风险、程序复杂性、资金和功能需求的问题,且需要在产品开发周期早期阶段考虑时,最好使用这种模型。如果供应商需要在产品开发阶段迅速给客户提供一些基本的功能,这就是一个可以遵循的良好模型。

5.6 螺旋模型

螺旋模型使用了一个迭代方法来开发软件并把重点放在风险分析上。该模型由4个主要阶段组成:计划、风险分析、开发和测试、评估。开发团队从最初的需求出发,经历每个阶段。设想在此图形的中心处启动一个软件开发项目。你获取初步认识和项目需求,设计开发说明书映射这些需求,开展风险分析,构建原型说明书,验证你的说明书,建立一个开发计划,整合新获取的信息,使用新信息开展新的风险分析,创建原型,测试原型,集成结果数据到过程中等。采集到更多的项目信息时,就会将它集成到风险分析过程中,改进原型,测试原型,让每一步更加细化,直到有一个完整的产品。

螺旋模型的评估阶段允许客户评估其产品的当前状态并提供反馈,而反馈内容又成为下个螺旋活动的输入值。对于有动态需求的复杂项目来说,螺旋模型是一个好模型。

角度代表进步,螺旋半径代表成本。

5.7 快速应用开发

快速应用开发模型结合了原型化方法和以加速软件开发过程为宗旨的迭代开发方法。为帮助定义软件要实现的最终结果,开发过程从创建数据模型和业务流程模型开始。通过使用原型设计,可改进数据和过程模型。模型提供输入能促进原型改进,原型的测试和评估又能使数据和过程模型得到改善。这些步骤的目标是要整合业务需求和技术设计说明,其中技术设计说明能在软件开发项目上提供方向。

RAD模型允许客户在开发阶段参与其中,目的在于最终结果能以更现实的方式满足他们的需求。

5.8 敏捷模型

敏捷模型是几种开发方法论的总称。它的重点不在严格的、线性的阶梯式过程上,而在增量和迭代的开发方法上,目的是促进跨部门的团队合作和持续的反馈机制。该模型相对于传统的“重量级”方法来说被认为是“轻量级”的,这意味着该模型并不局限于狭隘的视野和过于结构化的方法。它具有敏捷和灵活的特点,足以适应每个项目的需求。业界发现,即使一个详细定义的过程库都无法处理开发项目过程中出现的每种情形。因此,不再把时间和资源投入到前期大型设计分析中,这种模型关注的是根据业务需要的功能所创建的代码增量。

该模型着重于个体互动而非过程和工具。它强调开发正确的软件产品,其关注度胜过全面且费力的文档。它促进客户协作而不是合同谈判,它重在应变能力提升而非严格执行计划。

通过允许在明确规定的点添加、变更或删除产品功能,敏捷开发方法允许项目重置。由于客户密切参与了开发过程,则不应该有意外、成本超支或进度延误。这使得产品可以迭代开发,甚至在开发过程中进行变更。

转变点出现在每次冲刺的最后阶段,冲刺是指固定期限的开发间隔,通常(但不总是)长达两周并且承诺产出一组非常特别的功能。这些功能由团队进行挑选,但有大量的客户输入。有一个随时增加功能的程序,即在功能储备中进行插入。然而,在新的冲刺开始时,只有实际工作可考虑使用这些功能。这使开发小组在冲刺过程中无法变更,但在每两次冲刺间可进行变更。

极限编程(简称XP)是一种开发方法,它通过使代码不断相互替换来进行代码审查,并达到极限(因此得名)。这些不间断的代码审查是通过一种称为结对编程的方法来完成的,运用这种方法,程序员会把代码交给她的伙伴,再由伙伴来输入代码。虽然这看起来效率不高,但能使两个程序员都检查正在输入的代码。结果表明,这种方法显著减少了错误的发生率,提高了代码的整体质量。

XP的另一个特征是依赖于测试开发代码,其中单元测试是在开发代码之前编写的。程序员首先编写一个新的单元测试案例,当然,因为没有适合的代码它必然是失败的。下一步是添加足够的代码来让测试通过。在这一步完成后,就写入下一个测试,当然它也会失败,周而复始。其结果是,只有通过测试所需的最小代码量才被开发出来。这种极限最小化的方法减少了错误的发生率,因为它消除了复杂性。

看板开发技术是强调所有任务的视觉跟踪,以便团队知道在什么时间点应优先完成什么任务,从而及时开发出正确的产品。

看板墙通常按生产阶段纵向划分。典型的列被标记为计划中的、正在进行的和完成的。每个便签都可在开发过程中体现用户体验,但更重要的是,便签还可提示其他一些需要完成的工作。例如,假设其中一个用户体验是本节前面描述的搜索特性。在开发过程中,团队意识到搜索非常缓慢。这可能需要添加一个任务,用于更改底层数据或网络架构或升级硬件。然后将这个便签添加到计划的列中,并开始与其他任务的其余部分一起优先排序和跟踪。这个过程强调了看板管理如何使项目团队对变化或未知的需求做出反应,这是所有敏捷模型的共同特征之一。

5.9 其他模型

似乎在行业内SDLC和软件开发模型并不稀缺, 下面简单概括其他一些可用模型:

? 探索型模型 是一种在还没有明确定义项目目标的实例中使用的方法。该模型不关注明确的任务,而是依赖于一套最可能影响最终产品功能的规范。测试是探索式开发的重要组成部分,因为它能探明项目的当前阶段符合的实施场景。

? 联合分析开发(JAD) 在一个由工作组构成的环境中,采用团队协作的方法开展应用程序开发的方法。

? 重用模型 它是一个采用先进开发模型的近似软件开发的模型。可重复使用的程序通过逐渐修改先前的原型进化为客户要求的规格。由于重用模型不要求程序必须从头开始建立,因此它极大地降低了开发成本和时间。

? 净室模型 它是一种方法,试图通过结构化和形式化方法的开发和测试,以防止错误或失误。这种方法用于通过严格认证过程的高质量和关键应用程序。

6 集成产品开发团队

联合应用开发(JAD)方法是让用户全面加入到开发商的生产之中,与IPT团队协作。IPT通过确保正确的利益相关代表在每一个开发阶段都能成为正式的团队成员从而将概念延伸。此外,JAD的重点是涉及用户群体,而IPT是向内的,通常更注重企业的利益相关者。

IPT不是一种开发方法。相反,它是一种管理技术。当项目经理决定使用IPT,那么他们必须选择一个开发方法。近来,IPT经常与敏捷方法联系在一起。

解决这种摩擦的一个好的方法是:让开发人员和运营人员(称为DevOps)组成同一个软件开发团队。DevOps是将开发、IT、质量保证(QA)工作人员组成同一软件开发项目团队的实践,这将统一目标,提高效率,并减少对软件产品的依赖。

多功能集成使团队能及早发现潜在的缺陷、漏洞和摩擦点,以便主动解决它们。DevOps增加组织内部开发人员、IT人员及质检人员之间的相互信任度及工作满意度。毫无疑问,它也提高了项目经理的士气。

7 能力成熟度模型

能力成熟度模型集成(Capability Maturity ModelIntegration, CMMI)集成了一整套产品和软件开发指南。它涉及软件开发生命周期的不同阶段,包括概念定义、需求分析、设计、开发、集成、安装、操作、维护等阶段,以及每个阶段应该做什么。可以根据该模型来评估安全工程实践并标识改进方法。客户也可根据它来评估软件供应商,最理想的情况是二者结合,即软件供应商使用该模型提升流程,而客户使用该模型评估供应商的做法。

?初始 开发过程很随意,甚至非常混乱。该公司没有使用一个有效的管理流程和计划。没有一致性的保证,质量不可预测。

?可重复 正式的管理结构、变更控制和质量保证。该公司可以在不同项目中适当地重复一些过程。该公司并没有定义正式的过程模型。

?定义 有正式流程,其中描述和定义了在不同项目中的过程。该公司有方法对过程进行定量的改善。

?管理 公司有一个正式的过程,可收集和分析定性数据。度量被定义并提供给过程改善程序。

?优化 公可对持续改善过程有了预算和整体计划。

8 变更控制

变更控制是控制变化的过程,发生在系统的生命周期过程中,并能记录必要的变更控制活动。

变更必须获得批准、记录和测试。有些测试可能需要重新运行,以确保变更不影响产品的性能。当程序员变更源代码时,应该在测试版的代码上实施。程序员绝对不能变更己经部署在生产上的源代码。变更的代码应该经过测试,新代码需要放入到程序库中。生产线上的代码只能来源于程序库,绝对不能来源于一个程序员或直接来源于测试环境。

变更控制过程应该在系统审计时评估。组织可能会忽视一个变更引发的测试问题,因此在系统审计时需要检查变更控制实施和加强的流程。

变更控制过程应该在系统审计时评估。组织可能会忽视一个变更引发的测试问题,因此在系统审计时需要检查变更控制实施和加强的流程。

以下是一些必要的变更控制过程的步骤:

(1)为变更提出正式申请。

(2)分析这个申请。

A. 开发实现策略。

B. 计算实现成本。

C. 审查任何安全问题。

(3)记录变更申请。

(4)提交变更申请以获批准。

(5)开发变更。

A.重新编码产品程序段,并添加或删减功能。

B.将这些变更的代码链接到正式的变更控制申请中。

C.为测试和质量审核提交软件。

D.重复过程直到能够保障质量。

E.记录变更版本。

(6)报告结果给管理层。

系统的变更可能需要新一轮的认证和认可。如果系统发生重大变化,那么在功能方面和保护级别上可能需要重新评估(认证),管理层需要批示整个系统,其中包括新的变更(认可)。

8.1 软件配置管理

提供软件配置管理(SCM)的软件能标识不同时间点上软件的属性值,同时可执行条理化的变更管理,以便在整个软件开发生命周期内维护软件的完整性和溯源性。它定义了跟踪变更的需要,并提供了验证最终交付软件的能力,所有批准的变更都应该包含在发行版中。

版本管理主要跟踪文件版本问题,这使得文件“回滚”到先前版本成为可能。当在存储库中检索文件时,可为每一个文件制作归档副本,或者对文件所做的每一个变化都以事务日志方式保存起来。版本管理系统应该创建日志报告,其中包括谁做的变更,什么时间做的变更以及变更的是什么。

在软件托管服务框架中,第三方保存源代码的副本以及其他可能的材料,只有当特定的情况发生时,它才发布给客户,主要是开发代码的供应商倒闭了或由于某种原因不能履行其义务和责任时。这个过程能保护客户,这是因为客户为开发软件代码向供应商支付了费用,否则,如果供应商倒闭,客户将不再有机会访问到实际的代码。这意味着客户的代码永远不会被更新或适当地维护。

软件代码是供应商的知识产权。供应商雇佣了有相应技能的人,并支付给他们工资让其开发代码,如果供应商吧代码移交给客户,就是放弃了其知识产权和它的秘密。客户得到的是编译后的代码,而不是源代码。编译后的代码是已通过编译器处理的,人类无法读取它。大多数软件利润是以许可证为基础的,其中概述了哪些客户可使用编译后的代码。

堆栈溢出:可以执行任意代码

编写的程序经验证没有缓冲区溢出问题,但最终还是出现了缓冲区溢出,可能的原因:使用了插件plug-in或是调用了别的库

在软件开发中,安全保证(software assurance)人员的工作职责:提出保护什么、怎么保护、如何保护

安全系统项目开发团队必须要关注的是:组织机构不同,安全策略会不适用

外购应用程序可能存在的最大问题:拿不到源代码

保护丢失的智能手机数据不被窃取最有效方法:首选加密,没有加密的话选远程擦除

什么情况下会发生DOS攻击:远程访问日志

动态防火墙和静态防火墙的主要区别:能够区别新建连接和已建立连接

审计时发现不可信WiFi,应当:立即断开连接

能够代替防病毒软件的是:沙箱(沙盒)

测试冷站的有效性:桌面推演

人员权限评审至少一年一次

IDS配置时需要提升的:漏报和数据过载

大量请求发往DNS解析域名,同时很多错误的应答发往用户:DNS缓存中毒,DNS欺骗(DNSSpoofing)的一种。

对实物资产最好的保护:纵深防御(包括保安、CCTV、物理入侵检测、门禁、锁等多种控制措施)

数据报文(datagram)的源地址和目的地址是体现在OSI的哪一层:网络层

路由器通过物理控制:防未授权更改配置

准则(guideline,指南)是:灵活的;

规程(procedure)是:specific(具体的,详细的,特定的),规程变化频率最高

最常见的 XSS 跨站脚本攻击:反射型XSS

RBAC特点:方便业务使用

工控系统ICS软件过期的原因:很少停机,软件更新不了

8.2 代码库的安全性

代码库通常是版本控制系统。

它严重限制了开发团队可连接到代码的渠道。这也使得与外部方协作变得困难,开发人员也不得采用远程或动态的工作方式。

一个很好的替代方案是在内部网上运行存储库,这将要求开发人员要么在本地网络上,要么通过VPN进行连接。作为一个附加的安全层,存储库可以配置为:在安全壳(SSH)内使用,它将确保所有的流量都在内部网内加密,以减少被泄露的风险。最后,SSH可以配置为:使用公共密钥基础设施(PKI)接入,这不仅可以保证使用储存库时的保密性和完整性,还有不可否认性。如果你必须允许远程访问存储库。

9 编程语言和概念

编程语言有下列几种类型:机器语言、汇编语言以及高级语言。机器语言是计算机和处理器可以理解的语言,并且可以直接执行。每个处理器家族都有自己的机器代码指令集,机器代码用二进制形式(1和0)来表示,被认为是最原始的编程语言形式和第一代编程语言。

汇编语言(assembly language)被认为是一个低级编程语言,是机器级别指令的符号表示。它比机器语言高级一步。它使用符号(称为助记符)来表达复杂的二进制代码。使用汇编语言的编程语言能够使用ADD、PUSH、POP等命令来代替二进制代码。汇编语言大大缩短了编程和调试时间,引进了变量的概念,把编程人员从手动计算存储器地址的状况中解放出来。

用汇编语言编写的程序也是针对特定硬盘,所以一个为AMD处理器编写的程序与英特尔系统不兼容,因此这类语言不可移植。

高级语言(high level language)使用抽象陈述。抽象把多个汇编语言指令集归为一个高级语句,如IF-THEN-ELSE。这使编程人员可离开那些低级(系统架构)复杂的编程语言而直接关注编程目的。

用高级语言编写的代码可转化成机器语言,用于使用编译器和解释器的不同处理器架构上。但代码独立于任何一种特定处理器时,程序便是可移植的,可用于多种不同类型的系统中。

9.1 汇编程序、编译器和解释器

汇编程序(Assemblers)将汇编语言源代码翻译成机器代码。汇编语言包括处理器理解不了的记忆术,因此需要翻译成操作指令。

编译器(Compiler)把高级语言语句转换成所需的机器可理解的形式(.exe、.dll等),从而使特定处理器能够理解。编译器把指令从源语言(高级)转换为目标语言(机器),从而使得代码可被执行。

如果编程语言被认为是“可解释的”,那么工具解释器(interpreter)便最终把高级代码转换成机器代码。

在一个可解释的环境中执行程序的最大好处是平台独立性和内存管理功能的存在,这是解释器的好处。主要的缺点是该程序不能作为独立应用程序运行,需要解释器才能安装在本地计算机上。

垃圾收集是软件执行内存管理任务的一种自动方式。垃圾收集器识别曾被占用但现在不再被使用的内存块,回收并标记为空闲。它也收集零散内存块,并把它们合并成更大的块。它协助提供一个更稳定的环境,节省宝贵的内存空间。如果垃圾收集工作不正确进行,不仅不能保证内存被有效利用,而且使得攻击者可进行拒绝服务攻击,从而人为地使所有系统内存不能正常工作。

9.2 面向对象概念

软件开发通常使用传统的输入-处理-输出方法,它使用由层次信息结构而来的信息流模型,数据被输入程序,程序将数据从开头传递至结束,执行逻辑过程,并返回结果。

面向对象的编程(OOP)方法执行相同的功能性,不过以一种更有效的方式使用不同的技术。首先,我们需要理解OOP的基本概念。

对象是一个类的实例。

· 模块化 自治对象,通过交换消息进行合作。

· 延迟承诺 不需要改变系统的其他部分,即可重新定义一个对象的内部组件。

· 可重用性 通过继承完善类。其他使用相同对象的程序。

· 自然性 面向对象的分析、设计和建模与业务需求和解决方案相对应。

对象封装了属性值,这也就意味着信息被包装,以对象名的形式被其他对象视为一个整体进行重用。对象之间需要能够互相通信,这通过使用传递到接收对象的API的消息完成。

一个对象可以由公共部分和私有部分组成。对象的公共部分是对象与其他组件交互的接口(API)。消息通过这个接口进入对象,并指明要执行的操作请求或方法。对象的私有部分是对象实际如何工作和执行这些请求的操作。其他组件无须知道每个对象内部如何工作,只要提出请求的工作即可,这就使得数据隐藏成为可能。处理的详细信息对此对象外的其他程序元素是隐藏的。对象间通过定义好的接口进行通信,因此不需要互相知道其他对象的内部工作机制。

数据隐藏由封装提供,它保护外界不能访问对象的私有数据。对象不必允许其他对象访问自己的内部数据和处理过程,也无须知道其他对象的内部数据和处理过程。

对象重用使得资源的利用和编程人员的工作更高效。不同的应用程序可使用相同的对象,这减少了重复性工作。如果应用程序的功能增加,那么很容易添加一个对象并集成到原来的结构中。

多态意思为“拥有多种形式”。两个对象可以接受相同的输入,但输出不同的结果。

多态是不同对象以不同方式响应相同的命令、输入或消息。

面向对象的分析(0bject Oriented Analysis,OOA)是指对符合一个解决方案的对象进行分类的过程。通过对问题的分析来决定应用程序使用的对象的类。

面向对象的设计(0bject Oriented Design,OOD)呈现一个现实问题,并将它与一个使用OOP的软件解决方案对应起来。采用OOD得到的是一种使用模块化数据和过程的设计,这种设计将数据对象和处理操作相互关联起来。

结构化分析方式(structured analysis approach)需要考虑所有对象和应用程序的主体,映射它们之间的内部关系、通信路径和继承属性。这不同于数据建模(data modeling)。数据建模独立地考虑要处理的数据和处理数据的组件。数据模型需要从头至尾跟踪输入数据,并且验证输出的正确性。

另一个数据建模的例子是关于数据库的。数据建模可以用于提供对数据和控制数据的关系的洞察。一个文件结构中的数据项或存储的数据可能是指向另一个文件的指针,也可能是执行其他数据存储位置的指针。这些指针必须确实指向正确位置。数据建模将验证这一点,而OOA结构分析却做不到。

数据结构是对数据元素之间逻辑关系的表示。数据结构指明了元素间关联的程度、访问方法、处理选择以及数据元素的组织。

内聚(cohesion)是反映某个模块能执行多少种不同类型的任务的术语。如果某个模块只执行一个任务(减法)或几个非常相似的任务(加、减、乘),就认为该模块高内聚。内聚越高,就越容易对其进行更新或修改,并且不会影响到与之交互的其他模块。

耦合是一种度量,表示一个模块完成其任务需要进行多少交互。如果一个模块低(松散)搞合,就表示该模块在执行其任务时不需要与太多的其他模块通信。

模块应当尽量独立并执行单一的逻辑功能,即高内聚。模块间不应该相互高度依赖,也就是低耦合。

应用编程接口正是描述了一个软件组件与另一个软件组件的连接。这不仅鼓励软件再使用,而且通过将更改局部化,同时消除(或至少减少)补丁或更改的级联效应,从而使软件更易于维护。

10 分布式计算

10.1 分布式计算环境

分布式计算环境(Distributed Computing Environment,DCE)是一个客户端/服务器框架,可供许多供应商在其产品中应用。该框架描述了各种能力如何在异质系统之间集成和共享。DCE提供RPC服务、安全服务、目录服务、时间服务、分布式文件支持等。

DCE是一组基于RPC的位于通信层上的管理服务。它在网络层之上建立软件层,并为软件层上的应用程序提供服务。DCE和DCOM(Distributed Component Objecet Model,分布式组件对象模型)提供大量相同的功能性。

DCE的时间服务提供主机时钟同步,并使应用程序能基于时钟同步来决定时间顺序和计划安排。这就是应用程序的时间同步。用户不能直接访问这项功能。目录服务器使用户、服务器和资源可以在网络上的任何地方建立联系。当目录服务被给定一个名称时,它会返回资源的网络地址和其他必要信息。DCOM使用全球唯一标识符(Globally Unique Identifier,GUID),而DCE使用通用唯一标识符(UniversalUnique Identifier,UUID)。GUID和UUID都用于唯一标识环境内的用户、资源和组件。

RPC功能从发送程序中收集参数和命令,并准备好通过网络传输。RPC决定要使用的网络传输协议,并在目录服务中找到接收主机的地址。线程服务在多线程环境中提供实时线程优先级排列。安全服务支持身份验证和授权服务。

DCE是通过客户端/服务器模型来标准化异类系统通信的首个尝试。

10.2 CORBAORB

公共对象请求代理架构(COREA)是由对象管理组(Object Management Group,OMG)开发的一个开放式面向对象的标准架构,它为目前环境中大量不同的软件、平台和硬件提供互操作性。CORBA使应用程序之间能互相通信,同时不用考虑应用程序的位置和开发人员。

这个标准定义了API、通信协议和客户端/服务器通信方法,从而允许以不同编程语言开发的、在各种平台上运行的、不同类型的应用程序共同工作。该模型定义了对象语法,使外部可见特征标准化,并且对环境中的其他对象是统一的。这种标准使很多不同的开发人员在无须知道其他组件如何工作的情况下,就可以开发能与其他组件交互的大量组件。开发人员只知道如何与组件通信,因为接口是统一的,并且遵循模型的规则。

在模型中,客户端请求对象的服务。客户端向对象发送一条消息,这条消息包含对象名称、请求的操作和其他必需的参数。

COREA模型为构建一个完全分布式环境提供了标准。它包含两个主要部分:面向系统的组件(对象请求代理(Object Request Broker,ORB)和对象服务);面向应用程序的组件(应用程序对象和通用工具)。ORB管理组件间的所有通信,使它们能在异构和分布式环境中交互。ORB与对象所驻留的平台无关,这提供了更大程度的互操作性。

ORB是建立对象间客户端撒务器关系的中间件。当客户端需要访问服务器上的对象并请求该对象执行某个操作或者方法时,那么ORB就拦截请求并负责寻找对象。一旦找到对象,ORB会调用一个方法(或操作),传递参数,并将结果返回给客户端。

在CORBA模型中工作的软件,只要遵循所有规则且允许互操作,便能使用由不同编程语言编写的和驻留在不同操作系统和平台上的对象。

ORB提供分布式对象间的通信。如果位于工作站上的对象需要服务器上的对象处理数据,那么它可以通过ORB提出请求,ORB找到所需要的对象,并在两个对象之间建立通信路径直至处理完毕。

ORB是一种使对象能进行本地或者远程通信的机制。它们使对象可向另一对象发出请求,并接收响应。这对客户端而言是透明的,并为所有相关对象之间提供了一种管道。应用CORBA使应用程序可以被许多不同类型的ORB使用。CORBA为应用程序提供了可移植性,并解决了许多供应商和开发人员在不同环境中实现产品时所遇到的互操作性问题。

10.3 COMDCOM

组件对象模型(COM)是一种允许某个应用程序内或相同计算机系统上不同应用程序之间实现进程间通信的机制。

分布式组件对象模型(DCOM)不仅支持同样的用于组件交互的模型,还支持分布式(IPC)。COM使应用程序能使用相同系统上的组件,而DCOM则使应用程序能访问驻留在网络不同部分的对象。基于COM的操作系统和/或应用程序正是这样执行基于客户端/服务器的活动。

DCOM拥有一个程序库,解决了会话处理、同步、缓冲、错误标识与处理以及数据格式转换等问题。

作为中间件,DCOM使分布式处理成为可能,并为开发人员提供支持进程问网络通信的服务。

对象链接和嵌入(0bject Linking and Embedding,OLE)为在本地个人计算机上共享对象提供了一种方式,并使用COM作为其基础。OLE使对象(如图形、图片和电子表格)可嵌入文档中。一个程序调用另一个程序的能力称为链接。将一段数据放入外部程序或文档的能力称为嵌入。

OLE还允许链接不同的对象和文档。

在万维网(World Wide Web)中应用的OLE技术称为ActiveX。ActiveX组件与其他组件一样,但可以进行移植。ActiveX组件可运行在任何支持DCOM(使用COM模型)或使用DCOM服务进行通信的平台上。

10.4 Java平台,企业版本

另一个分布式计算模型是基于Java编程语言,即Java平台企业版本(J2EE)。正如COM和COREA模型的创建是为在编程代码上使用模块化方法从而可实现互操作一样,J2EE定义了面向对象和平台独立的客户端/服务器模型。

提供了一个基于Java的数据库访问API;它的进程问通信基于COREA。主要目标是用一个标准化的方法实现后端代码,从而为企业范围内的应用程序执行业务逻辑。

J2EE应用程序服务器能为客户端处理升级、并发、交易和各种安全服务。其目的是让开发人员能集中精力于业务逻辑功能而不是井盖下面的“水管”。

10.5 面向服务的架构

面向服务的架构(SOA)提供了标准化访问, 这样可在同一时刻访问不同应用程序中最需要的服务。它将应用程序分为不同的功能单元(称为服务),通过这些服务之间定义良好的接口和数据共享标准联系起来。这意味着单个应用程序不需要拥有相同的冗余代码和功能。功能可由一个单独实体来提供,然后所有其他应用程序可调用并使用它的一个实例。这是所有分布式计算技术和方法的真正关键技术:SOA更多是一种基于Web的方法。

应用程序可访问一个集中提供所需的功能的地方。一个简单的接口将底层的复杂实现进行抽象(隐藏),从而允许应用程序在请求服务时不需要了解服务提供者的编程语言或实现平台。为使服务能交互使用(重用),它们必须在本质上是模块化的、自主的、松散稠合的,遵循标准化的服务标识和分类,并提供配置和交付。

在SOA环境中,提供服务的实体向服务代理发送服务描述文件。服务代理可以说是一个特定环境中所有内部可用服务的地图。当一个应用程序需要一个特定服务,它可调用服务代理,服务代理就可将应用程序指向服务提供者。

SOAP是一个基于XML的协议,用于在Web服务的请求者和提供者之间交换信息。

云计算是一种将计算作为一种服务(而不是实物产品)的方法。它提供了处理计算能力、存储和软件,无须最终用户知道或扭心提供此功能的设备和软件的物理位置和配置。云计算通过订阅或按使用次数付费的结构延伸技术能力。可扩展的资源得到整合并通过虚拟化方式来使用。

软件即服务务(Software as a Service,SaaS)模式允许应用程序和数据采用集中方式管理,并通过瘦客户端(一般是Web浏览器)访问。它类似于旧的中央主机模式,但通常发生在互联网上。SaaS提供了许多业务应用程序提供的功能,如客户关系管理(CRM)、企业资源规划(ERP),人力资源管理(HRM)、内容管理(CM)等。

所以分布式计算环境DCE是提供客户/服务器分布式计算能力的第一次尝试,并且主要在基于UNIX操作系统的环境中工作。CORBA是一个模型,它允许大多数非微软的应用程序进行互操作和分布式计算。通过Web服务和SOA框架来实现基于Web的分布式计算。这些具有相同的基本目标,就是让一台计算机上的客户端应用程序组件可与另一计算机上的服务器应用程序通信。这些模型之间最大的区别是这些模型需要在UNIX、Windows、heterogeneous或基于Web的各种网络基础环境中工作。

由于分布式计算技术允许不同的系统和应用程序进行交流和共享功能,在涉及安全时这可增加更复杂的层。客户端和服务器部分需要进行相互验证,以确保黑客不能引入恶意应用程序并实施中间人攻击。每个通信组件需要共享相似的加密功能,这样可采取必要的加密措施。需要保护通信组件之间传递的数据和消息的完整性。为保护通信数据,端到端的安全传输通道可能有必要。安全需求的列表很长,关键是,实现软件组件在异构环境中进行通信虽然不容易,但确保这些复杂通信方法的安全更加困难。

作为一名安全专家,必须理解软件之间在底层如何通信。可修补系统,实现访问控制列表(ACL),加固操作系统和其他很多事,但是在不安全的应用程序之间仍存在未受保护的RPC通信。必须将安全集成在各个层面,包括进程间通信通道。

11 移动代码

能通过网络传送并由另一端的系统或设备执行的代码称为移动代码。有许多合理的原因允许使用移动代码。

移动代码多年来一直是攻击者的目标。除仔细控制的环境以外,其他移动代码应该被认为是有风险的。

11.1 Javaapplet

Java是一种面向对象的、与平台无关的编程语言。它作为一种完全成熟的编程语言使用,并用于编写一种在用户的浏览器上运行的、名为applet的小程序。

Java语言则与平台无关,因为它建立的一种名为字节码(bytecode)的中间代码是与处理器无关的。Java虚拟机(JVM)。随后将字节码转换为客户端处理器能够识别的机器码。

当applet执行时,JVM将在一个名为沙箱的环境中创建一个虚拟机。这个虚拟机是一个封闭的环境,applet在其中执行操作。applet常通过一个请求的Web页面传送,这表示applet一到达目的地就开始执行。它能执行有意或无意(如果applet的开发人员出错)的恶意活动。因此,沙箱严格限制applet对任何系统资源的访问。JVM可调节对系统资源的访问,以确保applet代码“行为良好”,停留在自己的沙箱内。

Java语言本身不仅提供与垃圾收集、存储器管理和确认地址一样的保护机制,还提供一个验证其遵守预先确定规则的组件。

11.2 ActiveX控件

ActiveX是一组基于COM和DCOM的OOP技术与工具构成。编程人员使用这些工具创建ActiveX 控件。ActiveX控件可由一个系统、不同系统以及网络中的许多应用程序重复使用。这些控件可从Web站点下载,以增加额外功能(如为网页提供动画),但它们也是Wmdows操作系统自身的组件(动态链接库(DLL)),并执行常见的操作系统任务。

问题在于ActiveX控件共享系统上当前用户的权限,由于人人都能构建这些控件,所以恶意的ActiveX控件拥有充分的权限来破坏该系统和与之相连的其他系统的安全。当ActiveX控件能下载ActiveX组件而不需要进行身份验证时情况就更糟糕,因为这样为蠕虫传播创建了非常适宜的环境。

ActiveX技术提供安全级别和身份验证,使用户可控制下载的ActiveX组件的安全性。与Java applet不同,当用户选择增加组件提供的功能时,ActiveX组件被下载到用户硬盘上。这意味着,ActiveX拥有对用户系统更大的访问权限。

用户浏览器的安全级别设置可确定ActiveX组件是自动下载,还是首先给用户警告提示。用户可通过浏览器控制配置安全级别。当安全级别提高时,也就提高了浏览器对签名或未签名的组件或控件、ActiveX脚本初始化的敏感度。

Java applet和ActiveX控件的主要区别是Java为代码运行建立一个沙箱,并且限制代码访问用户计算机系统上的资源。ActiveX使用依赖于数字签名和信任认证授权的身份验证码技术。Java不能保证所有代码都在沙箱中运行,这容易引起几种类型的安全危害,这些危害都是恶意软件的示例。ActiveX不一定提供安全性,事实上,它总是向用户弹出讨厌的警告对话框。因为用户不了解这种技术,也不了解其中蕴含的风险,所以只是不停地单击OK按钮。

12 web安全

12.1 针对Web环境的特定威胁

应对这种威胁的简单对策是删除管理接口,但这样做会给管理员增加麻烦。使用一个更强大的身份验证机制要优于采用标准的用户名/口令方法。控制哪些系统可建立连接并进行管理也是另一个不错的方法。许多系统允许定义特定的E地址或网络ID,并只允许从这些工作站进行管理访问。

实际上,最安全的系统管理接口应该是一种带外接口,即使用一条独立的通信通道,以避免系统所运行的环境中存在任何脆弱性。带外接口的一个示例为使用调制解调器连接Web服务器,直接拨号进入并配置它使用一个本地接口,而不是使用一个Web接口通过互联网建立连接。就像在SSH中一样,这个连接应通过一条加密通道建立。

未经过培训、容易轻信的用户是组织机构最大的威胁

通过一个安全机制来传送所有身份验证信息是一种最佳做法。通常,这意味着要通过传输层安全(TLS)对口令和通信通道进行加密。然而,一些大型站点仍然没有使用加密的身份验证机制,而将自己暴露在攻击者嗅探用户名和口令的威胁之中。

?路径或目录遍历 这种攻击也称为“点-点-斜线”,因为它通过在URL中插入几个“../”字符来回溯或遍历本不应通过Web访问的目录,从而实施攻击。命令提示符下的“../”命令告诉系统返回到前一个目录(试着输入“cd../”,看看会有什么结果)。如果一个Web服务器的默认目录为c:inetpub\www,那么请求“http://www.website.com/scripts/../../../../windows/system32 /cmd.exe?/c+dir+c:\”的URL会将命令系统返回几个目录,直至进入驱动器的根目录,然后请求修改操作系统目录(windows\system32),并运行cmd.exe列出驱动器c:中的全部内容。访问命令行会给攻击者带来大量访问机会。

?Unicode编码 Unicode是一种行业标准机制,开发它的目的是为了以一种标准的编码格式来表示世界上的10万多个文本字符。Web服务器支持Unicode以支持不同的字符(如中文),并且许多服务器都默认支持Unicode。因此,即使我们告诉系统禁止前面提到的“../”目录遍历请求,但是在应用Unicode的情况下,攻击者不使用“../”,而是通过那个字符的Unicode表示形式(共3种:%cl%lc、%c0%9v和%c0%af)就仍然可以有效地提出相同的目录遍历请求。这个请求能够悄悄避开确认规则并得到处理。

?URL编码不知道你是否曾经注意到,在Web浏览器的URL中,“空格”以%20表示。实际上,%20即表示空格,因为URL中禁止使用空格字符。就像使用Unicode字符的攻击一样,攻击者发现他们能以不同的方式表示字符,从而避开过滤并提出请求。

客户端验证指在将输入发送回服务器进行处理之前,在客户端进行输入验证。

跨站点脚本是另一种类似的探查攻击。在安全社区,它已经替代缓冲区溢出,成为Web应用程序的最大威胁。术语“跨站点脚本(XSS)”指的是在一个Web站点发现的脆弱性允许攻击者在Web应用程序中注入恶意代码的攻击。xss攻击使攻击者(用客户端脚本语言,如JavaScript)把他们的恶意代码注入脆弱的网页中。随后,不知情的用户在访问这个站点时,恶意代码就会在他们的浏览器中执行,这样可能导致cookie被盗、会话被劫持、恶意代码被执行和访问控制被绕过,或有助于利用浏览器漏洞。下面列出3种不同的xss脆弱性:

?非持久XSS脆弱性,或者称为反射脆弱性,出现在攻击者欺骗受害者处理一个用流氓脚本编写的URL,从而偷取受害者敏感信息(cookie,会话ID等)时。这个攻击的原理是利用动态网站上缺少适当的输入或者输出确认。

?持久XSS脆弱性,也称为存储或者第二顺序脆弱性,通常针对的是那些让用户输入存储在数据库或其他任何地方(如论坛、留言板、意见簿等)的数据的网站。攻击者张贴一些包含恶意JavaScript的文本,在其他用户浏览这些帖子时,它们的浏览器会呈现这个页面并执行攻击者的JavaScript。

?文件对象模型(Document Object Model,DOM)XSS脆弱性,也叫本地跨站点脚本。DOM是标准结构布局,代表着浏览器中的HTML和XML。在这样的攻击中,像表单字段和cookie这样的文档组件可通过JavaScript被引用。攻击者利用DOM环境来修改最初的客户端JavaScript。这使受害者的浏览器执行由此而导致的JavaScript代码。

过滤掉全部“己知的”恶意请求,未经确认绝不相信来自客户端的信息,并执行一个强大的策略,包括在所有应用程序中进行适当的参数检查等。

参数确认(parameter validation)是指首先确认应用程序收到的值在确定的界限内,然后由服务器应用程序在系统内处理这些值。参数确认与输入确认的主要区别在于,应用程序是否期望用户输入一个值,而不是由应用程序定义的一个环境变量。这个领域的攻击将操纵系统认为客户端无法配置的值,主要原因是接口中没有提供这样一种机制。

Web代理是安装在系统上的一款软件,它的目的是拦截本地Web浏览器与Web服务器之间的所有流量。

使用Web代理还可以对Web页面使用隐藏字段的做法加以利用。就像它的名称所说明的那样,隐藏字段并不在用户界面上显示,但却包含一个值,它在提交Web表单时传递给服务器。如果Web开发人员将一个Web页面中的商品价格编码成隐藏值,而不是在服务器上引用商品及其价格,那么攻击者就可对这种使用隐藏字段的做法加以利用。攻击者可使用Web代理拦截客户提交的信息,并在将其提交给服务器之前修改其中的值(价格)。实施这种攻击非常容易,假如系统没有执行其他检查,攻击者可修改电子商务购物车指定的新值。

在客户端/服务器环境中,预先确认控制可部署在客户端,然后向服务器提交请求。即使采用了这些控制,服务器还是应当在应用程序提交请求之前执行并行的预先确认,因为客户端实施的控制通常比服务器少,并且可能己经被攻破或避开。

?预先确认 在提交给应用程序之前,输入控制验证数据格式正确并符合应用程序规范。预先确认的一个示例为表单字段确认,即一个希望收到数字(货币)值的Web表单字段不接受字母输入。

?事后确认 确保应用程序的输出符合预期(也就是在预先确定的合理性限制内)。

管理客户端会话最常用的方法是给每个连接都分配一个唯一的会话ID。会话ID是一个值,它由客户端随每个请求一起发送给服务器,用于为服务器或应用程序唯一标识客户端。如果攻击者能获得或猜测出一个已经通过身份验证的客户端的会话ID,并将其当作自己的会话ID递交给服务器,那么服务器将受到欺骗,从而使得攻击者能访问客户端的会话。

建立某种形式的时间标签或基于时间的确认,可阻止重放攻击(这种攻击是指攻击者截获一个合法会话的流量并重放它,从而使自己的会话通过身份验证)。最后,用于追踪连接状态的所有cookie也应该进行加密。

12.2 Web应用安全原则

分析网站架构。一个网站越清晰、简单,那么分析它的各种安全要素就越容易。一旦对网站进行了战略性分析,用户生成的Web站点输入就需要严格审查。作为一项规则,所有输入必须被认为是不安全的或恶意的,应该在处理之前进行净化处理。同样,由系统产生的所有输出也应该被过滤,以确保私有或敏感数据不被泄露。

此外,使用加密技术将有助于保护Web应用程序的输入/输出操作。虽然加密的数据可能被恶意用户所截获,但它们只能被那些拥有密钥的人在解密后读取或修改。

在出现错误的情况下,设计的网站应该能以可预知的和不妥协的方式呈现。这一般被称为安全式失败。支持安全式失败的系统可在不暴露内部系统细节的情况下显示友好错误信息。

设计安全功能的一个重要因素是要从人性化角度考虑问题。为实现安全的有效性,程序员甚至可能想让用户在每次点击鼠标时都确认密码,但即使这样Web开发人员也必须维护功能和安全性之间的平衡。繁杂的身份验证技术通常不会在实践中存活太长时间。经验表明,最好的安全措施是那些简单的、直观的和心理上可接受的。

使用“隐匿安全”方法实现安全保护通常是一种糊涂和无效的做法。通过隐藏安全想法创建的过于复杂或令人费解的程序将减少软件介入的机会。虽然晦涩的程序可能需要更长的时间来一点点剖析,这并不能保证自己免于来自果断和坚定攻击者的攻击。因此,保护措施不能仅包括模糊处理。

在最后,重要的是要认识到,即使是最强健的安全技术实施,如果没有战术上的考虑,都会导致一个网站像其最薄弱的环节一样脆弱。

13 数据库管理

访问控制可限制只有允许的角色才能与数据库交互。数据库管理员可定义允许访问数据库的特定角色。每个角色都将被分配一定的权利和权限,客户和雇员随后被赋予不同的角色。任何不属于这些角色的用户将被拒绝访问数据库。

数据库管理系统(Database Management System,DBMS)是一组用于管理大量结构化数据的程序,可为不同类型的用户提供数据查询能力。它也可控制数据库的各类安全参数。

13.1 数据库管理软件

数据库是以某种有意义的方式存储的数据的集合,它允许用户和应用程序在需要时访问、查看和更改数据。数据库由能提供这些功能的软件管理。该软件还可实施访问控制限制,提供数据完整性和冗余,以及为数据操作建立不同的过程。这种软件称为数据库管理系统(Database Management System,DBMS),通常由数据库管理员控制。数据库不仅存储数据,而且可以处理数据,并以更有用的、更具逻辑性的形式标识数据。DBMS与程序、用户和数据库内的数据进行交互,它帮助我们更有效地存储、组织和检索信息。

数据库是为收集到的数据提供结构的机制。

? 它不是将数据保存在网络中的几台不同服务器上,从而方便进行集中化管理。

? 它的备份过程更容易。

? 它提供事务处理持续化。

⑧ 它提供恢复和容错。

? 它允许多个用户共享数据。

? 它提供安全控制,以实现完整性检查、访问控制和必要的机密性级别。

事务处理持续化(transaction persistence)意味着执行事务处理的数据库过程是持久可靠的。在进行事务处理后,数据库的安全状态应保持原状,同时需要确保事务处理的完整性。

13.2 数据库模型

数据库模型定义了不同数据元素之间的关系,规定了如何访问数据,并定义了可接受的数据操作、提供的数据完整性类型以及这些数据的组织方式。

关系数据库模型(relational database model)使用属性(列)和元组(行)来包含和组织信息。这种关系数据库模型是今天使用最广泛的模型。它以表的形式表示信息。一个关系数据库由若干二维表组成,每个表都包含独特的行、列和存储单元(即行和列的交汇点)。每个存储单元只包含一个数据值,它表示指定元组内的具体属性值。这些数据实体通过关系联接。数据实体之间的关系为组织数据提供了架构。主键是将一条记录内的所有数据与某个独特值相链接的字段。

层次数据库模型(hierarchical database model)组合了在逻辑树结构中相关联的记录和字段。数据元素之间的结构和关系与关系数据库不同。在层次数据库中,父节点可具有一个或多个子节点,也可以没有子节点。树形结构包含许多分支,每个分支又具有许多叶子或数据字段。这些数据库具有定义明确、预先指定的访问路径,但在创建数据元素之间的关系方面不如关系数据库灵活。层次数据库通常用于映射一对多关系。

在构建关系数据库的索引时,层次模型几乎总是被使用。索引可建立在任何属性上,并允许对该属性的数据进行非常快速的搜索。

最常用的层次模型实现为轻量级目录访问协议(LDAP)模型。读者可发现,这种模型也用在Windows注册表结构和不同的文件系统中,不过较新的数据库产品通常不采用该模型。

网络数据库模型(network database model)构建在层次数据库模型之上。与层次数据库模型不同,在网络数据库模型中,要找到一个数据元素,你不必知道如何从一个分支进入另一个分支,然后从一个父节点进入一个子节点,网络数据库模型允许每个数据元素拥有多个父节点和子记录。这形成了一种类似网络的冗余结构,而非严格的树形结构(网络数据库这个名称并不表示数据在网络上或分布在整个网络中,它只是描述数据元素的关系)。此外,与层次模型相比,网络模型检索数据的速度更快。

面向对象的数据库(object-oriented database)可设计为管理多种不同类型的数据(图像、语音、文档和视频)。在本质上,面向对象的数据库管理系统(Object-oriented Database ManagementSystem,ODBMS)比关系数据库更具动态性,因为面向对象的数据库在需要时才创建对象,数据和过程(调用方法)在对象被请求时运行。在关系数据库中,应用程序必须使用自己的过程从数据库获得数据,然后根据自己的需求处理这些数据。传统的关系数据库并不像面向对象的数据库那样能提供访问数据的过程。面向对象的数据库使用类未定义其对象的属性和过程。

建立面向对象数据库模型的目的在于突破关系数据库在保存和处理大量数据时所遇到的限制。

面向对象的数据库并不依赖SQL进行交互,因此非SQL客户端的应用程序也可以使用这种数据库。

结构化查询语言(Structured Query Language,SQL)是一种用于允许客户端和数据库交互的标准编程语言。许多数据,库产品都支持SQL。它允许客户端执行诸如插入、更新、搜索和提交数据的操作。当客户端与数据库交互时,客户端一般使用SQL来进行请求。

下面列出一些重要的数据库术语:

?记录(record) 关系数据项的集合。

?文件(file) 相同类型记录的集合。

?数据库(database) 数据的交叉引用集合。

?数据库管理系统(DBMS) 管理和控制数据库。

?元组(uple) 二维数据库中的行(或记录)。

?属性(attribute) 二维数据库中的列。

?主键(primary key)使每一行(或每一条记录)区别于其他行的列(一个表中的每一行都必须包含一个主键)。

?视图(view) 为控制主体查看特定数据而定义的虚拟关系。

?外键(foreign key) 一个表中的某个属性,与其他表的主键相关联。

?存储单元(cell)行和列的交汇点。

?模式(schema) 定义数据库的结构。

?数据字典(data dictionary)描述数据元素及其关系的中心存储库。

对象-关系数据库(Object Relational Database,ORD)或对象-关系数据库管理系统(Object Relational Database Management System,ORDBMS)是一种具有以面向对象编程语言编写的软件前端的关系数据库。首先,关系数据库仅将数据保存在静态二维表中。在访问数据时,需要对数据进行某种处理.如果拥有一个前端,该前端提供可对数据执行的过程(方法),那么访问数据库的每个应用程序并不需要拥有必要的过程。这意味着,每个应用程序不需要具备它访问数据库所需的过程。

不同公司需要对保存的数据执行不同业务逻辑。编程人员开发出这种前端软件,它允许提出请求的应用程序和数据库中的数据使用业务逻辑过程。一个执行该过程的前端对象被创建,这个对象从数据库中提取必要的数据,并将结果提交给提出请求的应用程序。另外,我们还需要进行趋势分析,以了解库存的哪些产品在生产过程中用得最多。这时,另一个能够执行这种计算的对象将收集必要的数据,并将其提交给提出请求的应用程序。我们还可通过下列各种方式查看这个数据库中的数据:在运输过程中有多少产品受损:每个供应商响应我们的供给请求的速度有多快;考虑到重量等因素,运输不同产品的成本是多少等。

13.3 数据库编程接口

开放数据库连接(Open Database Connectivity,ODBC) 一个应用编程接口(Application Programming Interface,API),允许应用程序与本地的或者远程的数据库通信。应用程序向ODBC API发送请求。ODBC为数据库找到执行翻译的、针对具体数据库的必要驱动程序,进而将请求翻译为特定数据库能理解的数据库命令。

对象链接和嵌入数据库(0bject Linking and EmbeddingDatabase,OLE DB)作为中间件运行在客户端或者服务器上,将数据分成多个组成部分。它提供一个底层接口,以链接不同数据库的数据以及提供对不同位置或不同格式数据的访问。下面列出OLE DB的一些特征:

? 替代ODBC,扩展它的功能以支持更广泛的非关系数据库,如对象数据库和不一定实现SQL的电子数据表。

? 一组基于COM的接口,为应用程序提供统一的方式来访问保存在不同数据源中的数据。

? 由于OLE DB以COM为基础,因此它限于被基于Microsoft Windows的客户端工具所使用。

? 开发人员通过ActiveX数据对象(ADO)来访问OLE DB服务。

? 它允许不同应用程序访问不同类型和来源的数据。

ActiveX数据对象(ActiveXData Object,ADO)一个允许应用程序访问后端数据库系统的API。它是一组ODBC接口的集合,使用可访问对象来展示数据来源的功能。ADO使用OLEDB接口连接数据库,并且可使用多种不同的脚本语言进行开发。ADO常用在Web应用程序和其他客户端/服务器应用程序中。下面列出了ADO的一些特征:

?是一种针对底层数据访问技术(如OLEDB)的高级数据访问编程接口。

?是一组用于访问数据来源、而不只是用于数据库访问的COM对象。

?它允许开发人员编写程序来访问数据,而不用知道数据库如何实现。

?在使用ADO时,SQL命令不需要访问数据库。

Java数据库互连(JavaDatabase Connectivity,JDBC)是一个允许Java应用程序与数据库通信的API。应用程序可直接或者通过ODBC连接到数据库。下面列出JDBC的一些特征:

? 是一个提供与ODBC相同的功能的API,不过专门为Java数据库应用程序设计。

? 在Java平台与一系列数据库之间使用独立于数据库的连接。

? JDBC是一种使Java程序能执行SQL语句的JavaAPI。

13.4 关系数据库组件

大多数数据库语言包括定义模式的数据定义语言(Data Definition Language,DDL)、检查数据和定义如何操作数据库内数据的数据操作语言(Data Manipulation Language, DML)、定义数据库内部组织的数据控制语言(Data Control Language,DCL)以及定义使用户能够访问数据库内数据的查询的特殊查询语言(Query Language,QL)。

? 数据定义语言(DDL)定义数据库的结构和模式。数据库的结构意味着表的大小、键的位置、视图以及数据元素关系。数据库的模式描述保存和操作的数据类型及其属性。DDL定义了数据库的结构、访问操作和完整性过程。

? 数据库操作语言(DML) 包含使用户能查看、操作和使用数据库的所有命令(view、add、modify、sort和delete命令)。

? 查询语言(QL) 使用户可对数据库提出查询请求。

? 报表生成器以用户定义的方式生成数据打印输出。

数据字典是数据元素定义、模式对象和引用键的集中式集合。模式对象可包含表、视图、索引、过程、函数和触发器。数据字典可包含列的默认值、完整性信息、用户的姓名、用户的权限和角色以及审计信息。它是一种通过控制数据库内关于数据的数据(称为元数据)来集中管理数据库各个部分的工具,提供了成组数据元素和数据库之间的交叉引用关系。

数据库管理软件创建和读取数据字典,以查明所存在的模式对象,并检查特定用户是否具有查看这些对象的适当访问权限。当用户查看数据库时,他们会受到特定视图的限制。数据字典内保存了用于每个用户的不同视图设置。当添加新的表、记录或模式时,应该更新数据字典以反映这些变化。

主键是一条记录的唯一标识符,并且用于在关系数据库中编写索引。每条记录都必须拥有一个唯一的主键,以便适当地将该记录表示为一个实体。当用户请求查看一条记录时,数据库通过唯一的主键来跟踪这条记录。如果主键不是唯一的,数据库就不知道向用户提供哪一条记录。

外键不同于主键,但它们关系密切。如果一个表中的某个属性值与另一个表中的主键相匹配,并且两者之间建立了某种关系,那么这个属性就视为外键。这个外键不一定是当前表中的主键,只是包含的信息与另一个表主键保存的信息相同。

13.5 完整性

数据库也会遇到并发(concurrency)问题。当不同用户和/或应用程序同时访问一个软件时,就会发生并发问题。

那么两个用户可能同时访问和修改相同的数据,在动态环境中这是不利情况。为确保并发现象不会导致问题,进程可锁定数据库内的表,进行修改后再释放软件锁。下一个访问该表的进程就能看到更新后的信息。锁定可确保两个进程不会在同一时间访问相同的表。页、表、行和宇段都可被锁定,以保证在同一时刻不会有两个数据更新进程,这样每个进程都可以访问到正确的信息。

数据库软件执行3种主要类型的完整性服务:

? 语义完整性(semantic integrity)机制保证结构化规则和语义规则得到遵守。这些规则与以下因素有关:数据类型、逻辑值、唯一性约束以及可能负面影响到数据库结构的操作。

? 如果所有外键都参考现有的主键,那么数据库就具有参考完整性(referentialintegrty)。应通过某种机制确保没有外键引用不存在的记录的主键或者空值。

? 实体完整性(entity integrity)保证了元组由主键值唯一确定。在前面的示例中,主键是狗的名称,这种情况下,就不能有两只狗使用相同的名称。为保持实体完整性,每个元组都必须包含一个主键。如果不包含主键,数据库就不能引用此元组。

回滚指结束当前事务处理并取消对数据库的当前更改。这些更改可能是数据本身发生的更改或者模式的更改。执行回滚操作时,所做的变更被取消,数据库则返回其先前的状态。如果数据库出现意想不到的故障或者外部实体处理顺序出现混乱,就需要回滚。数据库回滚至其原始状态,同时记录错误和操作日志以便日后检查,而不是仅重传或者更正部分数据。

提交操作结束事务处理,并执行用户刚做出的所有变更。顾名思义,一旦执行提交命令,变更就被提交并反映到数据库中。这些变更可针对数据或者模式信息。因为这些变更被提交,所以其他所有用户和应用程序都能访问到更新后的数据。如果用户没有正确完成对变更的提交,就会执行回滚命令。这确保了不会由于发生部分变更而导致数据受损。

保存点用于保证在系统发生故障或者检测到错误时,数据库可返回系统故障之前的状态。举一个概念化的例子,假设Dave输入“Jeremiahwas a bull frog.He was<savepoint>a good friend of mine"(系统插入一个保存点)。系统由于故障而重新启动。当Dave回到数据库应用程序时,他看到数据库中的记录内容是“Jeremiah was abull frog.He was”但他输入的其他内容丢失。也就是说,保存点保存了他的部分工作。出现故障后,数据库和其他应用程序会使用这种技术尝试还原用户的工作和数据库的状态,但某些故障太大,而且难以修复。

检查点与保存点非常类似。当数据库软件占用了一定的内存空间时,检查点开始工作,它会将内存中的数据保存到一个临时文件中。一旦运行过程出现问题,数据库软件可尝试使用这些信息将用户的工作环境还原至其先前的状态。

两阶段提交(two-phase commit)机制是数据库中用于确保数据库内数据完整性的另一种机制。数据库通常会执行事务处理过程,它意味着用户与数据库同时进行交互。与事务处理相反的是批处理,它意味着对数据库进行变更的请求被放入一个队列并一次性激活,而不是在用户提交请求时立即激活。在事务处理过程中,很多时候一个事务处理会同时要求几个数据库在处理过程中进行更新。需要保证每个数据库都得到适当的修改,或者根本没有任何修改。当用户提交一个数据库变更时,首先不同的数据库临时保存这些变更,然后事务处理监控器向每个数据库发送一个“提交前”命令。如果所有相关数据库做出确认响应,那么监控器会向每个数据库发送“提交”命令。这样可确保所有信息在适当时间保存在适当位置。

13.6 数据库安全问题

聚合(aggregation)是指下面这种情形:虽然用户不具有访问特定信息的许可或权限,却具有访问这些信息的组成部分的权限。这样,用户可将每个组成部分组合起来,从而得到被限制访问的信息。用户可通过不同途径得到信息,进而通过组合得到本不具备明确访问权限的信息。

聚合指的是组合不同来源的信息的行为。用户没有明确的权限可访问组合得到的信息,但组合得到的信息比信息的各个组成部分拥有更高敏感性。

为防止聚合,需要防止主体和代表主体的应用程序或进程获得对整个数据集合的访问权限,包括集合的各个独立组成部分。客体可置入容器,在较高的级别上分类,以防止低级别许可或权限的主体访问。对主体的查询可进行跟踪,并实施基于上下文的分类。这将记录主体对客体的访问历史,并在聚合攻击发生时限制访问企图。

另一个安全问题是推理(inference),它是聚合想要达到的结果。当某个主体根据通过聚合了解到的部分而演绎全部信息时,就会出现推理问题。当安全级别较低的数据可描述出较高安全级别的数据时,就会发生推理攻击。

推理是得到不是明显可用的信息的能力。

与之相应的一个对策是防止主体或代表主体的应用程序和进程间接得到可推理的信息。在数据库开发过程中,往往可通过实现内容相关和上下文相关访问控制来解决这个问题。内容相关访问控制(content-dependent access control)基于数据的敏感度。数据的敏感度越高,能访问这些数据的个体就越少。

上下文相关访问控制(context-dependent access control)指的是软件根据请求的状态和顺序来“了解”应当允许明哪些动作。

上下文相关访问控制用于防范推理攻击

防止推理攻击的常见措施有单元抑制、数据库分隔、噪声和扰动。单元抑制(cell suppression)是一种用于隐藏特定单元的技术,这些单元包含的信息能用在推理攻击中。分隔(partitioning)数据库涉及将数据库分成不同的部分,这可使未授权用户很难访问到能用于推理攻击的相关数据。噪声和扰动(noise and perturbation)是一种在数据库中插入伪造信息的技术,目的是误导和迷惑攻击者,使得实际推理攻击无法成功。

数据库可允许一个组或者一个特定用户访问特定信息,同时限制另一个组进行访问。这种功能通过使用数据库视图来实现。

数据库可利用自主性访问控制(Discretionary Access Control,DAC)和强制性访问控制(Mandatory Access Control,MAC)。因此,可根据组成员身份、用户权限或者安全标签来显示视图。如果使用了DAC系统,那么可基于身份、身份验证和授权为组和用户授予访问视图的权限。如果使用了MAC系统,那么可基于安全许可级别和数据的分类级别为组和用户授予访问视图的权限。

多实例(polyinstantiation)建立了具有相同主键的多个元组和由安全线定义的实例之间的关系。当一条信息插入数据库中时,需要限制低级别用户访问这条信息。通过建立另一组数据迷惑低级别用户,使用户认为他得到的信息是真实的,而不是仅限制信息的访问。

多实例是通过使用不同值或其他变量填充变量来交互生成客体详细信息的过程,它常用于防止推理攻击。

联机事务处理(Online Transaction Processing,OLTP)用于群集数据库以提供容错和高性能。OLTP提供了监测问题以及在问题发生时立即进行适当处理的机制。

任何检测到的错误或无效事务处理将记录到事务处理日志中。事务处理日志还收集成功事务处理的活动。在执行事务处理前后,数据都将写入日志,以便建立一个事件记录。

OLTP的主要目标是确保事务处理的正确发生或根本不发生。通常,事务处理表示一些不可分割的操作独立发生。如果其中一个操作失败,那么其余操作需要回滚,以确保只向数据库输入准确的数据。

? 原子性(atomicity)将事务处理分成多个工作单元,并确保所有修改都生效或者没有一个修改生效。要么所有修改都提交,要么数据库回滚。

? 一致性(consistency)事务处理必须遵守为特定数据库制定的完整性策略,并确保不同数据库中所有数据的一致性。

? 隔离性(isolation) 事务处理完全隔离执行直至完成,同时事务处理之间互不影响。在事务处理完成之前,修改结果不会生效。

? 持久性(durability) 一旦事务处理在所有的系统上都被验证为是正确的,它就会被提交,并且数据库无法回滚。

13.7 数据仓库与数据挖掘

数据仓库(data warehousing)指的是为了信息检索和数据分析,将多个数据库或数据源组合成一个大的数据库。来自不同数据库的数据被提取和传输到一个称为仓库的中央数据存储设备。数据将被规格化,这意味着冗余信息被去除,并且数据以数据仓库期望的方式被格式化。数据仓库使得用户可不用查询多个数据库,而只查询一个实体。

构建数据仓库的数据源用于操作目的。建立数据仓库是为了进行分析。执行分析是为了做出业务预测决策,确定营销效率、业务趋势甚至欺诈活动。

数据仓库并不只是一个镜像来自不同数据库的数据并将这些数据集中到某个位置的过程。它提供一个数据“基地”,然后对数据进行处理,并以更有用和易懂的方式进行呈现。在呈现给用户前,相关数据会先进行总结和关联,用户得到的是经过精简的、更适合用户需求的数据,而不是最初的每一项数据。

尽管数据仓库提供更方便的访问控制,但是由于它的集中性,数据仓库需要更严格的安全。如果入侵者进入数据仓库,他就可以立即访问公司的所有信息。

数据挖掘(data mining)是对数据仓库中的数据进行进一步处理以得到更有用信息的过程。数据挖掘工具用于发现数据的联系和相关性以生成元数据。元数据可说明不同信息子集之间存在的、先前无法看到的关系。它可揭示先前不明显的异常模式。

数据挖掘可检查复杂数据,并通过使用模糊逻辑、集合理论和专家系统以执行数学函数、查找数据中的隐含模式来简化查询。在许多方面,元数据比它的原始数据来源更有价值,因此必须受到高度保护。

数据仓库和数据挖掘的目标是提取信息,以便了解与组织结构内的活动和趋势有关的知识。利用这些知识,人们就能查明缺陷或优化操作的方法。

数据挖掘是一个分析数据仓库的过程,它在不知道数据所包含意义的情况下使用一些工具分析数据的趋势、相关性、关联和异常。元数据就是将数据存储在数据仓库内并使用工具挖掘出来的结果。数据进入数据仓库,而元数据从数据仓库中出来。

数据挖掘也称为数据库知识发现(Knowledge Discovery inDatabase,KDD),它组合了标识有效及有用知识的各种技巧。不同类型数据之间的相互关系也不相同,知识发现所使用的方法取决于数据的类型和我们想要寻找的模式。下面是KDD系统用于发现这些模式的3种方法:

· 分类 根据共同的相似性对数据分组。

· 可能性 标识数据之间的相互依赖关系,并将可能性应用于它们的关系。

· 统计 标识数据元素之间的关系,并使用规则发现。

大数据被广泛定义为非常大的数据集,具有不适合传统分析技术的特性。这些特性被广泛认同,包括异质性、复杂性、多变性、缺乏可靠性和容量庞大。异质性意味着数据的来源和结构的多样性,这意味着一些数据可以是图像,而另一些数据可以是自由文本。大数据也是复杂的,特别是在相互关系方面,例如社交媒体上的图像和描述当前事件的新闻文章之间的相互关系。而多变性的意思是一些来源产生几乎恒定的数据,而其他来源产生的数据更零星或很少。与此相关的挑战是,一些大数据源可能不可靠或不知道其可靠性。最后,如果这些挑战还不够,那么大数据还有一个基本特征就是其庞大的容量:足以压倒大多数传统数据库管理系统。

14 恶意软件(恶意代码)

对付恶意代码的最好方法就是遵循这样的规则:不要打开不明来源的电子邮件的附件。然而,近期的病毒和蠕虫都是利用个人地址簿,因此这种谨慎也不能保证系统免受恶意代码的侵害。如果地址簿被感染恶意代码,并在攻击中被利用,那么受害者将收到一封看似来自朋友的电子邮件。当他打开邮件并双击附件时,就会遭到病毒感染,而他的地址簿又会被利用来向其所有朋友传播病毒。

14.1 病毒

病毒是可感染应用程序的一个小程序或者一串代码。病毒的主要功能是复制,它需要借助一个宿主应用程序来进行复制。换句话说,病毒不能进行自我复制。病毒通过在文件中插入或附加自身复制品对文件进行感染。病毒就好比是“派送机制”。它能拥有任何类型的负载(删除系统文件、显示具体消息、重新配置系统、盗取敏感数据、安装嗅探器或后门)。

病毒是“恶意软件”这个大类中的一个子类。一个软件只有具备自我复制的功能才能称为真正的病毒。还有几个其他软件类型可感染系统并造成严重伤害,但如果它们不能自我复制,则不属于“病毒”。

宏(macro)是使用Visual BasicVBScript编写的程序,通常应用在Microsoft Office产品中。宏自动执行用户需要的不同任务。用户可为应用程序定义一系列活动和通用任务,当用户按下功能按钮时自动执行,而不是单独执行每项任务。宏病毒(macro virus)是使用这些编程语言中的一种而编写的与平台无关的病毒,它们可感染模板并在文档中复制。因为Office产品的广泛应用,并且非常容易编写,所以宏病毒十分常见。

某些病毒会感染计算机的引导区(引导区病毒(boot sector virus)),可以删除引导区内的数据或者以新的信息重写引导区。有的引导区病毒将部分代码驻留在引导区,这些代码可启动病毒,而病毒的其他部分则保存于硬盘上被标记的坏扇区。由于这些扇区被标记为坏扇区,因此不会被其他数据重写。

隐蔽性病毒(stealth virus)隐藏它对文件和引导记录所做的修改,这可通过监视系统读取文件和扇区的功能并伪造结果来完成。也就是说,当应用程序或者用户读取被感染文件或扇区时,系统将显示其原始的正常形式,而非被感染的异常形式。这种病毒可在防病毒程序进行扫描时掩盖它的宿主文件的大小或转移到另一个位置。

因此,隐藏性病毒是一种感染系统后隐藏其踪迹的病毒。一旦被感染,病毒可做出某些修改,使系统看上去完好如初。病毒可显示被感染文件的原始大小,而实际上文件会增大。

变形病毒(polymorphic virus)制作变化但仍可用的自身副本。变形病毒的目的是逃避病毒扫描。即使一两种病毒被查杀,系统中仍存在大量其他变形病毒。

变形病毒可使用不同加密方案,需要不同的加密程序。这需要防病毒程序针对各种加密方法开发不同的扫描字符串,以便标识这种病毒的所有副本。

这些病毒还可通过包含噪声(noise)或伪造的指令来改变指令与其他有用指令的顺序。它们也使用变异引擎和随机数生成器来改变指令顺序,以便躲避检测。变形病毒有改变自身代码的能力,使病毒可存在成千上万种不同的变形。病毒变形是为使病毒扫描器不能正确标识病毒并查杀。

多成分病毒(多部分病毒)同时感染硬盘引导区和可执行文件。这种病毒首先驻留在内存中,然后感染引导区。一旦驻留在内存中,它就感染了整个系统。

大脑模精品病毒(meme virus)实际上并不是计算机病毒,而是一种在网络上不断中转的电子邮件。这种邮件可能是连锁信、恶作剧式的病毒报警、宗教信息或者传销模式的邮件。这些邮件由人进行传播和复制,而非由软件复制,它们会浪费大量的带宽并散布恐怖信患。有几封这种类型的邮件描述了一些耸人听闻的病毒,实际上这些病毒并不存在。人们相信这些邮件的内容,并将这些邮件转发给他们的朋友,同时还认为自己做了件好事。实际上,他们被愚弄和欺骗,而他们自身也在散布大脑模精品病毒。

过去几年,脚本病毒(script virus)一度非常流行,并造成了巨大破坏。脚本是由解释器执行的文件。例如,Microsoft Windows Script Host用于解释不同类型的脚本语言。通过使用以Visual Basic(VBScript)、Java(Jscript)以及嵌入HTML的其他脚本语言编写的脚本文件,Web站点己变得更加动态和交互。在Web浏览器请求一个嵌入这些脚本的网页时,嵌入的这些脚本将被执行。如果它们是恶意的,那一切都会遭到破坏。这样说有点过于戏剧化。这种病毒将执行病毒创作者集成到脚本中的负载(指令),它要么向你的联系人列表中的每个人都发送自己的副本,要么删除至关重要的文件。脚本只是恶意攻击者用于实现罪恶企图的另一种感染媒介。

另一种名为隧道病毒(tunneling virus)的病毒企图将自己安装在防病毒程序下。当防病毒程序着手检查关键文件、文件大小、修改日期等方面的健康状态时,它会向操作系统提出一个请求,要求收集这些信息。现在,如果隧道病毒能将自己放在防病毒程序和操作系统之间,那么当防病毒程序发送一个收集这类信息的指令(系统调用)时,隧道病毒就可以拦截这个调用。此时,操作系统已无法响应该请求:相反,隧道病毒将做出响应,指出系统一切运行良好和健康,并且没有发现任何感染迹象。

因此,隐蔽性病毒和隧道病毒有何区别?隐蔽性病毒只是病毒中很普通的一种。是有人想隐藏其行动。隐蔽性病毒可使用隧道手段或其他手段隐藏其踪迹和行动。

恶意软件一般有下列6个主要的组件,虽然这些组件不一定全部出现:

?插入在受害系统中安装自身。

?规避使用各种方法避免被检测出来。

?清除在执行负载后删除自身。

?复制复制自身并传播到其他受害系统中。

?触发利用一个事件开始执行负载。

?负载执行它的功能(如删除文件、安装后门、利用脆弱性等)。

14.2 蠕虫

蠕虫不同于病毒,因为它不需要宿主程序就进行自我复制,是一种独立的病毒程序。蠕虫就是小程序,像病毒一样,它们被用来传输和分发恶意负载。

14.3 Rootkit

当一个系统成功地被入侵,攻击者可能试图提升自己的权限,以获得管理员或根用户级的访问权限。一旦获得高级别的访问权限,攻击者便可上传工具包,它们统称为rootkit。首先安装的通常是后门程序,从而使攻击者可在任何时间进入系统,而无须通过任何身份验证步骤。另一些常见的rootkit工具还可捕获、嗅探、攻击其他系统,并覆盖攻击者的踪迹。

攻击者通常会用新的恶意工具取代默认的系统工具,这些恶意工具共享相同的名称。它们被称为“木马程序”,因为它们会执行预先设定的功能但并不会在后台进行恶意活动。这样做是为了确保rootkit不被检测到。

大多数rootkit用木马程序来替换这些工具,因为根用户可运行ps或top命令,查看是否有后门服务在运行,从而检测是否存在攻击。但当用户运行这些木马程序之一后,攻击工具会列出后门程序以外的所有其他服务。大多数rootkit还包含嗅探器,这样数据可被攻击者捕获和读取。如果嗅探器要工作,该系统的网络接口卡(NIC)必须设置为混杂模式,这意味着它可“听到”网络链路上的所有流量。默认情况下的ipconfig实用程序允许根用户采用特定参数查看网卡(NIC)是否在混杂模式下运行。因此,rootkit还包含一个ipconfig木马程序,这会掩盖网卡处于混杂模式的事实。

rootkit通常包括“日志清理工具”,它可从系统日志中删除攻击者的活动痕迹。它们还可包含能替换find和ls等UNIX实用工具的木马程序,这样,当用户查看特定目录中的程序时,该rootkit不会被列出。

rootkit检测可能很难,因为rootkit能破坏那些想检测它的软件。检测方法包括基于行为的方法、基于签名的扫描和内存转储分析。去除rootkit可能会很复杂,尤其是在rootkit驻留在内核的情况下,重新安装操作系统可能是唯一可用的解决办法。

rootkit和它的恶意行为有许多功能,包括隐藏其他恶意软件,如密码键盘记录器和计算机病毒。rootkit也可以安装一个软件,使入侵的系统成为特定僵尸网络中的傀儡。

14.4 间谍软件和广告软件

间谍软件是一种隐蔽性恶意软件,安装在目标计算机上并收集关于受害者的敏感信息。收集的数据可用于恶意活动,如身份盗窃、发送垃圾邮件欺诈等。间谍软件还可收集有关受害人的网上浏览习惯,这常被发送者用于发送有针对性的广告垃圾邮件。它也可直接被攻击者用于向受害者的计算机执行任务,如安装软件、更改系统设置、传输浏览历史记录、记录键盘操作和截屏等。

恶意广告软件是一种可自动生成(渲染)广告的软件。这种广告可通过广告弹出窗口、用户界面组件或在其他产品的安装更新时提供。广告的目的是产生销售收入,不进行恶意活动,但一些广告使用侵入性行为,这可能导致安全和隐私问题。

14.5 僵尸网络

“bot”是“robot”的简称,它是完成作者意图的一段代码。bot允许在Web环境下以自动方式执行简单任务。虽然bot软件可用于合法目的(如网络抓取),但我们将把重点放在它如何能以恶意方式被使用。

该bot可发送一条消息给黑客,表明一个特定系统已被入侵,系统现在可被攻击者如愿使用。当黑客将这些被入侵的系统收集在一起,那么它们就被称为一个僵尸网络(network of bot)。黑客可利用所有这些系统进行功能强大的分布式拒绝服务(DDoS)攻击,甚至向垃圾邮件发送者出租这些系统。

这个僵尸网络的所有者(通常称为僵尸牧人)远程地控制系统,通常是通过互联网中继聊天(IRC)协议。

开发和利用僵尸网络的一般步骤如下:

(1)黑客发送以bot软件作为其有效负载的恶意代码。

(2)一旦安装完成后,bot登录到IRC服务器或被编码的Web服务器开展通信。于是,这个服务器就作为僵尸网络的控制服务器。

(3)垃圾邮件发送者为使用这些系统给黑客支付费用,并发送指令到控制服务器,这会导致所有受感染的系统向邮件服务器发送垃圾邮件。

僵尸网络可用于垃圾邮件、蛮力破解和DDoS攻击、点击欺诈、Fastflux 技术和传播非法材料。流量可通过IRC或HTTP,甚至通过Twitter、即时消息和其他通用的流量类型通道。发送bot指令和管理僵尸网络的服务器,通常被称为命令-控制(command-and-control,C&C)服务器,它们在同一时间可维护数千或数百万台计算机。

Fast flux是一种逃避技术。僵尸网络可使用该技术来隐藏他们使用网络钓鱼和恶意软件的真实站点。一个常用方法是快速更新DNS信息来伪装恶意网站主机位置。

14.6 逻辑炸弹

当发生特定事件时,逻辑炸弹(logic bomb)会执行某个程序或者一段代码。例如,网络管理员可安装和配置一个逻辑炸弹,使得他在被解雇时用该炸弹删除公司的整个数据库。

引发逻辑炸弹软件激活其负载执行的类型有很多种,如时间和日期,或者在用户执行了一个具体的操作后。比如,许多时候受损系统都安装有逻辑炸弹,如果有人进行取证活动,逻辑炸弹便会启动并删除所有数字证据。这会妨碍调查人员成功取证,并帮助攻击者隐藏身份和方法。

14.7 特洛伊木马

特洛伊木马(Trojan horse)是一种伪装成另一个程序的程序。例如,特洛伊木马可命名为Notepad.exe,并与正常的Notepad程序有同样的图标。然而当用户执行Notepad.exe时,该程序会删除系统文件。有的特洛伊木马可执行正常程序的功能,但同时在后台执行恶意功能。因此,名为Notepad.exe的特洛伊木马可能会为用户正常执行Notepad的功能,但在后台会操纵文件或者实施其他恶意行为。

远程访问特洛伊木马(Remote Access Trojan,RAT)是在受害系统上运行的一种恶意代码,允许入侵者远程操作受害系统。

14.8 防病毒软件

传统的防病毒软件使用病毒特征来检测恶意代码。病毒特征是防病毒软件供应商建立的一个指纹,它是从病毒本身中抽取出的一个代码序列。就像我们人体内有标识和寻找某一类外来物质的抗体一样,防病毒软件包中有一个引擎,它使用这些病毒特征库来标识恶意软件。防病毒软件扫描通过特定协议传递的文件、电子邮件和其他数据,然后将它们与病毒特征数据库进行比较。如果存在匹配,那么防病毒软件将执行预先配置的活动,如隔离文件、尝试净化文件(去除病毒)、向用户发送一个警告消息对话框和/或记录这个事件。

特征型检测(signature-based detection,也称为指纹检测(fingerprint detection))是检测恶意软件的一种有效手段,但它对新出现的威胁的响应时间有所延迟。检测出一个病毒后,防病毒软件供应商必须研究这个病毒,开发和测试新的病毒特征,发布该病毒特征,并且所有客户都必须进行下载。

启发式检则(heuristic detection)。这种方法会分析恶意代码的总体结构,评估编码指令和逻辑功能,并研究病毒或蠕虫内的数据类型。因此,它收集与这段代码有关的大量信怠,并评估其作为恶意代码的可能性。这种方法采用一个“可疑性计数器”,该计数器的计数将随着程序发现潜在的恶意属性的增多而递增。如果计数器超过某个预先设定的限值,就确认该代码为危险代码,防病毒软件会立即采取行动以对系统进行保护。这使得防病毒软件能检测出未知的恶意软件,而不是仅依靠病毒特征。

某些防病毒产品创建了一个模拟的环境(名为虚拟机或沙箱),并允许可疑代码中的某种逻辑在这个受保护的环境中执行。这使得防病毒软件可以动态检查可疑代码,获得与该代码有关的更多信息,从而判定它是否为恶意代码。

虚拟机或沙箱有时也称为模拟缓冲区(emulation buffer)。它们都指同一件事物,即一段已分区并受保护的内存。如果代码是恶意的,系统将受到保护。

审查与一段代码有关的信息称为静态分析(static analysis),而允许一部分代码在虚拟机中运行则称为动态分析(dynamic analysis)。它们都是启发式检测方法。

防病毒软件发展的下一个阶段称为行为阻止器(behavior blocker)。实施行为阻止(behavior blocking)的防病毒软件允许可疑代码在未受保护的操作系统中运行,监控它与操作系统的交互,并从中寻找可疑活动。

?写入启动文件或注册表中的Run键。

?打开、删除或修改文件。

?在电子邮件中插入脚本,以发送可执行代码。

?连接到网络共享文件或资源。

?修改一个可执行文件的逻辑。

?创建或修改宏和脚本。

?格式化硬盘或写入引导区。

某些防病毒软件使用的另一种方法名为免疫(immunization)。拥有这种功能的产品看上去就像一个已经被感染的文件、程序或磁盘。免疫程序(immunizer)将代码附加到文件或应用程序上,以此欺骗病毒,使它“认为”文件或应用程序已被感染。这样,病毒就不会感染这个文件(或应用程序)而是转向下一个文件。

启发式检测和行为阻止采取主动防御,因而能检测出新的恶意软件,有时也称为“零日”攻击。特征型检测则不能检测出新的恶意软件。

14.9 垃圾邮件检测

贝叶斯过滤(Bayesian filtering)通过审查前面的事件来预测将来的事件,这基本上是量化不确定性。贝叶斯过滤器会对电子邮件中的单词应用统计模型。也就是说,它对邮件中的单词使用数学公式,以充分了解它们彼此之间的关系。贝叶斯过滤器对每个单词进行频率分析,然后对邮件进行整体评估,从而确定它是否为垃圾邮件。

14.10 防恶意软件程序

许多组织机构都在网络入口点实现了防病毒解决方案。扫描软件可集成到邮件服务代理服务器或防火墙中(它们有时也称为病毒墙)。这些软件扫描进入的流量是否存在恶意软件,从而将它们检测出来,并阻止其进入网络。

15 评估外部获取软件的安全性

我们降低外部软件风险的方法将从对供应商的评估开始。低风险供应商的特性包括供应商的声誉和其补丁推送的规律性。相反,如果供应商是小公司或新公司,他们的开发过程不成熟或未经授权,或者他们的产品有较高的市场占有率(这意味着它们是更有利可图的目标),那么这些供应商面临的风险可能更大。

评估外部软件的安全性的一个关键因素显然是它在内部评估中的表现。理想情况下,我们能从供应商那里获得源代码,这样我们就可以进行自己的代码审查、漏洞评估和渗透测试。然而许多情况下这是不可能的。我们唯一可能的评估是渗透测试。问题是我们的内部能力可能不足以执行这样的测试。这种情况下,取决于该软件所带来的潜在风险,我们建议最好聘请外部团队进行独立的渗透测试。这很可能代价高昂,除非该软件在遭受攻击,否则可能导致本组织的重大损失。

即使在最有限的条件下,我们仍能降低外部软件的风险。如果我们不能做代码审查、漏洞评估和渗透测试,我们仍可通过只在特定的子网安装该软件,通过采用固定配置以及用受限的IDS/IPS规则对其进行监控以降低外部软件的风险。虽然这种方法最初可能导致入侵检测/防御系统功能受限和过度的误报,但当我们保证软件可信之后,我们可以逐渐放松控制。


责任编辑:项目管理的一些事
热门阅读排行
© 16货源网 1064879863