跳到主要内容

安全编码实践--开发人员开发安全软件的学习经历课程

通过 8月 11, 2022博客

作者:Harimohan Rajamohanan,Wipro有限公司

如今,所有的软件都在不断受到攻击,所以软件架构师和开发人员应该把重点放在提高信息安全的实际步骤上。网上有很多材料谈到了安全开发实践的各个方面,但它们分散在各种文章和书籍中。最近,我看到了一个由开源安全基金会(OpenSSF)开发的课程,它是Linux基金会的一部分,面向软件开发人员、DevOps专业人士、网络应用程序开发员和其他对学习安全软件开发的最佳实践感兴趣的人。我的学习经历 开发安全软件 (LFD121) 课程是积极的,我立即开始在我作为软件架构师和开发人员的工作中应用这些学习内容。

"创建安全系统的一个有用的技巧是,在你写代码或对代码进行修改之前,要像攻击者一样思考"-- 开发安全软件 (LFD121)

我早期对软件安全的理解主要集中在用户的认证和授权方面。在这种情况下,我所遵循的安全编码实践仅限于。

  • 没有未经授权的阅读
  • 没有未经授权的修改
  • 有能力证明某人做了什么
  • 审计和记录

如果有一个强大的认证和授权机制,就认为一个软件是安全的,这可能还不够宽泛。如今几乎所有的应用开发都依赖于开源软件,开发者必须验证开源贡献者链及其依赖关系的安全性。最近的漏洞披露和供应链攻击让我大开眼界,了解到开源软件中存在的潜在漏洞。大多数开发者的自然关注点是让业务逻辑正常运行,并在没有任何功能错误的情况下交付代码。

该课程使我对安全开发实践有了全面的认识,一个人应该遵循安全开发实践,以抵御现代软件中发生的那种攻击。

风险管理的真正含义是什么?

该课程在考虑安全作为系统要求的一部分方面有详细的实用建议。作为各种全球系统集成商的一部分,在过去的十多年里,我的任务是为客户开发应用软件。在这样的项目中,功能需求通常被写下来,但只包括用户认证和授权方面的几个安全方面。详细记录安全需求将有助于软件的开发者和未来的维护者了解系统在安全方面所要完成的任务。

关于风险评估的主要启示。

  • 分析安全基础知识,包括风险管理、"CIA "三位一体和要求。
  • 应用安全设计原则,如最小权限、完全调解和输入验证等
  • 供应链评估提示,如何在考虑安全的前提下重复使用软件,包括选择、下载、安装和更新此类软件
  • 在一个地方记录高级安全要求

设计软件解决方案时的安全设计原则

设计原则是基于经验和实践的指南。如果你应用了安全的设计原则,软件一般都会是安全的。这门课程涵盖了广泛的设计原则,即你信任的组件和你不信任的组件。我从这门课程中学到的指导我现今软件设计领域的关键原则是。

  • 用户和程序应使用最少的权限进行操作。这限制了错误或攻击带来的损害。
  • 每一个数据访问或操作的尝试都应该使用一个无法绕过的机制进行验证和授权。
  • 对系统的访问应基于一个以上的条件。你如何证明被认证的用户的身份是他们声称的人?软件应该支持双因素认证。
  • 用户界面的设计应便于使用,以确保用户常规地、自动地正确使用保护机制。
  • 了解你期望反击什么样的攻击者的重要性。

几个例子说明我是如何在我的方案设计中应用安全设计原则的。

  • 我建立的解决方案经常使用数据库。我使用了SQL GRANT命令来限制程序获得的权限。特别是,DELETE权限不给任何程序。而且我在程序中实现了一个软删除机制,为删除用例在表中设置 "active = false "列。
  • 我最近做的软件设计是基于微服务架构的,其中GUI和后端服务之间有明确的分离。整体解决方案的每一部分都是单独认证的。这可能使攻击面最小化。
  • 客户端的输入验证仅限于应对意外的错误。但实际的输入验证发生在服务器端。API端点在处理之前会彻底验证所有的输入。例如,PUT API不仅验证资源修改的输入,而且在进行更新之前,还要确保资源在数据库中是存在的。
  • 只有在消费API的用户被授权的情况下,才允许进行更新。
  • 数据库不能被客户应用直接访问使用。
  • 所有的秘密,如加密密钥和密码,都被保存在程序之外的一个安全的保险库中。这主要是为了避免源代码中的秘密进入版本控制系统。
  • 我已经开始在我的程序中选择开源软件和库时,寻找OpenSSF最佳实践徽章。我还通过检查OpenSSF评分卡的分数来寻找开源软件的安全态势。
  • 在使用开放源码软件时,我遵循的另一个做法是检查该软件是否被维护。是否有最近的版本或社区的公告?

安全编码实践

在我看来,这个课程几乎涵盖了开发人员应该关注的安全编码实践的所有方面。关键的重点领域包括。

  1. 输入验证
  2. 如何验证数字
  3. 文本的关键问题,包括Unicode和区域码
  4. 使用正则表达式来验证文本输入
  5. 尽量减少攻击面的重要性
  6. 安全默认值和安全启动。

例如,对ID应用API输入验证,确保属于这些ID的记录存在于数据库中。这就减少了攻击面。同时,首先确保对象修改请求中的对象存在于数据库中。

  • 安全地处理数据
  • 将不可信任的数据视为危险数据的重要性
  • 避免默认和硬编码的凭证
  • 了解内存安全问题,如越界读或写、无双和无用后的问题。
  • 避免未定义的行为
  • 向其他项目发出呼吁
  • 安全地调用其他程序
  • 如何应对注入式攻击,如SQL注入和操作系统命令注入
  • 安全地处理文件名和文件路径
  • 发送输出
  • 安全地发送输出
  • 如何应对跨站脚本(XSS)攻击
  • 使用HTTP加固头,包括内容安全策略(CSP)。
  • 防止网络应用中常见的与输出有关的漏洞
  • 如何安全地格式化字符串和模板。

总结

"安全是一个过程--一个旅程--而不是一个简单的终点" -- 开发安全软件 (LFD121)

本课程为你开发安全软件提供了实用的指导方法,同时考虑到了安全要求、安全设计原则、反击常见的实施错误、在发送代码前检测问题的工具、及时处理漏洞报告。我强烈推荐这个 课程和认证 给所有的开发者。

 

关于作者

Harimohan Rajamohanan: Wipro有限公司Lab45开源项目办公室的解决方案架构师和全栈开发人员。他是一个开源软件的爱好者。曾在应用现代化、数字化转型、云原生计算等领域工作。主要关注领域是软件供应链安全和可观察性。

 

这篇文章代表作者的观点,不一定反映所有OpenSSF成员的观点。