如何跨平台管理密码等机密信息?


管理密码、密钥和其他敏感信息对于保护数据和系统至关重要,但跨不同环境、平台和团队进行管理具有挑战性。以下是有关选择正确方法的一些指导。

各种工具和技术——例如密钥管理服务、密码存储和配置管理工具——都可以提供帮助。然而,每种工具都有其自身的优点和局限性,选择正确的方法取决于组织的具体需求和环境。

密码等机密信息管理的一些挑战包括:

  • 安全存储。密码必须以安全的方式存储,以防止未经授权的访问。这在云环境中可能很困难,因为在云环境中,密码可能存储在多个服务器和位置。
  • 访问控制。重要的是要有适当的访问控制,以确保只有授权的个人或系统才能访问机密。
  • 分配。密码必须分发给需要它们的系统和个人,同时仍然保持安全性。
  • 规模。大规模管理机密可能具有挑战性,因为机密的数量和需要访问它们的系统的数量会迅速增长。
  • 审计和监控。能够跟踪和审核密码使用以检测和防止滥用非常重要。
  • 自动化。自动化密码管理可能很困难,尤其是在动态的、基于云的环境中。
  • 遵守。根据行业和地点的不同,在存储和管理机密时可能必须满足特定的法规和合规要求。
  • 回转。密码需要定期轮换,以最大限度地减少未经授权访问的风险。
  • 整合。密码管理应与组织中的其他安全措施和系统集成,例如身份和访问管理以及安全事件和事件管理。

硬编码的密码等机密信息可能会给机密管理带来一系列挑战和风险,使其难以轮换、管理和保护机密、跟踪使用情况以及与其他安全工具集成。

使用安全的密码管理实践非常重要,例如将密码存储在安全、集中的位置,并使用加密、访问控制和审计日志来管理访问和使用。通过使用这些实践,您可以最大限度地降低安全漏洞的风险,确保遵守法规,并实现更高效的应用程序管理和扩展。

TruffleHog 
TruffleHog是一个强大的开源工具,用于在组织的整个软件开发生命周期 (SDLC) 中识别密码和敏感信息。除了识别代码中的密码外,TruffleHog 还可以检测 SDLC 其他区域中的不安全共享密码,例如配置文件、构建脚本和部署管道。

TruffleHog 的引擎旨在针对密钥提供者验证 700 多种独特的凭证类型,以减少误报。这意味着该工具可以识别各种潜在的安全漏洞,包括 API 密钥、密码和访问令牌。

TruffleHog 的主要优势之一是它能够通过与泄露密钥的开发人员自动进行密码修复过程来左移密钥轮换。这意味着开发人员可以在其正常工作流程中快速轻松地识别和修复安全漏洞,而无需依赖专门的安全团队来管理流程。

请记住,在存储库上运行 TruffleHog 时,它只会扫描提交的文件,因此如果您有任何未跟踪的包含密码的文件,它不会检测到它们。

Dockle
Dockle是一种容器镜像 linter 工具,旨在帮助开发人员构建安全且最佳实践的 Docker 镜像。通过使用 Dockle,开发人员可以确保他们的 Docker 镜像安全并遵循最佳实践。它使用的检查点包括互联网安全中心 (CIS) 基准,这是一套用于保护 IT 系统和基础设施的行业标准最佳实践。

对于在软件开发和部署过程中使用 Docker 镜像的任何组织来说,Dockle 都是一个有价值的工具。通过提供安全问题和漏洞的自动检查,以及镜像设计和配置的最佳实践,它可以帮助改善容器化应用程序的安全状况,并降低

CodeQL
CodeQL是由 GitHub 开发的开源安全分析工具。它提供了一个强大的框架来执行自动代码分析和识别代码中的安全漏洞。

此存储库包含标准CodeQL库和查询,这些库和查询为 GitHub Advanced Security 和 GitHub 向全球客户提供的其他应用程序安全产品提供支持。借助 CodeQL,开发人员可以轻松地扫描他们的代码库以查找漏洞、识别常见的编码错误并在潜在的安全漏洞成为问题之前发现它们。

CodeQL 库包含一组代码片段、函数和数据类型,可用于编写代码分析的自定义查询。这些库涵盖一系列编程语言,包括C/C++、 Java、 Python和JavaScript等。

CodeQL 还提供了一种灵活的查询语言,允许开发人员定义用于分析代码的自定义查询。这些查询可用于识别安全漏洞、检测代码异味和违反最佳实践,以及追踪代码缺陷。

Trivy
Trivy是一种开源漏洞扫描器和安全工具,可用于在容器、Kubernetes (K8s)、代码存储库和云等各种环境中查找安全问题,例如漏洞、配置错误、机密和软件材料清单 (SBOM) 。

Trivy使用已知漏洞数据库来扫描图像并检测任何潜在问题。它可以扫描多种类型的容器镜像,包括 Docker 和 Open Container Initiative (OCI) 镜像,以及 Kubernetes 清单和 Helm 图表。

此外,Trivy 还可以扫描 git 存储库中的密码,扫描亚马逊网络服务 (AWS) S3 存储桶中的公开数据,以及其他云服务中的错误配置。

Trivy 可用于开发和生产环境,并可与 CI/CD 管道集成以自动执行安全扫描。

如果检测失败怎么办?
TruffleHog 和 Dockle 无法检测容器镜像或代码中所有可能的密码或漏洞实例。可以通过多种方式混淆密码,例如使用不同的大小写或编码技术,使它们更难找到。

此外,这些工具可能无法检测到某些加密技术,尤其是当它们使用无法轻易进行逆向工程的复杂加密方法时。

然而,TruffleHog 和 Dockle 仍然是识别容器镜像和代码中许多常见安全问题和漏洞的有价值的工具。虽然它们可能无法捕获所有可能的安全问题或漏洞实例,但它们仍然可以帮助显着改善组织的整体安全状况,尤其是在与其他安全解决方案和流程集成时。

Kubernetes ConfigMap 的问题
如果 Kubernetes ConfigMaps 包含敏感信息并提交到 git 存储库,则它们可能成为安全漏洞的潜在来源。任何有权访问 git 存储库的人都可以轻松访问 ConfigMaps,这使得它们容易受到利用。

要解决此问题,请在使用 ConfigMap 时采用安全第一的心态;使用基于角色的访问控制 (RBAC)或基于属性的访问控制 (ABAC) 来确保只有授权用户才能访问 ConfigMap。此外,加密 ConfigMap 以防止未经授权的访问,并使用额外的元数据和过滤器来帮助识别其中包含的密码的用途。

另外,尽量避免在 ConfigMap 中硬编码敏感信息;使用环境变量或外部密码存储,例如 Kubernetes Secrets 或外部密钥管理服务,来存储敏感数据。通过这样做,您可以防止它被意外暴露或泄露。

总体而言,ConfigMaps 可以成为在 Kubernetes 环境中管理配置数据的宝贵工具,但安全地使用它们并采取措施减少潜在的安全漏洞非常重要。

使用 Kubernetes Secret
Kubernetes Secrets 是一种比 ConfigMaps 更安全的存储敏感信息的方法,因为 Secrets 在静态和传输过程中都是加密的。通过遵循保护机密的最佳实践——并持续审计和监控您的 Kubernetes 集群是否存在漏洞——您可以帮助确保您的敏感信息得到适当保护。

Kubernetes Secrets 应该得到妥善保护,并且只能由授权用户访问。这可以通过使用 RBAC 或 ABAC 来控制对 Secrets 的访问并确保它们只能由需要它们的特定服务访问来实现。

管理 Secrets 的生命周期可能具有挑战性,尤其是涉及到密钥轮换和到期时。密码应该被正确识别并用元数据标记,以便它们的目的和到期日期明确,并确保它们定期轮换和更新,以防止未经授权的访问。

此外,Secrets 应该被适当地加密并且加密密钥被安全地管理。

在 Kubernetes 中使用准入控制器强制执行严格的SecurityContext,以确保您的 Secrets 得到妥善保护。SecurityContext 允许您在集群中的对象上设置各种与安全相关的属性,包括 pod、容器和卷。

通过在 Pod 和容器上设置和实施严格的安全上下文并使用准入控制器,您可以防止横向移动并限制潜在安全漏洞的范围。此外,如果您运行的是不支持安全上下文的旧版本 Kubernetes,则可以使用 Pod 安全策略 (PSP) 来实现类似的功能。

通过实施这些措施,您可以减少集群的攻击面,并使攻击者更难破坏您的敏感数据。

验证用户
OpenID Connect (OIDC)是一种广泛使用的身份验证协议,它建立在 OAuth 2.0 授权框架之上。它为用户提供了一种简单而安全的方式来使用他们现有的 OIDC 凭据(例如来自 Google、GitHub 或 Okta 的凭据)对 Web 和移动应用程序的访问进行身份验证和授权。

利用 OIDC 的流行应用程序之一是HashiCorp Vault,这是一种用于存储和管理敏感信息的机密管理工具。通过为 Vault 配置 OIDC 身份验证,用户可以使用其现有的 OIDC 凭据对其进行身份验证,从而无需为 Vault 创建单独的用户名和密码。

为 Vault 配置 OIDC 身份验证涉及创建 OIDC 提供程序、配置 Vault 以使用 OIDC 身份验证以及使用 Vault CLI 测试身份验证流程。这有助于简化用户的身份验证过程,同时保持强大的安全措施。

要开始为 Vault 配置 OIDC 身份验证,您可以按照 HashiCorp 在其文档中提供的综合指南进行操作。

验证应用程序
当与 Kubernetes 结合使用时,Vault 可以通过利用 Kubernetes 身份验证来控制对数据库凭据的访问,从而提供额外的安全层。Vault 的 Kubernetes 身份验证方法验证Kubernetes ServiceAccount令牌的真实性,然后可用于授权创建动态数据库凭证。

为了启用此功能,可以将 Vault 代理作为 sidecar 容器与 Kubernetes pod 中的应用程序容器一起部署。该代理负责处理动态数据库凭证的创建和管理,以及 Kubernetes ServiceAccount 令牌的身份验证和授权。

通过此配置,应用程序可以通过 Vault 中的指定路径访问其动态生成的数据库凭据,而无需将静态凭据存储在配置文件中。Vault 将按指定的时间间隔自动轮换凭据,进一步降低凭据泄露的风险。

要开始使用 Vault 和 Kubernetes 配置动态数据库凭证,您可以按照 HashiCorp 在这篇博文中提供的详细指南进行操作。


Vault 认证和授权
OWASP  wrongsecrets GitHub仓库repository中的脚本k8s-vault-minkube-start.sh演示了如何用Vault服务器配置Kubernetes集群,使用Minikube进行测试。

该脚本提供了一个有用的示例,说明如何使用 Vault 身份验证和机密管理设置 Kubernetes 集群。
带有脚本的演示k8s-vault-minkube-start.sh包括:

  • 身份验证和授权。该演示展示了 OIDC 集成或任何其他与 IDP 相关的身份验证方法的使用。这允许为访问 Vault 服务器的用户提供安全和灵活的身份验证过程。
  • 可审核性。所有事件都发送到 ELK 堆栈,并使用 ElastAlert 设置警报。Configuration as Code、Vault policy list和Vault policy read用于抽查审计,增强了系统整体的可审计性。
  • 暂时性。该演示展示了如何轻松轮换凭据或仅临时使用凭据。KV 后端中的密码可以轻松轮换并进行版本控制,这增加了系统的安全性。
  • 历史。时空秘术及时撤销,不得在野外游荡。这确保了对系统历史的责任,并且可以快速识别和处理任何潜在的安全漏洞。

此外,建议为您的 Vault 配置设置单独的存储库,以确保更好地组织和保护您的密码。

请注意,该脚本仅用于测试目的,未经适当修改和安全加固,不应在生产环境中使用。


运行 Vault 的挑战
运行 Vault 可能会带来一些挑战,但通过适当的规划和实施,它可以为密码管理提供有效的解决方案。使用 Vault 时可能遇到的一些挑战包括:

  • 配置。将 Vault 用于多个解决方案可能会导致复杂的 HCL 存储库,以及额外的 Kubernetes 和 Terraform 代码来配置它。确保配置井井有条且易于维护非常重要。
  • 身份验证后端集成。安全地集成不同的身份验证后端方法需要特别注意,因为错误可能会导致安全漏洞。正确管理凭据的暴露、确保角色被正确撤销并清理临时凭据至关重要。
  • 用户培训。并非所有DevOps消费者都熟悉 Vault 及其复杂性,因此必须进行培训以确保正确使用。

要有效地使用 Vault,请考虑采取以下步骤:
  1. 确保存储足够的关于密码的元数据,以实现有效使用。
  2. 做好备份,以防运行 Vault 的存储损坏。
  3. 如果可能,删除 git 中 Vault 的根令牌以防止未经授权的访问。
  4. 准备好在二级密码管理系统设置中保护主密码。
  5. 强化 Vault 运行的环境以防止未经授权的访问。
  6. 为与凭证相关的后端挑战做好准备。

Vault 和 Kubernetes Secrets 一样,如果使用得当,可以成为一个有价值的工具。但是,必须了解并准备好应对可能出现的各种挑战,以确保其有效使用。


在 CI/CD 中存储密码:最佳实践
在 CI/CD 管道中存储密码时,遵循最佳实践以确保其安全性非常重要。以下是一些可以帮助您的指南:

  • 使用机密管理系统来存储机密。这确保了密码被安全地加密和存储。
  • 定期轮换密码,尤其是当您怀疑它们可能已被泄露时。使用自动化来管理密码轮换。
  • 不要以纯文本形式存储密码。相反,使用加密或散列来保护它们。
  • 确保密码不存储在像 git 这样的版本控制系统中。相反,使用 CI/CD 管道从安全存储系统中获取机密。
  • 使用环境变量在管道中存储密码,而不是将它们硬编码到脚本或配置文件中。
  • 使用 Vault 或 Amazon Key Management Service (KMS) 等工具在管道内即时加密和解密密码,而不是让它们保留在内存中。
  • 限制有权访问密码的人数。只为需要它来完成工作的人提供访问权限。
  • 监控对机密的访问以检测和防止未经授权的访问。
  • 考虑使用多因素身份验证 (MFA) 来访问机密。
  • 加密 CI/CD 管道和机密管理系统之间的所有网络流量。


结论
在云中存储密码需要仔细考虑加密、轮换和版本控制、访问控制和身份验证。应该使用细粒度的策略,并且应该根据所需的身份验证级别来确定访问级别。

最后,IaC 可用于设置和配置服务,但应注意确保正确解析机密,并应尽可能使用单独的机密管理系统。

总的来说,有效的密码管理需要一个积极主动的整体战略,考虑到密码的整个生命周期,从生成到处置,并涉及所有相关的利益相关者,包括开发人员、运营、安全和合规团队。