72 个网络应用安全实操要点,全方位保护 Web 应用的安全( 四 )


但仅了解情况是不够的,还需要做出如下准备:
六、开发管理
63、威胁模型
系统地考虑一下“可能会出现哪些问题”并据此做出调整 。设计一个新的系统时,越早开始这一步越好 。当对系统发生改变时,再重新梳理一遍这个过程 。
例如:
小王:如果攻击者攻破了我们连接了互联网的服务器,怎么办?
小陈:那可就完蛋了!
小王:好吧!这就说明我们在这里存在着一个信任关系,我们认为连接了互联网的服务器是不会被攻破的 。我们可以信任这一点吗?
小陈:未必吧!有一百种可能导致我们的服务器被黑掉,例如我们代码中存在的脆弱性,或者依赖中存在的脆弱性,或者是我们 Web 服务器所安装软件的脆弱性 。
小王:好吧!那就让我们打破这层信任关系 。接下来该做些什么呢?
小陈:我们这样来分解一下系统:创建一些内部的接口用来实际访问数据库,由此以来,前端的 Web 服务器就不能直接访问后台的所有东西 。
小王:这是个好办法!除此以外,还有其它什么可能出问题呢?
小陈:嗯,如果黑客攻破了我们的内网呢?
小王:那所有东西都要丢失了,因为内网里服务器之间的连接都是未加密的 。
小陈:……
这就是威胁模型,它不需要多么复杂 。使用这种方式,来找出系统中可能存在的威胁 。
64、源代码强制审查
通过技术控制手段,防止代码未经他人审核便提交入库 。这是构建安全开发环境的基础,因为它可以做到:
1.如果攻击者攻陷了一个开发人员的电脑,或者是开发人员自身企图发起攻击,将不能直接将恶意代码迁入代码库;2.如果开发人员的错误导致引入了有漏洞的代码,很可能在被其他人检查时及时发现 。### 65、自动化持续集成管道,仅允许简单访问
开发人员应该有权限触发构建,且权限配置也仅该如此,不要再允许其它权限 。单个开发人员应该不能在构建阶段引入任意代码 。当然,如果像上文推荐的强制性地采用了代码审查,也可以保存在版本管理工具中 。
66、对进行签名
如果是构建容器镜像,可以把对镜像签名作为构建的一步 。将签名密钥存储在安全的地方 。构建阶段需要访问密钥,但是杜绝将密钥与一起存储在版本管理工具中 。更好的方式是将密钥存储在Vault 之类的地方,然后在构建时再进行拉取 。
67、持续集成管道中加入静态应用程序扫描器
在持续集成管道中使用和 Find-Sec-Bugs(或者根据你所采用的技术栈进行选择)之类的工具 。它们可以帮你在部署代码之前发现已知的漏洞 。
此外,也可以作为 IDE 的插件安装在开发人员的电脑上,在代码迁入之前就运行这些工具进行检查 。
68、构建时对依赖进行检查,保证最小的依赖集
应用程序中依赖的每个软件包都是一个风险来源 。通过依赖,我们拉取了第三人的代码并在我们的应用服务器上执行,所以,必须要搞清楚我们依赖的这个软件包是什么,为什么会依赖它?
1.保持最小的依赖集;2.仅使用我们所信任的依赖 。它们必须是广泛使用和广为人知的;3.采用构建框架,对依赖进行确认 。此外,严格控制应用服务器的对外连接,从而避免后门的存在 。
69、对依赖进行安全扫描
使用 OWASP 依赖检查工具对依赖中常见的安全问题进行扫描 。除了在持续集成管道中,也可以在开发人员的开发环境运行这些工具 。
70、持续集成管道对镜像进行安全扫描
如果采用了容器化技术,可以使用 Trivy 等工具对容器镜像进行一些常规漏洞的扫描 。