安全产品设计速查表¶
简介¶
安全产品设计的目的是确保所有产品在开发生命周期中达到或超越组织规定的安全要求,并确保所有关于开发中产品的安全决策都是明确的选择,并为开发中的产品带来正确的安全级别。
方法论¶
作为基本起点,应建立安全默认设置,最小化攻击面,并安全地回退到那些定义良好且易于理解的默认设置。
安全产品设计通过以下两个过程实现
- 产品构思;和
- 产品设计
第一个过程发生在产品构思阶段,或现有产品正在重新开发时。第二个过程是持续的、演进的,并以敏捷方式进行,紧邻代码编写的环节。
安全原则¶
1. 最小权限和职责分离原则¶
最小权限是一项安全原则,它规定用户应仅被授予执行其工作所需的最低限度访问权限。这意味着用户只能访问其工作所需的资源,不能多。这有助于降低未经授权访问敏感数据或系统的风险,因为用户只能访问他们所需的资源。最小权限是一项重要的安全原则,应予以遵守以确保组织数据和系统的安全。
职责分离是企业和组织内部控制的一项基本原则。它是一个制衡系统,确保没有单个个人能够控制交易的所有方面。这是通过将不同的任务分配给不同的人来实现的,这样没有人能够控制整个过程。这有助于降低欺诈和错误的风险,并确保所有任务及时完成。职责分离是任何组织内部控制系统的重要组成部分,对于维护组织财务记录的完整性至关重要。
2. 纵深防御原则¶
纵深防御原则是一种安全策略,它涉及多层安全控制来保护组织资产。其理念是,如果一层安全措施失效,其他层仍能保护资产。安全层可以包括物理安全、网络安全、应用安全和数据安全。纵深防御的目标是创建一个能够抵御攻击并能快速检测和响应任何安全事件的安全环境。通过实施多层安全,组织可以降低成功攻击的风险,并最大限度地减少任何成功攻击造成的损害。
3. 零信任原则¶
零信任是一种安全模型,它假设所有用户、设备和网络都是不可信的,在授予访问权限之前必须进行验证。它基于这样的理念:组织不应信任任何用户、设备或网络,即使它们位于组织网络内部。相反,所有访问请求都必须经过身份验证和授权后才能授予访问权限。零信任还要求组织持续监控和审计用户活动,以确保仅向需要访问的用户授予权限。此模型旨在通过确保只有授权用户才能访问敏感数据来降低数据泄露和其他安全事件的风险。
4. 开放安全原则¶
开放安全是一个强调开源软件开发中安全重要性的概念。它侧重于开发人员需要了解其代码的安全影响,并采取措施确保代码安全。这包括使用安全编码实践、测试漏洞以及使用安全开发工具。开放安全还鼓励开发人员与安全专家合作,以确保其代码安全。
安全重点领域¶
1. 上下文¶
正在考虑的应用程序在组织生态系统中处于何种位置,哪些部门因何原因使用它?它可能包含哪些类型的数据,由此产生的风险概况如何?
用于构建应用程序安全上下文的过程包括威胁建模——这导致在产品设计的每次产品交付迭代中添加安全相关的故事——以及在执行业务影响评估时——这导致在产品构思期间为给定产品设置正确的产品安全级别。
上下文至关重要,因为过度追求安全性在成本方面可能比过度追求规模或性能带来更大的影响,而安全设计不足也可能导致灾难性后果。
2. 组件¶
从应用程序使用的库(在任何产品设计阶段选择)到它可能使用的外部服务(这些服务通常在产品构思期间发生变化),是什么构成了这个应用程序以及这些部分如何保持安全?为此,我们利用您的黄金路径/铺路文档中定义的安全设计模式库和现成的组件,并通过威胁建模分析这些选择。
此组件审查的一部分还必须包括选择正确组件(许可和维护)的更多商业方面,以及可能需要的使用限制。
3. 连接¶
您如何与此应用程序交互,以及它如何连接到前面提到的那些组件和服务?数据存储在哪里,如何访问?连接也可以描述任何有意缺失的连接。请考虑根据所需的产品安全级别可能需要的分层隔离,以及如果不同租户需要,可能需要的数据或整个环境的隔离。
添加(或移除)连接可能表明产品构思正在进行。
4. 代码¶
代码是产品意图的最终体现,因此它必须首先具有功能性。但其功能提供的质量必须达到或超越预期。
安全编码的一些基本要求包括
- 输入验证:在处理所有输入数据之前,验证其类型、格式和长度是否有效且符合预期。这有助于防止 SQL 注入和缓冲区溢出等攻击。
- 错误处理:以安全的方式处理错误和异常,例如以安全的方式记录它们,并且不向攻击者泄露敏感信息。
- 认证与授权:实施强大的认证和授权机制,以确保只有授权用户才能访问敏感数据和资源。
- 加密:使用加密函数和协议保护传输中和静态的数据,例如 HTTPS 和加密——给定产品安全级别的预期级别通常可以通过查阅您的黄金路径/铺路文档找到。
- 最小权限:编写代码时使用最小权限原则,以便代码及其运行的系统被授予执行其功能所需的最低访问权限。
- 安全内存管理:使用黄金路径/铺路文档中推荐的高级语言或正确管理内存,以防止缓冲区溢出和释放后使用(use-after-free)等内存相关漏洞。
- 避免硬编码秘密:代码中应避免硬编码的秘密,例如密码和加密密钥,而应将其存储在安全存储中。
- 安全测试:在开发期间和部署前对软件进行安全漏洞测试。
- 审计和审查代码:定期审计和审查代码以查找安全漏洞,例如使用自动化工具或由第三方审查代码。
- 保持最新:使代码与最新的安全最佳实践和漏洞修复保持同步,以确保软件尽可能安全。
确保您在应用程序的每个层(例如,从前端到后端)集成合理性检查,并确保编写单元测试和集成测试以验证在威胁建模期间发现的所有威胁都已缓解到组织可接受的风险级别。利用这些来为您的应用程序的每个层编译用例和滥用案例。
5. 配置¶
如果应用程序没有安全配置,那么安全地构建它也可能功亏一篑。我们至少应确保以下几点:
- 牢记最小权限原则:限制系统组件和用户的访问和权限,使其仅限于执行其任务所需的最低限度。
- 记住纵深防御:实施多层安全控制,以防范各种威胁。
- 确保默认安全:配置系统和软件使其默认安全,只需最少的手动设置或配置。
- 安全数据:通过对传输中和静态的敏感数据(例如个人信息和财务数据)进行加密来保护它们。保护数据还意味着确保其正确备份,并且为所需的产品安全级别正确设置数据保留策略。
- 计划让配置安全失败:设计系统以安全状态失败,而不是在出现故障时暴露漏洞。
- 始终使用安全通信:使用安全协议进行通信,例如 HTTPS,以防窃听和篡改。
- 执行定期更新——或利用维护的镜像:使软件、Docker 镜像和基础操作系统与最新安全补丁保持同步是维护安全系统的重要组成部分。
- 制定并演练安全事件响应计划:制定应对安全事件的计划对于最大程度地减少任何成功攻击造成的损害至关重要,也是产品支持模型的一个关键组成部分。
有关如何精确确保安全配置的详细信息,请参见基础设施即代码安全速查表