服务器之家:专注于服务器技术及软件下载分享
分类导航

云服务器|WEB服务器|FTP服务器|邮件服务器|虚拟主机|服务器安全|DNS服务器|服务器知识|Nginx|IIS|Tomcat|

服务器之家 - 服务器技术 - 服务器安全 - 秘密蔓延:一文了解如何保护您的秘密

秘密蔓延:一文了解如何保护您的秘密

2023-08-01 04:38未知服务器之家 服务器安全

您的开发团队多久以明文形式向同事发送 API 密钥或其他敏感数据?虽然这是共享数据最快的方式,但它绝对不是最安全的。 当敏感数据最终出现在配置文件、源代码或明文中时,就会发生大量泄露。这个问题被称为秘密蔓延,它

您的开发团队多久以明文形式向同事发送 API 密钥或其他敏感数据?虽然这是共享数据最快的方式,但它绝对不是最安全的。

当敏感数据最终出现在配置文件、源代码或明文中时,就会发生大量泄露。这个问题被称为秘密蔓延,它会给企业带来不利的后果。

秘密蔓延导致的数据泄露会给公司带来财务损失、声誉损害和法律问题。您可以通过使用可靠的机密管理工具来降低这些风险,该工具允许您安全地共享、存储和管理您的机密。

本文对于想要保护公司免受与秘密蔓延相关的漏洞的开发人员、安全专业人员和产品经理来说非常有用。

什么是秘密蔓延,为什么要关心?

在软件开发中,秘密是用于用户授权和身份验证并提供对系统或数据的访问的任何信息。此类信息包括:

  • API 密钥
  • 密码
  • 加密密钥
  • 数据库凭证
  • 访问令牌

秘密蔓延,也称为秘密泄露或管理不善,是指对公司软件和基础设施内的秘密处理不当。管理不善的秘密对于黑客来说是有利可图且容易攻击的目标,他们可以利用这些秘密进行未经授权的访问。

根据GitGuardian 的2023 年秘密蔓延状况报告,2022 年,在公共 GitHub 提交中检测到了 1000 万个新秘密,比 2021 年增加了 67%。GitGuardian 指出,更多的秘密在私人存储库或企业 IT 资产等封闭空间中积累,这意味着 GitHub 上蔓延的秘密仅占全球公开秘密的一小部分。

为了有效降低秘密蔓延的风险,您需要知道去哪里寻找。这些是秘密蔓延最常见的地方:

秘密蔓延:一文了解如何保护您的秘密秘密蔓延:一文了解如何保护您的秘密(上)

泄密对企业到底有哪些危害?以下是组织因秘密蔓延而面临的六种最常见后果:

秘密蔓延:一文了解如何保护您的秘密秘密蔓延:一文了解如何保护您的秘密(上)

让我们详细讨论每个后果。

1. 数据泄露

当然,秘密蔓延最明显的后果是数据泄露。通过暴露 API 密钥或密码,您的公司可能面临让攻击者访问其系统、数据库和敏感数据的风险。这会导致数据泄露,并可能导致有价值的信息被盗,包括知识产权、财务记录,甚至用户数据。

2、财务损失

由于秘密蔓延,企业可能会通过多种方式遭受损失。黑客可以围绕金融交易进行欺诈活动,甚至实施盗窃。他们还可以破解和配置系统,以获得数据访问的赎金。您可能面临的另一类与数据泄露相关的财务损失是法律费用、监管罚款以及对受影响方的赔偿。

根据IBM 的《2022 年数据泄露成本报告》,因凭证被盗或泄露而导致的数据泄露造成的全球平均成本为 450 万美元。在美国,这一成本甚至更高,每次泄露达到 977 万美元。

3. 名誉损害

数据泄露和秘密蔓延事件可能会严重损害您公司的声誉。数据泄露案件会引起负面宣传、媒体关注和客户强烈反对。所有这一切之后往往会失去客户、业务合作伙伴和投资者。

声誉受损可能会阻止客户、合作伙伴和投资者离开您的公司,并激励他们与您的竞争对手合作。这将为竞争对手创造额外的商机,让他们获得更大的市场份额。

4. 合规和法律问题

客户数据处理不当可能会导致不遵守各种数据保护和隐私法律法规,包括HIPAA、GDPR和 CCPA。因此,您可能会面临罚款、处罚和诉讼,从而导致进一步的声誉和财务损失。更不用说您的公司需要经历与重新认证和重新审核相关的额外压力才能继续其工作。

5. 运营中断

您的业务运营也可能会受到秘密蔓延的影响,因为您需要分配资源用于调查、事件响应和补救活动。您可能需要关闭系统和服务,直到它们得到保护,而这种停机的每一秒都可能造成数千美元的损失。

尽管存在这些后果,秘密蔓延事件的数量仍在逐年增加,损害了各种规模的企业。根据GitGuardian 的2023 年秘密蔓延状况报告,仅在 2022 年,许多世界知名公司就因秘密蔓延而受到数据泄露和泄露的影响:

秘密蔓延:一文了解如何保护您的秘密秘密蔓延:一文了解如何保护您的秘密(上)

企业应该怎样做才能降低泄露秘密的风险?让我们看一下保护敏感数据的最佳实践。

最大限度降低秘密蔓延风险的最佳实践

为了防止秘密蔓延,我们 Apriorit 建议在您的开发过程中采用以下最佳安全实践:

秘密蔓延:一文了解如何保护您的秘密秘密蔓延:一文了解如何保护您的秘密(上)

1. 加密和访问控制

您的秘密应在静态和传输过程中进行加密,以便即使信息泄露,黑客也无法访问信息。此外,检查谁有权访问某些数据:根据职位和工作要求,仅向有限数量的员工授予系统访问权限。

2. 安全开发实践

实施安全编码实践,例如避免在源代码中硬编码机密以及利用环境变量或配置文件来引用机密。

3. 定期审核和审查

确保定期检查您的系统:

  • 渗透测试
  • 静态应用安全测试
  • 动态应用安全测试
  • 安全代码审查
  • 秘密扫描工具
  • 安全审计和合规性评估

4. 保密管理制度

使用秘密管理系统可以帮助您安全地存储和控制对秘密数据的访问。最流行的系统是 HashiCorp Vault 和 AWS Secrets Manager。

在许多方面,秘密管理解决方案类似于密码管理器。大多数密码管理器都很简单,并且不具有每用户权限或访问控制列表 (ACL) 等高级功能。他们可以在需要时存储和检索密码,但除此之外就无能为力了。

秘密管理解决方案预计具有更复杂的功能:

  • 创建 ACL
  • 为用户或用户组添加权限
  • 内置凭证轮换
  • 先进的访问控制功能

本文致力于使用秘密管理系统(即 HashiCorp Vault)来保护您的秘密。让我们讨论如何安装、初始化和配置 HashiCorp 机密管理工具。

什么是 HashiCorp Vault 以及它如何工作?

HashiCorp Vault是一个基于身份的开源秘密和加密管理系统,具有许多用例和功能。例如,Vault 支持零信任安全架构,可以帮助您保护云基础设施。

HashiCorp 已通过 ISO 认证。ISO 认证可确保组织实施稳健的系统、流程和控制,以维持质量、安全性和合规性。审计报告和合规函,例如Armanino的SOC 3报告和Leidos的FIPS合规函进一步证明HashiCorp经过了严格的测试和评估。

您可以开始免费使用 Vault 进行机密管理,或者如果您需要特定的解决方案,可以从两个付费计划中进行选择。您可以在HashiCorp Vault 官方网站上查看定价政策。

Vault 具有复杂的结构,并使用称为后端的组件来向其委派任务。Vault 中有四个专用于不同流程的后端:身份验证、秘密、审计和存储。所有这些都由 Vault 核心控制——Vault 架构的核心组件,它将所有用户请求路由到特定后端。

秘密蔓延:一文了解如何保护您的秘密秘密蔓延:一文了解如何保护您的秘密(上)

现在让我们更详细地讨论秘密管理库中的后端,并讨论它们的功能和目的。

1. 认证后端

身份验证后端或身份提供商负责处理身份验证过程,并在身份验证成功后返回用户身份(通常作为令牌或用户信息,如电子邮件、ID、角色等)。

令牌身份验证是一种中心身份验证方法,因为所有其他方法都依赖于它。它到底是如何运作的?

当用户成功进行身份验证时,身份提供者会返回有关用户的信息,例如用户名或唯一标识符。然后,Vault 获取此身份信息并创建与该身份关联的访问令牌。此访问令牌允许用户根据配置的访问策略和权限访问所需的资源或在 Vault 内执行特定操作。

秘密蔓延:一文了解如何保护您的秘密秘密蔓延:一文了解如何保护您的秘密(上)

当然,令牌认证可以单独使用。无需使用任何其他身份提供商即可创建、撤销和更新这些令牌。但这并不总是处理身份验证的最佳方式。

令牌在访问控制中也发挥着至关重要的作用,因为当创建令牌时,允许或禁止访问资源的特定于用户的策略会被编码到令牌上。

与 Vault 集成的身份验证后端的一些示例包括轻量级目录访问协议 (LDAP)、GitHub 和 Azure Active Directory。您还可以使用其他受支持的身份验证方法,例如 JSON Web 令牌、Kerberos,甚至标准用户名和密码。

2. 存储后端

存储后端负责存储所有信息。普遍接受的做法是将存储后端视为不可信实体。与许多其他机密管理解决方案一样,Vault 仅将加密数据存储在存储后端,因此如果存储遭到破坏,在不知道加密密钥的情况下就不可能检索机密。 

Vault 支持许多存储驱动程序,包括文件系统、内存存储、关系数据库和 Amazon S3。每种方法都有其优点和缺点,因此哪种方法最好取决于您的特定需求和存储驱动程序的功能。

此外,Vault还有自己的嵌入式数据存储,称为集成存储。使用此集成存储可以消除系统中的另一个依赖项,并使监控和故障排除变得更加容易,因为您只需监控 Vault。

使用 Vault 的本机存储驱动程序不需要安装任何其他软件,并且是开箱即用的解决方案。

3. 秘密后端

秘密后端,或秘密管理 HashiCorp 工具中的秘密引擎,负责各种存储秘密的方式。一些秘密引擎只能存储和读取数据,而另一些则具有更复杂的功能,例如动态秘密生成。

支持的引擎有很多,包括键值存储、轻量级目录访问协议 (LDAP)、数据库(用于动态数据库凭证生成)、用于生成基于时间的凭证的基于时间的一次性密码 (TOTP) 工具,以及来自 AWS、GCP 和 Azure 的引擎。我们还可以添加自定义秘密引擎。

这些引擎的行为类似于虚拟文件系统,并安装在 Vault 中的指定路径上。我们可以让多个引擎同时运行,并且它们都有不同的路径。由于每个引擎都有自己的路径,因此我们发送到 Vault 的请求会自动转发到所需的引擎。

例如,我们可以启用一个键值秘密引擎来存储我们的密码和 API 密钥,同时拥有一个 AWS 秘密引擎来动态生成 AWS 访问凭证。

4. 审计后端

审核后端负责记录 Vault 处理的所有请求和响应。记录机密管理器的活动可能看起来不安全,因为我们很可能将机密保存在日志中。

但是,Vault 通过对请求和响应包含的大部分字符串进行哈希处理来处理此问题,以避免泄露敏感信息。散列还允许我们通过自己生成这些散列来快速将秘密值与日志中的值进行比较。

您可以从多种审核机制中进行选择,包括系统日志记录协议 (Syslog)、文件或套接字。Socket 允许您将日志流式传输到 TCP、UDP 或 UNIX 套接字,从而允许您使用任何日志管理平台。

现在我们了解了 Vault 的工作原理及其提供的功能,让我们使用 Hashicorp Vault 安全最佳实践在现实示例中进行演示。

安装、配置和初始化 Vault

让我们开始根据我们的需要安装、配置和运行 Vault。

安装

在本文中,我们将使用Docker Hub中的官方 Docker 映像。Docker允许应用程序容器化,方便我们在隔离的环境中运行Vault。这是尝试 Vault 的最简单方法。现在让我们通过在终端或命令提示符中运行以下命令来启动 Vault:

秘密蔓延:一文了解如何保护您的秘密秘密蔓延:一文了解如何保护您的秘密(上)

如果本地尚未提供 Vault Docker 映像,这将下载该映像,并启动一个在其中运行 Vault 的新容器。

保险库配置

默认情况下,Vault 的服务器以开发模式运行:它使用内存存储存储所有秘密,自动初始化,并以未密封的方式启动。开发模式对于尝试事物很有用,但不应该在生产中使用。

在我们的例子中,我们将使用标准模式,这意味着需要手动初始化和启封 Vault。要在标准模式下运行我们的服务器,我们应该创建一个配置文件。

Vault的配置文件是用HashiCorp配置语言编写的。它们有许多不同的选项,但我们在整篇文章中只会使用其中的几个。 

让我们为我们的 Vault 创建一个简单的配置:

秘密蔓延:一文了解如何保护您的秘密秘密蔓延:一文了解如何保护您的秘密(上)

现在,我们来看看关键设置。首先,我们禁用了传输层安全协议(TLS)。请注意,您应始终在生产中使用 TLS 来提供客户端和服务器之间的安全通信。

其次,我们禁用内存锁。尽管启用内存锁被认为是使用 Vault 时最安全的方法,但并非所有平台都支持它,我们希望我们的示例尽可能简单,没有任何意外错误。我们还启用了 Web UI,因为有些人发现它比命令行界面 (CLI) 更容易、更快。

现在我们可以通过将配置的路径作为参数传递来使用新配置启动服务器:

秘密蔓延:一文了解如何保护您的秘密秘密蔓延:一文了解如何保护您的秘密(上)


一切都按预期进行,但现在我们必须初始化服务器本身。

初始化保管库

为了初始化我们的服务器,我们需要另一个安装了 Vault 的 Docker 容器。为了简化该过程,我们创建了以下 Dockerfile:

services: 
  vault_server: 
image: vault 
container_name: vault-server 
command: ["server"] 
cap_add: 
  - IPC_LOCK 
ports: 
  - 8200:8200 
environment: 
  VAULT_LOCAL_CONFIG: '{"storage": {"file": {"path": "/vault/file"}}, "listener": [{"tcp": { "address": "0.0.0.0:8200", "tls_disable": true}}], "disable_mlock": true, "ui": true}' 
networks: 
  - vault 
 
  vault_client: 
image: vault 
container_name: vault-client 
command: ["sh"] 
tty: true 
stdin_open: true 
environment: 
  - VAULT_ADDR=http://vault-server:8200 
depends_on: 
  - vault_server 
networks: 
  - vault 
 
networks: 
  vault: 
driver: bridge

请注意,我们将配置从文件移至环境变量。这是 Vault 官方 Docker 镜像提供的功能。它允许我们直接在环境中定义必要的配置参数,而不需要单独的文件。

我们还将服务器中的 TCP 端口 8200 映射到 Docker 主机的端口 8200,以便从 Docker 主机访问 Web UI。

现在我们可以使用Docker Compose来启动我们的容器。Docker Compose 是一个允许我们定义和管理多容器 Docker 应用程序的工具。它使用 YAML 文件(通常名为 docker-compose.yml)来指定组成应用程序的容器的配置和依赖项。

这是我们的容器创建的样子:

$ docker compose up 
[+] Running 2/2 
 ⠿ Container vault-server  Created                                                                                                                                  
 ⠿ Container vault-client  Created                                                                                                                                  
Attaching to vault-client, vault-server 
# Vault server output

此时,我们还将提供 Web UI 的屏幕截图,以展示如何在不使用命令行界面的情况下执行完全相同的操作。您可以通过从您选择的任何浏览器导航到 http://localhost:8200来访问 Web UI 。用户界面如下所示:

秘密蔓延:一文了解如何保护您的秘密屏幕截图 1.Vault 的 Web UI

最后,我们需要将终端会话从另一个终端附加到我们的Vault-Client容器(如果您使用的是Web UI,则可以完全跳过这些CLI步骤):

秘密蔓延:一文了解如何保护您的秘密秘密蔓延:一文了解如何保护您的秘密(上)

您可以通过在客户端内执行以下命令来验证一切是否按预期运行:

秘密蔓延:一文了解如何保护您的秘密秘密蔓延:一文了解如何保护您的秘密(上)

从输出中我们可以看到,Vault 是密封的且未初始化。Vault 始终以密封状态启动,因此我们应该在每次启动后将其解封。

为此,我们使用开封密钥。该密钥在初始化期间生成一次。Vault 使用Shamir 的秘密共享将密钥分割成预定义数量的部分,然后使用这些部分来重建它。这种方法降低了暴露未密封代币的风险,因为我们只拥有其中的一部分。其他部件可以由您的同事保管或安全地存放在不同的地方。 

要解封 Vault,请在客户端内运行以下命令:

秘密蔓延:一文了解如何保护您的秘密秘密蔓延:一文了解如何保护您的秘密(上)

指定您需要一份密钥共享,并且密钥阈值是一把密钥。现在按初始化并保存生成的密钥。

秘密蔓延:一文了解如何保护您的秘密屏幕截图 2. 设置根密钥

这将使用单个解封密钥初始化服务器。将生成的令牌和密钥保存到环境变量中。我们稍后会需要它们。从现在开始,我们将初始根令牌称为ROOT_TOKEN,将 Vault 服务器初始化期间生成的第一个解封密钥(密钥 1)称为UNSEAL_KEY。

Vault 支持多个解封密钥,但由于我们只是在学习而不是创建可用于生产的解决方案,因此我们将使用一个。

现在您可以使用解封密钥来解封服务器:

秘密蔓延:一文了解如何保护您的秘密秘密蔓延:一文了解如何保护您的秘密(上)

粘贴 UNSEAL_KEY 并按 Unseal。

秘密蔓延:一文了解如何保护您的秘密截图 3. 解封金库

现在一切都准备好了,我们终于可以开始使用 Vault 了。

延伸 · 阅读

精彩推荐