从服务账号密钥迁移

服务账号密钥通常用于向Google Cloud 服务进行身份验证。但是,如果它们未正确管理,则也会带来安全风险,这会增加凭据泄露、提升权限、信息泄露和不可否认性等威胁的漏洞。

在许多情况下,您可以使用服务账号密钥的更安全的替代方案进行身份验证。本指南可帮助您从使用服务账号密钥作为主要身份验证机制,改为更安全的替代方案,但在极少数情况下需要服务账号密钥。

本文档适用于希望通过减少服务账号密钥的使用来支持更安全的身份验证机制以改善安全状况的安全管理员。这些安全管理员可能负责现有生产工作负载、开发者工作流以及使用服务账号密钥的内部流程的安全性。

概览

从现有工作负载中移除服务账号密钥需要仔细规划,以防止意外中断。以下迁移计划旨在让您能够强制执行集中控制,同时最大限度地减少开发者中断。

此迁移计划包括三个阶段:

  • 评估:在此阶段,您将评估现有环境以了解服务账号密钥的位置以及是否正在使用密钥。
  • 计划:在此阶段,您将决定最终部署哪些控制措施,并将迁移计划传达给利益相关方。
  • 部署:在此阶段,您将开始重构工作负载,以通过更安全的服务账号密钥替代方案进行身份验证。您还可以构建其他功能来持续监控您的环境并降低未来的风险。

评估服务账号密钥的使用情况

在此阶段,您将评估现有环境以了解服务账号密钥的位置以及是否正在使用密钥。

以下部分介绍了您可以收集的数据,以更好地了解服务账号密钥在组织中的使用方式。

收集密钥使用情况的数据

首先,确定服务账号密钥的位置及其使用方式。

Google Cloud 提供了用于了解服务账号使用情况的工具。这些工具可帮助您确定哪些服务账号和密钥最近用于进行身份验证、哪些服务账号在过去 90 天内未使用,以及哪些服务账号具有过度特权的角色。

您可以组合使用所有这些工具的信息,以更好地了解服务账号和密钥在整个组织中的使用情况。 如需查看如何组合整个组织中来自这些不同来源的信息的示例,请参阅 GitHub 上的可部署的参考架构。此参考架构汇总了来自各种工具的数据并定期将其导出到 BigQuery 表中以供分析。

参考架构会部署一个数据流水线,以查询 Cloud Asset Inventory 来识别组织中的服务账号密钥。然后,数据流水线会将该数据与关联账号的密钥使用情况和权限使用情况数据加以组合。生成的表 sa_key_usage 可帮助您回答如下问题:

  • 已创建多少个永久性密钥?此数字可作为概要指标,帮助您跟踪从密钥迁移出去的进度。
  • 哪些项目和服务账号使用密钥?此信息可帮助您识别使用服务账号密钥的工作负载的所有者。
  • 哪些密钥无效?您可以删除这些密钥,无需工作负载所有者的进一步评估。
  • 哪些密钥与具有多余权限的服务账号相关联?如果服务账号密钥与特权过高的服务账号(尤其是具有 Owner、Editor 或 Viewer 角色的账号)相关联,则该密钥可能具有特别高的风险。查找具有角色建议的服务账号可以帮助您确定哪些服务账号具有过高的特权。确定这些服务账号后,您可以确定这些工作负载的优先级以进行迁移。您还可以选择应用角色建议,以主动减少多余权限。

此数据流水线每天运行并写入一个日期分区的 BigQuery 表。您可以使用此表格来调查特定服务账号或密钥,或使用 Looker Studio 等信息中心工具跟踪修复进度。

通过其他背景信息丰富密钥使用情况数据

收集密钥使用情况数据后,您可以选择使用其他数据源来丰富数据。我们建议您添加已用于跟踪资源治理和来源的数据源。根据现有治理,您可以添加其他数据,例如:

  • 来自配置管理数据库 (CMDB) 或类似系统的所有权信息。
  • 项目标签中配置的治理信息,例如负责项目的团队或成本中心。
  • 用于 Google Cloud外部环境中的工作负载的密钥的环境信息。

制定减少服务账号密钥使用的方案

在部署任何更改以减少服务账号密钥用量之前,您需要确定哪些工作负载和环境将会受到影响,以及如何实施这些更改。您还需要在整个企业中传达此方案,并确保工作负载所有者支持此方案。

以下部分介绍了您的方案应解决的关键主题。具体方案因组织规模和工作负载的特定要求而异。

确定当前工作负载所有者的责任

虽然中央安全团队可以评估存在哪些密钥,但成功迁移需要工作负载所有者完成一些工作。对于迁移范围内的密钥,工作负载所有者必须确定哪些可用的身份验证方法适用于其应用场景,然后执行该迁移。

请考虑平衡现有安全状况的改进与工作负载所有者所需的工作量。以下部分介绍了两种示例方法:一种优先考虑改进您的安全状况,另一种优先考虑最大限度地减少工作负载所有者的工作量。您的实际方法可能会有所不同,例如,您可以单独选择范围内的工作负载。

示例:评估所有当前工作负载以进行迁移

一种可能的方法是对所有现有和未来的工作负载强制执行服务账号密钥控制。这涉及到以下步骤:

  • 与工作负载所有者协作,以评估其现有工作负载的密钥使用情况。
  • 要求工作负载所有者迁移所有使用密钥的现有工作负载,除非它们获得例外权限。
  • 防止所有未来工作负载使用服务账号密钥,除非它们获得例外权限。

此方法优先考虑对现有安全状况的改进,但从短期来看需要开发者和工作负载所有者投入更多精力。如需成功执行此类计划,您必须拥有工作负载所有者参与工作负载审核和重构的承诺。

示例:不评估当前工作负载以进行迁移

另一种方法是允许现有工作负载自动获得例外权限,以继续使用服务账号密钥,并且仅对未来的工作负载应用新控制措施。

此方法可改善未来工作负载的安全状况,并最大限度降低当前工作负载所有者的责任。但是,它无法改善现有工作负载的安全状况。

识别快速胜出方案

在评估中,您可以确定可以安全删除的密钥,而无需进一步处理工作负载所有者的修复工作。例如,如果密钥在 90 天内没有活动,或者与不再有效的资源相关,您可以安全地移除密钥,而无需迁移到其他身份验证机制。

创建符合此条件的密钥的列表。在部署阶段,您将使用此列表来删除不必要的密钥。在向列表添加密钥之前,请确认是否存在某些不常需要服务账号密钥的使用情形,例如依赖于服务账号密钥的紧急生产访问。

计划强制执行组织政策更改的位置

如需成功停止使用服务账号密钥,您需要防止创建新密钥。在部署阶段,您将强制执行 iam.disableServiceAccountKeyCreation 组织政策限制条件,以防止创建新的服务账号密钥。

虽然此限制条件不会阻止使用现有密钥,但可能会破坏定期轮替其密钥的现有工作负载。在开始部署阶段之前,请决定将在资源层次结构中的哪个阶段强制执行部署,以最大限度地减少中断。

您可能希望最初在项目级层或文件夹级层(而非组织级层)强制执行限制条件。例如,在将开发环境部署到生产文件夹之前,您可能需要对用于开发环境的文件夹强制执行限制条件。或者,在拥有多个团队的大型组织中,您可以先对单个团队的文件夹强制执行限制条件,然后在迁移时对其他文件夹强制执行限制条件。

您可以使用带有标记的组织政策,以便在项目或文件夹级层有条件地强制执行组织政策。

设计例外流程

虽然此迁移的目标是减少或消除服务账号密钥的使用,但有一些合法的使用情形需要服务账号密钥。即使没有任何现有工作负载需要服务账号密钥,将来的工作负载也可能会有需要。因此,您必须定义操作流程来评估和批准需要服务账号密钥的使用情形的例外情况。

为工作负载所有者定义一个流程,以请求允许其工作负载使用服务账号密钥的例外情况。确保负责授予例外权限的决策者拥有验证使用情形的技术知识,就哪些服务账号密钥替代较为安全可能更适合咨询工作负载所有者,并向工作负载所有者提出管理服务账号密钥的最佳实践方面的建议。

与工作负载所有者就即将发生的变化进行沟通

设计完计划后,您需要在组织内明确地传达该计划,并确保利益相关方(尤其是高级主管)愿意承诺迁移。

虽然的具体迁移详细信息会因组织而异,但请考虑在沟通计划中包含以下主题:

  • 不安全的服务账号密钥可能会对组织产生负面影响,也是导致需要迁移服务账号密钥的动机。
  • 用于防止创建服务账号密钥的新安全控制措施,以及这对现有流程的影响。
  • 指导开发者确定服务账号密钥的更安全替代方案
  • 团队请求例外权限以允许服务账号密钥的过程,包括重新评估此异常的频率。
  • 实施建议更改的时间表。

与工作负载所有者合作优化您的计划,并确保该计划在整个组织范围内有效。

部署控制措施并重构工作负载

创建方案并将其传达给工作负载所有者后,您可以开始从服务账号密钥迁移。

在此阶段,您将开始重构工作负载,以更安全的服务账号密钥进行身份验证。您还可以构建其他功能来持续监控您的环境并降低未来的风险。

以下部分介绍了可以采取哪些步骤来重构工作负载和删除密钥并同时将中断降至最低。您可以根据组织所需的优先级和工作量,按任意顺序执行这些步骤。

强制执行控制措施以停止创建新的服务账号密钥

如需停止创建新的服务账号密钥,您需要强制执行 iam.disableServiceAccountKeyCreation 组织政策限制条件。

但是,在强制执行此限制条件之前,您需要将标记添加到不受该政策保护的任何项目或文件夹。如果现有工作负载无法从服务账号密钥迁移,或者有正当的理由仅使用服务账号密钥进行身份验证,您可以允许存在这些例外情况。

为豁免项目和文件夹添加标记后,您可以设置带有标记的组织政策,以对非豁免项目和文件夹强制执行 iam.disableServiceAccountKeyCreation 限制条件。

为了防止在所有非豁免项目和文件夹中创建服务账号密钥,请执行以下操作:

  1. 确保您在组织级层拥有 Tag Administrator 角色 (roles/resourcemanager.tagAdmin) 和 Organization Policy Administrator 角色 (roles/orgpolicy.policyAdmin)。如需了解如何在组织级层授予角色,请参阅管理对项目、文件夹和组织的访问权限
  2. 在组织级层,创建标记键和标记值,您将使用该标记值来定义资源是否应豁免该组织政策。我们建议使用键 disableServiceAccountKeyCreation 和值 enforcednot_enforced 创建标记。

    如需了解如何创建标记键和标记值,请参阅创建和定义新标记

  3. disableServiceAccountKeyCreation 标记附加到组织,并将其值设置为 enforced。组织中的所有资源都会继承此标记值,除非该标记值被其他标记值覆盖。

    如需了解如何将标记附加到资源,请参阅将标记附加到资源

  4. 对于要从组织政策中豁免的每个项目或文件夹,请附加 disableServiceAccountKeyCreation 标记并将其值设置为 not_enforced。以这种方式设置项目或文件夹的标记值会替换从组织继承的标记值。
  5. 创建组织政策,以防止为豁免资源以外的所有资源创建服务账号密钥。 此政策应具有以下规则:

    • 配置 iam.disableServiceAccountKeyCreation 限制条件,使其不对具有 disableServiceAccountKeyCreation: not_enforced 标记的资源强制执行。此规则中的条件应如下所示:

      "resource.matchTag('ORGANIZATION_ID/disableServiceAccountKeyCreation', 'not_enforced')"
      
    • 配置对所有其他资源强制执行的 iam.disableServiceAccountKeyCreation 限制条件。

修复现有工作负载

对于使用服务账号密钥的每个工作负载,请与工作负载所有者协作以选择并实现替代身份验证方法。

当您使用 Google Cloud CLI、Cloud 客户端库、支持应用默认凭据 (ADC) 的工具(如 Terraform 或 REST 请求)访问 Google Cloud 服务时,请使用下图来帮助您选择身份验证方法:

用于根据使用场景选择身份验证方法的决策树

此图将引导您完成以下问题:

  1. 您是否在单用户开发环境(例如您自己的工作站、Cloud Shell 或虚拟桌面界面)中运行代码?
    1. 如果是,请继续回答问题 4。
    2. 如果不是,请继续回答问题 2。
  2. 您是否在 Google Cloud中运行代码?
    1. 如果是,请继续回答问题 3。
    2. 如果不是,请继续回答问题 5。
  3. 您是否在 Google Kubernetes Engine 中运行容器?
    1. 如果是,请使用 Workload Identity Federation for GKE 将服务账号关联到 Kubernetes pod。
    2. 如果不是,请将服务账号附加到资源。
  4. 您的使用场景是否需要服务账号?

    例如,您希望在所有环境中为您的应用一致地配置身份验证和授权。

    1. 如果不是,请使用用户凭据进行身份验证
    2. 如果是,请使用用户凭据模拟服务账号
  5. 您的工作负载是否通过支持工作负载身份联合的外部身份提供方进行身份验证?
    1. 如果是,请配置工作负载身份联合,以允许在本地或其他云提供商上运行的应用使用服务账号。
    2. 如果不是,请创建服务账号密钥

在某些情况下,您可能无法使用除服务账号密钥以外的任何身份验证方法。服务账号密钥可能是一种唯一的可行选项示例包括:

  • 您使用的商业现成产品 (COTS) 或软件即服务 (SaaS) 应用会要求您直接在界面中输入Google Cloud 服务账号密钥。
  • 您的工作负载在 Google Cloud 之外运行,并且未通过支持工作负载身份联合的身份提供方进行身份验证。

如果您必须继续使用服务账号密钥,请务必遵循管理服务账号密钥的最佳实践

您也可能决定不修复某些工作负载,因为您将评估继续使用服务账号密钥的风险并不值得改用其他身份验证方法。

删除不必要的密钥

如果您确定不需要服务账号密钥,则应删除密钥。不必要的密钥包括:

  • 近期未使用的密钥,或与本页面的识别快速成功部分中标识的未使用资源相关的密钥。

  • 已迁移到其他身份验证方法的工作负载的密钥。

    删除项目中的所有服务账号密钥后,请确保针对该项目强制执行 iam.disableServiceAccountKeyCreation 限制条件。如果项目以前不受此限制条件的约束,请移除允许豁免的标记。

如需安全地删除密钥,我们建议您先停用密钥,然后再将其删除。删除操作不可逆,但如果您停用该功能,则可以快速重新启用该密钥。停用密钥后,请等待,直到您确定永久移除密钥不会造成问题,然后删除密钥。如果在停用密钥后,发现意外问题,请重新启用密钥,解决问题,然后重复该过程,直至您可以安全删除密钥。

使用内置控制措施来帮助响应泄露的密钥

Google Cloud 提供了多种工具和服务,可帮助您检测和响应泄露的服务账号密钥。请考虑使用以下机制来帮助您响应泄露的服务账号密钥:

如需了解管理被破解凭据的其他最佳实践,请参阅处理被破解的 Google Cloud凭据

持续改进服务账号管理

尽可能实现管理服务账号密钥的最佳实践。改进密钥管理流程有助于降低组织中任何剩余的服务账号密钥的风险。

后续步骤