系统开发概述
时间:2023年5月7日 星期日
作者:小王
一、软件开发
1.编程语言
• 机器语言(machine language):1和0组成,人类无法直接理解。
• 汇编语言(Assembly language):较机器语言高级点,但仍很麻烦。
• 编译型语言(compiled languages):如C、Java等,通常无法直接查看到源码,但可通过逆向工程尝试获取源码。
• 解释型语言(interpreted languages):如Python、Java Script等,用户能够直接查看编程人员的原始指令。
某些情况下,语言依赖运行时环境(runtime environments)来允许跨不同操作系统执行代码,如JVM。
2.库文件
开发人员依赖包含重用代码的共享软件库文件(software libraries),能给提高开发人员的效率。使用共享库文件会导致安全问题,如心脏滴血漏洞(Heartbleed),因此在使用共享库文件前应评估其安全性。
3.开发工具集
开发人员也使用集成开发环境(IDE)来提升工作效率,IDE可以编写、测试、调试、和编译代码,如PyCharm。
4.面向对象编程(OOP)
OOP关注交互所涉及的对象,对象协调工作提供系统功能。OOP提倡高内聚、低耦合,每个开发人员只需要负责开发自己的对象方法,不需要关心其他人的代码是如何实现的,提高了编程的效率、故障排查效率。
5.保证
管理员使用保证程序(assurance procedures)来确保新应用程序中内置的安全控制机制在整个生命周期内正确地实施安全策略,可参考通用准则(CC)。
6.避免和缓解系统故障
• 输入验证:对输入的值进行检查,对数字范围进行检查被称为限制检查(limit check),如日转账限制;对特殊字符进行检查并替换被称为转义输入(escaping input),如替换等号或尖括号等;输入验证建议在服务器端实现,客户端浏览器代码易被绕过。
• 身份验证和会话管理:应用程序应要求用户完成身份验证才可进行后续行动,并对用户的会话进行全程跟踪。
• 错误处理:详细的错误消息,对定位bug非常便利,但也可能泄漏信息造成安全风险,应禁止非授权访问错误消息。
• 日志记录:详细的日志记录能够协助定位安全事故。
• 故障防护和应急开放:故障防护(fail-secure)适用于安全性要求高的环境中,故障后什么也做不了;应急开放(fail-open)适用于安全性要求不高的环境中,故障后所有安全控制失效,优先保证用户行动。
二、系统开发生命周期
必考
1.概念定义
定义要开发一个什么系统,如OA。该阶段也涉及开发高级别安全需求,在控制规范开发阶段完善,如数据分类和安全要求。
2.功能需求确定
确定系统所拥有的功能,如OA中的流程审批功能。功能需求涉及输入、行为和输出。
3.控制规范开发
完成系统控制规范的开发,如身份验证和授权、日志记录、容错性等,安全性设计的融入应该贯穿整个生命周期。
4.设计审查
设计人员完成系统各功能如何协同工作、工作任务清单、以及阶段里程碑对应的时间表,并上会进行审查。
5.编码
开发人员依据设计文档开始写代码,并遵循控制规范。
6.代码审查走查
项目经理在里程碑处组织代码评审会议,修复代码编写的漏洞。
7.系统测试审查
代码完成编写和审查后,模拟用户常规和非常规行为进行系统测试,多次回归测试(regression testing)系统稳定后进入用户验收测试(UAT),UAT完成后代码就可以部署到生产环境中。
8.维护和变更管理
随着系统的使用,可能会有新漏洞、新需求、环境变化等因素需要进行维护,任何改变都需要走变更管理流程。
SDLC可以使用许多开发模型之一,包括瀑布模型和螺旋模型。 SDLC不强制使用迭代或顺序方法;它允许任何一种方法。
三、生命周期模型
1.瀑布模型
一个阶段完成后经过验证后才能进入下一个阶段,如果发生错误只能回退一个阶段,适合严谨、安全要求高的软件开发项目。
2.螺旋模型
由于瀑布的死板,开发了可以多次反复、灵活性高的螺旋模型。
3.敏捷软件开发
敏捷开发宣言核心就一个字“快”:
• 个体与交互优于过程与工具
• 有效的软件优于完整的文档
• 客户合作优于合同谈判
• 响应变更优于遵循计划
敏捷开发具体的方法有:
• 迭代式增量软件开发过程(Scrum)
• 看板管理(Kanban)
• 快速应用开发(RAD)
• 敏捷统一过程(AUP)
• 动态系统开发模型(DSDM)
• 极限编程(XP)
其中,Scrum最受欢迎。Scrum的特色是每天要开会,由Scrum Master主持,负责推动项目进度,即项目经理的角色。Scrum将任务组织成冲刺(sprints)活动,即开发活动,每完成一次冲刺,系统就能够上线运行,可能功能不全,但后续的每次冲刺都完善其功能,可参考微信的开发模式。
4.能力成熟度模型
软件成熟度模型(SCMM、SW-CMM、CMM,同义词)描述了从事软件开发组织经历的不同成熟阶段,用来衡量软件开发能力。
• L1-初始(Initial):通常很少或没有定义软件开发过程。(瞎开发)
• L2-重复(Repeatable):基本生命周期管理流程出现。(复用代码)
• L3-定义(Defined):开发人员依照一系列正式、文档化的软件开发过程进行操作。
• L4-管理(Managed):量化软件开发过程。(搞KPI)
• L5-优化(Optimizing):持续改进软件开发过程。
CMM已经被CMMI(能力成熟度模型集成)替代,CMMI第四阶段称为定量管理(Quantitatively Managed),且侧重于不同阶段间集成。
5.软件保证成熟度模型
软件保证成熟度模型(SAMM)是OWASP维护的开源项目,将安全活动集成到软件开发和维护过程中,为组织提供评估其成熟度的能力。SAMM将软件开发过程划分为五个业务功能:
• 治理(Governance):组织为管理软件开发过程而进行的活动。
• 设计(Design):组织用于定义软件需求和创建软件的过程。
• 实施(Implementation):建立和部署软件组件并管理这些组件缺陷的过程。
• 验证(Verification):组织为确认代码满足业务和安全要求而开展的活动。
• 运营(Operations):组织在生命周期中维护安全性而采取的行动。
6.IDEAL模型
代表过程改进活动的生命周期,共有五个阶段:
• 启动(Initiating):确定改进的目标并活动相关支持。
• 诊断(Diagnosing):确定目标与现状的差异。
• 建立(Establishing):制定实现目的的计划。
• 行动(Acting):根据计划开始干。
• 学习(Learning):总结经验教训。
四、甘特图和PERT
甘特图是一种显示不同时间项目和进度之间相互关系的条形图。
项目评估审查技术(PERT)是一种项目调度工具,用于判断软件产品大小和计算风险评估标准差。
五、变更和配置管理
软件投入使用后也会面临各种变更(如新功能、改bug等),因此需要进行变更管理。
• 请求控制:该过程用户请求软件变更,管理人员执行成本/效益分析,开发人员优化任务。-提需求
• 变更控制:该过程开发人员解决用户需求,开发新功能或修复漏洞。-写代码
• 发布控制:完成新代码的开发后,经过用户验收测试发布到生产环境。-部署
除了变更管理外,软件配置管理也非常重要,用于控制软件版本、跟踪和控制软件配置的变更。
• 配置标识:管理员文档化组织内容软件产品的配置。
• 配置控制:确保软件版本的变更符合变更控制和配置管理策略。
• 配置状态统计:跟踪所有授权变更。
• 配置审计:定期开展配置审计,确保没有发生未授权配置变更。
六、DevOps方法
DevOps用于解决IT部门间互不合作、提皮球等问题,将软件开发、质量保证和技术运营整合到一起,DevOps模型的三个组件是软件开发、操作和质量保证。DevOps模型与敏捷开发方法紧密配合,减少开发、测试、部署软件所需的时间。DevOps基于自动化可实现持续集成/持续交付(CI/CD)的目标。快速开发和投产不能忽略安全性,也需要集成安全控制,因此提出了DevSecOps方法。
七、应用程序编程接口
现如今的系统都不在是独立系统,往往需要系统间交互,因此提供了应用程序编程接口(API)。
• API必须考虑身份验证,通常通过API密钥来完成。
• API也必须经过安全测试,以避免出现安全漏洞。
• curl可用于测试API,也可被黑客用于攻击API。
八、软件测试
代码在投产前应进行彻底地测试,需要考虑以下内容:
1.合理性检查(reasonableness check):确保返回的值符合常理,如身高超过10米、存款余额-1000元等。
2.用例和误用案例(use cases/misuse cases):测试应结合正常用户和非正常用户活动进行测试。
3.职责分离:软件测试应该由非开发人员进行,保持软件测试的独立性。
4.软件测试理念:根据查看代码的多少,有黑盒测试、灰盒测试、白盒测试,与渗透测试理念一致。
九、代码仓库
代码仓库(Code repositories)用于集中存储代码,还提供版本控制、bug跟踪、Web托管等功能,如GitHub。
代码仓库的风险之一就是访问控制,涉及机密信息的代码需管控访问权限,避免敏感信息泄密。
十、服务水平协议
服务水平协议(SLA)确保供应商提供的服务或产品满足合同要求,不满足则会涉及对供应商的处罚措施。
十一、第三方软件购置
组织的大多数软件不是内部开发的,通常有几个途径:
1.商用现货(COTS):具有标准协议或接口的软件或硬件产品,也就是成熟的商业产品,如用友的财务软件。
2.软件即服务(SaaS):云服务,如邮件系统。
3.开源软件(OSS):开源项目提供的免费软件。
无论采用哪种方法获取软件,都需要进行安全测试以确保安全性。