Skip to main content

DevSecOps最佳实践终极指南

顾名思义,DevSecOps就是在DevOps流程中加入安全性(security)。

多年以来,不从事安全性问题的开发者会感觉安全工具和安全知识难以掌握。这一情况在最近几年很快有了转变。

现在,开发者和DevOps工程师可以利用现有工具,通过简单步骤快速打造更加安全的应用。

来看看在DevOps流程中实现安全性的最佳实践吧 👉

1. 一切检测自动化⚙️

安全流程应尽量做到流畅丝滑,可以使用能够在CI/CD管道内和pre-commit 钩子上运行的自动化工具,或者能够定期对暂存环境进行测试的自动化工具。

任何人工操作都有被遗忘的可能,因此要让安全检查成为一个强制但十分简易的过程。

2. 检查开源依赖📦

开源有很多好处,但也意味着你的项目中会有来自陌生人的代码。

这样可能面临两种问题:

  • 你使用的依赖库的维护者无意间在他的软件包内引入了一个漏洞,结果是你瞬间中招

  • 最糟糕的情况是,某个软件包贡献者故意引入恶意代码,而维护者没有察觉。这个恶意贡献者立刻就可以访问你的整个应用。 坏消息是,这一攻击手段在2021年增长了650%

不过,有一些简单易用的工具可以快速检查你所使用的软件包:

  • trivy是一个非常好用的CLI工具,可以在操作系统和特定语言的软件包中找到有漏洞的依赖。这里有一个教程,讲解如何使用它扫描docker镜像。

  • npm audityarn audit,用于检查nodejs软件包。

  • Safety,用于检查python软件包,这里也有教程

  • 以及类似的用于所有常见语言的软件包。

这些工具大多几秒钟内即可完成扫描,并且可以轻松集成到CI/CD或git挂钩中。

3. 审核代码 👩‍💻

漏洞同样可能来源于你所写的代码本身。

对于一个大型应用,谁能知道用户的每个输入是否被正确转义了?或者数据库调用是否与用户提供的数据隔离了?

好在全新的开源工具semgrep可以解决这一问题,它的灵感来源于grep,但针对的是源代码模式,是一个直接有效的代码安全保障工具。

我写了一个教程讲解如何简单几步设置semgrep。

值得一提的是,Github的CodeQL和SonarSource这样的商业软件可以达到同样的效果,但我觉得semgrep更加易用。

4. 检查API🕸

e2e测试不仅可以用于测试应用的功能,还可以进行动态应用安全测试(Dynamic Application Security Testing)。

e2e测试工具可以通过HTTP请求与你的API或网页应用互动,尝试找到安全漏洞,它通常会针对暂存区进行检查,或在CI/CD内运行。

Project discovery最近的开源项目nuclei能够优雅地实现以上功能。这里有一个十分全面的教程,介绍如何在GitHub Actions里设置nuclei。😏

请注意:我们的Escape团队创建了一个开发者友好的安全扫描器,这是第一个专门用于测试GraphQL端点安全性的扫描器。目前只有收到邀请者才能使用,但你可以在这里填写等待名单。期待你的反馈!

5. 严防泄密🔐

像API密钥、数据库凭证或SSH密钥这样的机密配置信息经常被直接泄露到git仓库。

在组织内部泄密已经很糟糕了,如果仓库是公开的,后果将更加不堪设想。

为解决这个问题,可以使用git-secretstalisman来添加pre-commit钩子,在提交前检测密码和其他机密信息。

6. 监控,监控,还是监控 📈

了解你的应用运行时发生了什么,也是拥有安全生产环境的重要一步。

如果有1000个请求对你的API发起冲击,试图进行SQL注入,至少你应该得到通知,知道出了问题。网络应用防火墙可以解决一部分问题,但更好的办法是进行严格的监控。

安全监控工具被称为SIEM,意思是安全信息和事件管理(Security Information and Event Management)(我尽量避免使用行业术语,但这个很重要!)。

可以使用SIEM补足the Elastic Suite的功能。The Elastic Suite仓库中甚至提供了使用案例。但要注意,遗憾的是,安全监控是目前最不“顺滑”的DevSecOps任务,只能使用开源工具实现。

7. 团队训练🪑

为什么这个标题的表情符是一把椅子?因为有句话是这么说的:

“问题发生在键盘和椅子之间。”

这句话尤其适用于网络安全,也适用于开发者(包括我自己!)。幸运的是,开发者学习速度很快,只需几个措施就能提高他们的风险意识:

8. 花点时间思考🤔

这张meme图甚至无需任何配文

善用工具是一个好的开始,但还可以更进一步。

如果你已经实行了适当的测试、培训和监控措施,那么接下来只需拿起一支笔(如果你在办公室),或打开一个共享markdown文稿(如果你是远程办公),花点时间思考以下问题:

  • 你的应用程序哪部分是最关键的?

  • 哪里有漏洞?

  • 哪些人会想要攻击漏洞?

  • 他们会怎么攻击?

然后将安全加固工作的重心放在这么做投资回报率最高的地方。

这一过程就叫做威胁建模。相比这篇文章的其他部分,威胁建模的话题略显高阶,不过我想要在文章最后诱发大家思考。

总结一下😎

① 一切检查自动化

② 使用trivy扫描你的依赖

③ 使用semgrep扫描代码

④ 使用nuclei扫描网页应用

⑤ 使用SIEM+the Elastic Suite进行监控

⑥ 来杯咖啡☕️,想一想你面临的威胁,在正确的地方加固应用

更多信息🛰

想要获取更多有关信息,可以访问以下链接: