如何减少 gcloud CLI OAuth 令牌被盗用带来的风险

88 阅读3分钟

概述

如果攻击者入侵了使用 gcloud CLI 登录的电脑或服务器,他们可能会获取 OAuth 令牌。即使之后您阻止了他们访问这些设备,他们也能用复制下来的令牌继续访问 Google Cloud。为降低这个风险,建议使用短期有效的凭证,并限制哪些设备可以访问资源。

gcloud CLI 的凭据是怎么存储的?

  • 用户账号登录时,gcloud CLI 会保存访问令牌和刷新令牌。访问令牌有效期是 60 分钟,但刷新令牌可以长期使用。
  • 服务账号登录时,gcloud CLI 使用密钥文件申请访问令牌。只要这个密钥没被删除,它就一直有效。
  • 在某些 Google Cloud 环境(如 Compute Engine)中,凭据会自动生成并由系统管理。
  • 如果用“工作负载身份联合”,凭据是短期的,不依赖本地文件。

攻击者如何滥用这些令牌?

如果攻击者拿到 gcloud CLI 的令牌,他们可以:

  • 模仿合法用户执行操作,日志中看不出异常。
  • 利用刷新令牌或密钥长期访问系统。
  • 绕过密码和两步验证。

如何降低风险?以下是几个关键做法:

  1. 设置会话时长限制

    • 强制用户每隔一段时间重新验证身份,阻止攻击者长期使用令牌。
  2. 使用 VPC Service Controls

    • 限制只有特定网络内的请求才能访问资源,防止攻击者在外部设备使用凭据。
  3. 启用 Chrome Enterprise 安全策略

    • 设置访问条件,例如 IP 或设备认证,不符合条件的请求会被拒绝。
  4. 强制使用两步验证

    • 对 SSH 登录等远程访问开启两步验证,即使令牌被盗,攻击者也难以登录。
  5. 限制服务账号密钥使用

    • 不使用或减少使用密钥文件,并启用政策禁止新密钥创建。
  6. 遵循最小权限原则

    • 只赋予用户完成任务所需的最小权限,避免权限滥用。
  7. 保护端点设备

    • 防止攻击者入侵开发者电脑或服务器,定期检查设备安全。
  8. 确保安全响应团队具备权限

    • 确保安全团队在出事时有权限快速采取行动。

出现安全事件后的处理建议:

  1. 使所有 OAuth 令牌失效

    • 启用会话时长策略,或手动移除用户的 gcloud CLI 凭据。
  2. 大范围失效令牌(如不确定受影响用户)

    • 可以使用 Admin SDK 写脚本批量移除所有用户的 gcloud CLI 访问权限。

    示例脚本用于撤销所有人的访问令牌:

    function listUsersAndInvalidate() {
      const users = AdminDirectory.Users.list({ customer: 'my_customer' }).users;
      for (const user of users){
        let tokens = AdminDirectory.Tokens.list(user.primaryEmail).items;
        for (const token of tokens) {
          if (token.clientId === "32555940559.apps.googleusercontent.com") {
            AdminDirectory.Tokens.remove(user.primaryEmail, token.clientId);
          }
        }
      }
    }
    
  3. 处理服务账号被盗情况

    • 暂停服务账号,删除密钥,60 分钟后再启用。
    • 或者直接删除并重新创建服务账号(需要更多修改)。