Google Cloud 上身份和访问权限治理的模式和做法

Last reviewed 2022-09-27 UTC

您可以使用多种 Google Cloud 产品和服务,帮助您的组织为在 Google Cloud 上运行的应用和工作负载开发身份治理和访问权限管理方法。本文档面向在客户团队中工作以及希望了解这些工具和控件及其使用方式的安全管理员、运营管理员和企业架构师。

本文档假定您具备以下各项:

  • Google Cloud 项目
  • 拥有管理员权限的用户账号,用于管理 Cloud Identity 群组和用户。您需要此访问权限才能运行本文档中的示例过程。
  • 不具备可用于管理 Cloud Identity 群组和用户的管理员权限的用户账号。您需要使用此账号测试您在本文档的示例步骤中设置的一些控制措施。

    如果您还没有对 Google Cloud 项目的访问权限以及对 Cloud Identity 的管理员权限,请参阅创建 Google Cloud 项目设置 Cloud Identity

发现未使用的账号和权限

当不再需要用户账号时,最佳做法是移除用户账号,因为未使用(孤立的)用户账号和服务账号会带来安全风险。您可以通过以下方式使用 Google Cloud Policy Intelligence 来帮助企业了解并降低风险:

  • 帮助企业中的管理员发现不再使用的账号和权限,例如员工离开公司或更改角色之类的原因。
  • 帮助识别完成任务后被放弃的服务账号。

查看和应用 IAM 建议

IAM Recommender 是 Policy Intelligence 工具和服务套件的一部分。它使用机器学习 (ML) 来生成智能的访问权限控制建议,以帮助您确定不再需要访问 Google Cloud 资源的账号。然后,您可以查看这些建议并决定是否应用这些建议。此外,IAM Recommender 还可帮助您维持组织内所有成员的最小权限原则。除了提供建议之外,Recommender 服务还会使用机器学习 (ML)来提供详细的数据分析。数据分析是突出显示资源使用情况中重要格式的发现结果。例如,您可以收集有关项目中权限使用情况的其他信息、确定未使用和不再需要的权限以及识别未使用的服务账号

您可以在企业级的 Google Cloud 控制台中查看和应用 IAM 建议。在以下示例过程中,您使用 BigQuery 审核组织中的权限并调整其大小。如需设置 BigQuery 集成,请配置将 IAM Recommender 提供的建议导出到 BigQuery 数据集。然后,您可以使用可视化工具(如 Looker 数据洞察Looker)查询和审核这些数据。

实现

  1. 在 Google Cloud 控制台的项目选择器页面上,选择或创建一个 Google Cloud 项目

  2. 新项目中会自动启用 BigQuery。如需在现有项目中启用 BigQuery,请启用 BigQuery API。

    启用 API

  3. 配置 BigQuery Data Transfer Service 以从 IAM Recommender 中提取数据。如需了解详情,请参阅将建议导出到 BigQuery

  4. 转到 BigQuery 页面。

    转至 BigQuery

  5. 将以下查询复制并粘贴到编辑器字段中:

    SELECT
       recommendation_details
    FROM PROJECT_ID.DATASET.TABLE_NAME
    WHERE recommender = "google.iam.policy.Recommender"
    AND recommender_subtype = "REMOVE_ROLE"
    

    请替换以下内容:

    • PROJECT_ID:您要用于执行此示例的 Google Cloud 项目 ID
    • DATASET:您在设置 BigQuery Data Transfer Service 作业时选择的数据集的名称。
    • TABLE_NAME:由 BigQuery Data Transfer Service 作业创建的表的名称。

    您运行此查询来识别 IAM Recommender REMOVE_ROLE 建议的 recommender_subtype 子类型。

  6. 点击运行。您可以使用查询结果来识别未使用的角色和调整 IAM 角色绑定。

    您可以将查询结果保存到表格。如需了解详情,请参阅将查询结果保存到表格

使用户能够请求资源的访问权限

企业管理员必须能够使用户能够请求资源的访问权限。通常,这些请求需要经过审批流程,在此流程中,指定的审批者或一组审批者必须批准请求才能提供访问权限。借助 Google 群组,您可以将访问权限政策应用于一组用户,从而使您能够遵循根据群组成员提供提供资源访问权限的政策管理最佳做法。此方法通过群组成员资格更改的方式保持与加入、调岗和离职事件相关的政策。

您可以使用 Google 群组授予和更改整个群组的访问控制,而不是一次为单个用户或服务账号授予或更改访问控制。您还可以轻松地向 Google 群组中添加成员以及从中移除成员,而不是更新 IAM 政策以添加或移除用户。

使用 Google 群组设置资源访问权限

您可以使用 Cloud Identity 来创建和管理 Google 群组。Cloud Identity 是一种身份即服务 (IDaaS) 解决方案,可管理用户和群组。您还可以配置 Cloud Identity 以便在 Google 和其他身份提供商(例如,Active DirectoryAzure Active Directory)之间联合身份。Google 群组还允许用户请求加入群组。该请求将会递送给群组管理员,然后由该管理员批准或拒绝该请求。如需了解详情,请参阅创建群组并选择群组设置

在创建和管理 Google 群组以授予对 Google Cloud 资源的访问权限时,请务必考虑所选设置的影响。虽然我们建议您尽可能减少管理群组的用户数量,但我们建议您设置多个群组管理员,以便始终具备该群组的访问权限。我们还建议您仅允许组织内的用户具备群组成员资格。

实现

在此示例过程中,您将创建一个 Google 群组,并向查看者群组授予对示例 Google Cloud 项目的访问权限。您添加到此群组(或根据请求授予访问权限)的成员可以查看示例 Google Cloud 项目。

创建示例 Google 群组

以下步骤假定您已配置 Cloud Identity。如需了解详情,请参阅设置 Cloud Identity。请确保您拥有管理群组所需的权限。

  1. 在 Google Cloud 控制台中,转到群组页面。

    前往“群组”

  2. 点击创建

  3. 填写群组的详细信息。

    如需向群组添加成员,请点击添加成员,然后输入成员的电子邮件地址并选择其 Google 群组角色

    完成后,点击提交以创建群组。

    群组设置只能在 Google 群组中进行管理。点击在 Google 群组中管理此群组以配置群组设置。若要选择谁可以加入群组,请在谁可以加入群组菜单中,选择仅组织用户

  4. 点击创建群组

向群组授予对 Google Cloud 项目的访问权限

  1. 在 Google Cloud 控制台的项目选择器页面上,选择或创建一个 Google Cloud 项目
  2. 打开 Cloud Shell:

    转到 Cloud Shell

  3. 运行以下命令,为群组提供项目的查看者访问权限:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=group:GROUP_EMAIL --role=roles/viewer
    

    请替换以下内容:

    • GROUP_EMAIL:您创建的群组的电子邮件地址
    • PROJECT_ID:您的 Google Cloud 项目的 ID

为您组织中的用户测试用户访问请求流程

在以下过程中,您使用测试用户账号演示组织中的用户用来请求访问 Google 群组的步骤。

  1. 以非管理员用户身份登录 Google 群组。您在创建示例 Google 群组中创建的群组会显示在所有群组下。如果该组未显示,请通过搜索功能找到它。
  2. 如需请求访问该群组,请点击请求加入群组

    授予访问权限后,您用于发出请求的非管理用户账号应能够查看该群组具有查看者访问权限的 Google Cloud PROJECT_ID 项目。

限时访问 Google Cloud 资源

有时,您的企业中的用户可能需要对 Google Cloud 资源进行短期的短期访问。当开发者需要访问 Google Cloud 资源以执行某些任务时,短期访问非常有用。短期访问还具有以下优势:

  • 减少管理费用。
  • 确保遵循最小权限并允许及时访问。

在需要快速和直接干预的紧急情况下,当用户需要访问资源时,能够提供此类型的访问权限非常有用。但是,可能很难手动跟踪短期访问权限并确保其被及时移除。借助 dentity and Access Management (IAM) 条件访问政策,您可以使用条件角色绑定来设置对 Google Cloud 资源的临时(过期)访问权限,这有助于减少管理员的开销。

使用条件角色绑定和群组成员资格到期时间

您可以将条件角色绑定添加到新的或现有的 IAM 策略中,以进一步控制对 Google Cloud 资源的访问权限。何时使用条件角色绑定为用户或群组提供临时访问权的一些示例如下:

  • 对项目的访问权限在指定时间之后到期。
  • 访问每月或每季度重复发生的项目。
  • 访问 Compute Engine 实例以管理任务,例如停止实例。

当您使用 Google 群组为用户提供对 Google Cloud 资源的访问权限时,您可以使用群组成员资格过期功能通过 Cloud Identity Groups API 设置群组成员资格的过期时间。当指定时间过去时,系统会自动将用户从群组中移除。

实现

您可以使用条件角色绑定向开发者授予特定 Compute Engine 实例的临时访问权限。在此示例中,角色绑定设置为在 2021 年 12 月 31 日过期。

  1. 在 Cloud Shell 中,设置以下环境变量:

    export INSTANCE=create example-instance-1
    export ZONE=us-west1-b
    export USER=USER_ID_TO_GIVE_TEMPORARY_ACCESS_TO
    

    USER_ID_TO_GIVE_TEMPORARY_ACCESS_TO 替换为您希望为其授予临时访问权限的用户的用户名。

  2. 创建示例 Compute Engine 实例:

    gcloud compute instances create $INSTANCE \
        --zone $ZONE \
        --machine-type g1-small
    

    您可以通过以下步骤为组织中的用户授予对该实例的临时访问权限。

  3. 为您选择的用户授予临时访问权限:

    gcloud compute instances add-iam-policy-binding $INSTANCE \
        --zone=$ZONE \
        --member="user:$USER" \
        --role='roles/compute.instanceAdmin.v1' \
        --condition='expression=request.time < timestamp("2022-01-01T00:00:00Z"),title=expires_end_of_2021,description=Expires at midnight on 2021-12-31'
    
  4. 保留您创建的 Compute Engine 实例。您稍后会在本文档的管理特权访问权限中使用此实例。

    或者,您可以通过运行以下命令来删除 example-instance-1 实例:

    gcloud compute instances delete $INSTANCE
    

如果您需要查看要审核的 IAM 生命周期事件(例如政策更改、服务账号创建和服务账号分配),则 Cloud Audit Logs 可以帮助您。管理员可以使用 Cloud Audit Logs 查看用于取证和分析的历史数据。分析审核日志可帮助您了解访问模式和访问异常情况。审核日志分析对于以下情况下也很重要:

  • 在数据泄露期间分析对资源的权限和访问权限。
  • 分析由 IAM 政策更改引起的生产问题,特别是您要验证哪个用户或哪个流程进行了更改时,尤其如此。

Cloud Audit Logs 可存储有关用户所执行操作、活动发生的位置以及时间的信息。审核日志分为以下几种类别:

我们建议您使用以下审核日志进行与身份和访问权限相关的管理日志记录:

  • 管理员活动审核日志
  • 政策拒绝审核日志

管理员活动审核日志存储对 Google Cloud 资源(如项目、Compute Engine 实例和服务账号)的更改。以下是管理员活动审核日志存储的事件的示例:

  • 创建服务账号。
  • IAM 政策更改。
  • 下载服务账号密钥。

如果用户或服务账号因违反安全政策而被拒绝访问 Google Cloud 服务,则会记录政策拒绝审核日志。

为身份生命周期事件设置 Cloud Audit Logs

您可以在 Google Cloud 控制台中查看审核日志,也可以使用 Cloud Logging API命令行界面查询日志。

所有审核日志都有保留期限。如果企业需要超过默认保留期限的审核日志存储时间,您需要通过创建日志接收器将日志导出到 BigQuery 或其他接收器目标位置。通过将日志导出到 BigQuery,您可以查看一部分数据列和选择的数据(一段时间或其他维度),并执行聚合分析

实现

以下示例过程演示了如何查询 Google Cloud 项目日志以检查是否发生了以下任何事件:

  • 进行了 IAM 政策更改。
  • 已创建新的服务账号。
  • 已生成新的服务账号密钥。

查看 IAM 政策的更改

  1. 在 Google Cloud 控制台中,转到 Logging > 日志浏览器页面。
  2. Logs Explorer 页面上,选择一个现有的 Google Cloud 项目。
  3. 将以下查询粘贴到查询构建器中:

    logName="projects/<PROJECT>/logs/cloudaudit.googleapis.com%2Factivity" AND
    (resource.type="project" OR resource.type="service_account") AND
    resource.labels.project_id="<PROJECT>" AND
    (protoPayload.methodName="SetIamPolicy" OR
    protoPayload.methodName="google.iam.admin.v1.CreateServiceAccount"
    OR
    protoPayload.methodName="google.iam.admin.v1.CreateServiceAccountKey")
    

    PROJECT 替换为您的 Google Cloud 项目 ID。

  4. 点击运行查询

查看群组成员资格的更改

对 Google 群组成员资格的更改会记录在活动日志中。如需了解如何访问这些日志,请参阅查看群组成员资格更改日志

访问权限证书

您可以使用 Policy Analyzer 来帮助您的企业逐个集合或时间段验证用户对 Google Cloud 资源集是否拥有适当的访问权限。出于合规性和审核目的,此验证非常重要。此外,此验证还可以帮助安全人员和审核人员查看哪些用户有权访问哪些资源及其容量。Policy Analyzer 可帮助您确定哪些身份或主账号(用户、服务账号、群组和网域)对组织的资源层次结构中的哪些 Google Cloud 资源具有访问权限。它还可以帮助确定访问权限的类型。Policy Analyzer 可以帮助您回答一些示例问题如下:

  • 哪些用户可以访问服务账号。
  • 哪些用户可以读取 BigQuery 数据集中包含个人身份信息 (PII) 的数据。

Policy Analyzer 可与以下方法搭配使用:

使用 Policy Analyzer 检查用户访问权限

以下示例查询显示您可以通过政策分析器获得的用户访问类型方面的见解:

  • 主账号(用户、服务账号、群组和网域)具有哪些角色或权限;例如,检查一位前员工对生产项目具有哪些访问权限。
  • 用户可以访问的资源;例如,前员工对生产项目资源多具有的访问权限。
  • 哪些主账号对资源有一定程度的访问权限;例如,特定用户可以在项目中删除哪些存储桶。

实现

在以下示例过程中,您将使用 Policy Analyzer 来验证用户拥有的权限。

  1. 在 Cloud Shell 中,为项目启用 Cloud Asset API:

    启用 API

  2. 输入以下命令以了解用户可以访问的资源:

    gcloud asset analyze-iam-policy --organization="YOUR_ORG_ID" \
        --identity="user:USERNAME_TO_CERTIFY"
    

    进行以下替换:

    • YOUR_ORG_ID:您的 Google Cloud 组织 ID
    • USERNAME_TO_CERTIFY:您要验证其 Google Cloud 访问权限的用户的用户名。
  3. 将 IAM 政策数据提取到 BigQuery。如需了解详情,请参阅将政策分析写入 BigQuery

管理特权访问权限

您的组织中的某些用户可能需要某些 Google Cloud 资源的特权访问权限才能执行管理任务。例如,这些用户可能需要管理特定的 Google Cloud 项目、设置项目结算和预算,或者管理 Compute Engine 实例。

您可以让用户请求即时特权访问权限,而不是永久授予用户特权访问权限。使用即时特权访问权限管理可以帮助您执行以下操作:

  • 降低有人意外修改或删除资源的风险。例如,如果用户仅在需要时具有特权访问权限,则有助于防止他们在其他时间运行脚本,以免无意中影响他们不应能够更改的资源。
  • 创建审核跟踪,以指明激活权限的原因。
  • 进行审核和复核,以分析过去的活动。

或者,您也可以授予对服务账号的特权访问权限,并允许用户模拟该服务账号

向用户授予特权访问

概括地说,对 Google Cloud 中对企业用户的特权访问的管理可以概括如下:

  • 使企业中的用户能够请求特权访问权限。
  • 查看 Cloud Audit Logs 以分析特权访问权限请求和访问模式。管理员可以查看特权访问模式,并利用这些日志检测异常情况。我们建议企业考虑导出这些日志,以便根据需要并在合适的情况进行保留,以便用于审核。
  • 确保特权访问权限会自动过期或定期进行审核。

为具有资源特权访问权限的所有用户启用两步验证(也称为多重身份验证)。您还可以使用 Access Context Manager 来创建基于特性的精细访问权限控制,可在使用特权访问权限时强制实施一层额外的安全保障。例如,您可以创建一个访问权限级别,以指定用户在使用对资源的特权访问权限时必须位于企业网络上。

实现

在此示例过程中,您(作为管理员)创建一个 Google 群组以获得对 Compute Engine 实例的特权访问权限。您将在 Google Cloud 中创建一个服务账号并为其提供管理 Compute Engine 实例的访问权限。您将该群组与该服务账号相关联,以便群组成员在拥有特权群组成员资格的时间段内能够模拟服务账号。

创建 Google 群组以获得特权访问权限

  1. 作为 Google Cloud 管理员,选择或创建一个 Google Cloud 项目。

    转到“管理资源”

  2. 为您的项目启用结算功能。 启用结算功能

  3. 按照使用户能够请求资源的访问权限中的步骤,创建一个新的 Google 群组。

    将该组命名如下:elevated-compute-access

创建 Google Cloud 服务账号

  1. 在 Cloud Shell 中,为您在创建 Google 群组以获得特权访问权限中创建的项目启用 IAM Service Account Credentials API。

    启用 API

  2. 设置以下变量:

    export PROJECT_ID=$DEVSHELL_PROJECT_ID
    export PRIV_SERVICE_ACCOUNT_NAME=elevated-compute-access
    export DELEGATE_GROUP=GROUP_EMAIL_ADDRESS
    

    GROUP_EMAIL_ADDRESS 替换为您创建的 Google 群组的全名。

  3. 创建服务账号:

    gcloud IAMservice-accounts create $PRIV_SERVICE_ACCOUNT_NAME \
        --description="Elevated compute access" \
        --display-name="Elevated compute access"
    
  4. 为服务账号授予计算管理员角色:

    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:$PRIV_SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/compute.admin"
    
  5. 授予您为项目创建的“服务使用情况”使用者的 Google 群组访问权限:

    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="group:$DELEGATE_GROUP" \
        --role="roles/serviceusage.serviceUsageConsumer"
    

    此权限允许 Google 群组成员模拟您创建的服务账号。

  6. 使 Google 群组模能够拟您创建的服务账号:

    gcloud IAMservice-accounts add-iam-policy-binding
    $PRIV_SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com --member="group
    :$DELEGATE_GROUP" --role="roles/iam.serviceAccountTokenCreator"
    
  7. 如果您为限时访问 Google Cloud 资源中的过程创建并保留了示例 Compute Engine 实例,请跳过此步骤。您可以使用示例实例来运行本示例中的步骤。

    或者,使用以下命令创建一个示例 Compute Engine 实例:

    gcloud compute instances create example-instance-1 \
        --zone us-west1-b \
        --machine-type g1-small
    

    在本示例中,您使用实例来验证授予了特权群组成员资格的用户可以访问该实例。

启用审核日志

您企业中的管理员可以启用 Cloud Audit Logs,以确保会记录特权访问权限并可以查看和分析。本部分中的过程介绍了如何启用审核日志记录功能。

  1. 获取项目的当前 IAM 政策:

    gcloud projects get-iam-policy $PROJECT_ID > /tmp/policy.yaml
    
  2. 修改政策文件,以便为 Compute Engine API 启用数据访问日志:

    cat <<EOF >> /tmp/policy.yaml
    auditConfigs:
    - auditLogConfigs:
     - logType: ADMIN_READ
     - logType: DATA_READ
     - logType: DATA_WRITE
     service: compute.googleapis.com
    EOF
    
  3. 设置新政策:

    gcloud projects set-iam-policy $PROJECT_ID /tmp/policy.yaml
    

使用非管理员用户账号测试模拟

您可以使用非管理员用户账号测试成员资格,方法是通过请求群组的成员资格并在获得成员资格后模拟服务账号。

本部分中的过程介绍了企业用户如何请求 Google Cloud 资源的特权访问权限。在此示例过程中,Google Cloud 资源是 Google Cloud 项目的 Compute Engine 实例。为了演示组织中的用户在获得群组的成员资格后如何模拟服务账号,您可以请求相关 Google 群组的成员资格。

  1. 使用非管理员用户账号登录 Google 群组,并请求 elevated-compute-access 群组的成员资格。
  2. 请使用同一账号登录 Google Cloud。管理员批准请求后,您应该有权访问该群组。在本示例过程中,假设您的群组成员资格请求已获批准。

  3. 在 Cloud Shell 中,运行以下命令以设置默认项目:

    gcloud config set project PROJECT_ID
    

    PROJECT_ID 替换为您之前在创建 Google 群组以获得特权访问权限部分中创建的项目 ID。

  4. 尝试列出此项目中的 Compute Engine 实例:

    gcloud compute instances list
    

    系统会显示错误消息,通知您 Google Cloud 用户无权访问 Compute Engine 资源。

  5. 运行以下命令:

    gcloud compute instances list
    --impersonate-service-account=elevated-compute-access@$PROJECT_ID.iam.gserviceaccount.com
    

    此命令通过模拟您获得 elevated-compute-access Google 群组成员身份时可以访问的服务账号,列出项目中的 Compute Engine 实例。

    您会看到您使用管理员账号创建的 example-instance-1 Compute Engine 实例。

查看审核日志

作为 Google Cloud 管理员,您可以访问和查看生成的审核日志。

  1. 使用拥有管理员权限的用户账号登录 Google Cloud 控制台,以访问审核日志。

  2. 在 Cloud Logging 中,输入查询以查看数据访问日志:

    logName="projects/<PROJECT_ID>/logs/cloudaudit.googleapis.com%2Fdata_access"
    AND
    protoPayload.authenticationInfo.principalEmail="elevated-compute-access@PROJECT_ID.iam.gserviceaccount.com"
    

    PROJECT_ID 替换为您的项目 ID,然后运行查询。

    此查询会显示 Google 群组中的哪些用户曾模拟服务账号访问 Compute Engine 实例。它还会显示其他相关详细信息,例如模拟服务账号的时间以及请求标头的详细信息。

  3. 查看审核日志负载,尤其是载荷中的 protoPayload.authenticationInfo 对象。模拟服务账号的用户的用户名会记录为 firstPartyPrincipal 对象的 principalEmail 键的值。

  4. 作为管理员,您还可以在 Security Command Center 信息中心内查看事件威胁发现结果。如需详细了解 Security Command Center,请参阅使用 Event Threat Detection

后续步骤