最佳做法:減輕 Google Cloud CLI 的 OAuth 權杖遭到入侵的影響

Last reviewed 2025-03-10 UTC

本文說明如何降低攻擊者入侵 gcloud CLI 所用 OAuth 不記名權杖造成的影響。

如果攻擊者存取已透過 gcloud CLI 驗證的端點,就能入侵這些 OAuth 權杖。然後,攻擊者可以將這些權杖複製到他們控制的另一個端點,以冒用合法身分提出要求。即使您移除攻擊者對遭入侵端點的存取權,攻擊者仍可使用複製的權杖,繼續發出經過驗證的 API 要求。為降低這項風險,您可以透過存留時間短暫且情境感知的憑證,控管系統存取權。

本文適用於負責保護雲端資源,避免遭到非法存取的安全團隊或雲端架構師。本文將介紹可用的控制項,協助您主動降低遭盜用 gcloud CLI OAuth 權杖的影響,並在端點遭盜用後修復環境。

總覽

如要瞭解這項威脅的運作方式,您必須瞭解 gcloud CLI 如何儲存 OAuth 2.0 憑證,以及憑證遭攻擊者盜用時會如何遭到濫用。

gcloud CLI 儲存的憑證類型

gcloud CLI 會使用 OAuth 2.0 存取權杖,驗證對 Google Cloud API 的要求。OAuth 流程會因使用的憑證類型而異,但一般來說,存取權杖和其他憑證都可在本機存取。無論是哪種情況,存取權杖都會在 60 分鐘後失效,但其他憑證類型可能會持續有效。

使用使用者帳戶授權 gcloud CLI 時,gcloud CLI 會啟動三足式 OAuth 同意流程,代表使用者存取Google Cloud API。使用者完成同意流程後,gcloud CLI 會收到存取權杖和更新權杖,可藉此要求新的存取權杖。長期有效的重新整理權杖會持續存在,直到符合到期條件為止。

使用服務帳戶授權 gcloud CLI 時,gcloud CLI 會啟動雙向 OAuth 流程,以服務帳戶身分存取Google Cloud API。從私密金鑰檔案啟動服務帳戶後,系統會定期使用該金鑰要求存取權杖。長效型私密金鑰會儲存在 gcloud CLI 設定中,除非刪除服務帳戶金鑰,否則金鑰會一直有效。

在 Compute Engine 或 Cloud Shell 等環境中執行 gcloud CLI 時,應用程式會自動尋找憑證,並以服務帳戶身分完成驗證。 Google Cloud舉例來說,在 Compute Engine 中,gcloud CLI 等應用程式可以查詢中繼資料伺服器,取得存取權杖。Google 會管理及輪替用於建立存取權杖的私密簽署金鑰,且長期憑證不會向應用程式公開。

使用工作負載身分聯盟進行驗證時,應用程式會根據外部身分識別提供者的憑證進行驗證,並取得聯合短期存取權杖。如要進一步瞭解如何儲存及管理外部身分識別提供者使用的長期憑證,請參閱使用 Workload Identity 聯盟的最佳做法

攻擊者如何使用遭入侵的 OAuth 權杖

如果攻擊者成功入侵端點,OAuth 權杖等憑證就會成為有價值的目標,因為攻擊者可藉此維持或提升存取權。

開發人員在編寫及偵錯程式碼時,可能需要查看自己的憑證。舉例來說,開發人員使用不支援的用戶端程式庫時,可能需要驗證才能使用 REST 要求 Google Cloud 服務。開發人員可以透過多種方式查看憑證,包括:

不過,攻擊者可能會在端點遭到入侵後,使用這些相同技術。

如果攻擊者入侵端點 (例如開發人員工作站),主要威脅是攻擊者可以透過已驗證身分的合法憑證,執行 gcloud CLI 指令和其他程式碼。此外,攻擊者可能會將 OAuth 權杖複製到他們控制的其他端點,以維持存取權。如果發生這類憑證竊取事件,即使您移除遭入侵端點的存取權,攻擊者仍可使用長期 OAuth 權杖持續存取,因此會造成次要威脅。

如果攻擊者成功盜用 OAuth 權杖,就能完成下列動作:

  • 攻擊者可以冒用遭入侵的使用者或服務帳戶。使用遭盜用權杖的 API 流量會記錄為來自遭盜用的使用者或服務帳戶,因此很難在記錄中區分正常和惡意活動。
  • 攻擊者可以利用與使用者相關聯的永久更新權杖,或與服務帳戶相關聯的私密金鑰,無限期更新存取權杖。
  • 攻擊者可以略過使用者密碼或兩步驟驗證,因為登入流程完成後就會授予權杖。

降低風險的最佳做法

請實作下列各節所述的控管措施,降低 gcloud CLI 權杖遭盜用的風險。如果您遵循企業基礎藍圖登陸區設計 Google Cloud中說明的安全防護最佳做法,可能已設有這些控制項。

設定 Google Cloud 服務的工作階段長度

如要縮短攻擊者利用遭盜用權杖的時間,請設定服務的工作階段長度 Google Cloud 。新客戶的預設工作階段長度為 16 小時,系統會自動強制執行這項設定。如果客戶在 2023 年前建立機構,預設設定可能為一律不必重新驗證。 Google Cloud 請檢查這項設定,確保重新驗證政策的工作階段長度介於 1 到 24 小時之間。重新驗證政策會使更新權杖失效,並強制使用者定期以密碼或安全金鑰重新驗證 gcloud CLI。

Google Cloud 服務的工作階段長度與「Google 服務的工作階段長度」是不同的設定,前者可控管 Google Workspace 服務的登入網路工作階段,但無法控管 Google Cloud的重新驗證。如果您使用 Google Workspace 服務,請同時設定這兩項服務的工作階段長度。

設定 VPC Service Controls

在環境中設定 VPC Service Controls,確保只有源自您定義範圍內的 Google Cloud API 流量,才能存取支援的資源。服務範圍會封鎖來自環境外部、受攻擊者控制端點的要求,因此即使憑證遭盜用,也無法存取受限服務,進而降低憑證遭盜用的影響。

設定 Chrome Enterprise Premium

設定 Chrome Enterprise 進階版政策,有助於確保控制台和 API 安全無虞 Google Cloud Google Cloud 。設定 Chrome Enterprise Premium 存取層級和繫結,有選擇性地允許在每個 API 要求中評估的屬性,包括 IP 型存取權或雙向 TLS 的憑證型存取權。如果要求使用遭盜用的授權憑證,但未符合 Chrome Enterprise 進階版政策中定義的條件,系統就會拒絕要求。

Chrome Enterprise Premium 是一項以使用者為中心的控制項,可拒絕不符合定義條件的使用者 API 流量。VPC Service Controls 是一種以資源為中心的控制項,可定義資源可通訊的範圍。VPC Service Controls 適用於所有使用者身分和服務帳戶身分,但 Chrome Enterprise Premium 僅適用於貴機構內的使用者身分。如果搭配使用 Chrome Enterprise Premium 和 VPC Service Controls,當攻擊者控制的電腦位於環境外部,即使憑證遭盜用,也無法發揮效用。

強制要求透過兩步驟驗證存取遠端伺服器

如果允許開發人員使用 SSH 存取 Compute Engine 資源,請設定 OS 登入並啟用兩步驟驗證。這會強制執行額外的檢查點,使用者必須使用密碼或安全金鑰重新驗證。如果攻擊者盜用 OAuth 權杖,但沒有密碼或安全金鑰,這項功能就能派上用場。

Compute Engine 上的 Windows 執行個體不支援遠端桌面通訊協定 (RDP) 存取 OS 登入服務,因此無法針對 RDP 工作階段細部強制執行兩步驟驗證。使用 IAP Desktop 或 Google Chrome 型 RDP 外掛程式時,請為使用者的網路工作階段設定粗略控制項,例如 Google 服務的工作階段長度兩步驟驗證設定,並停用「允許使用者信任裝置」設定。

限制服務帳戶金鑰的使用

使用服務帳戶金鑰進行驗證時,金鑰值會儲存在 gcloud CLI 設定檔中,與下載的金鑰檔案分開。如果攻擊者有權存取您的環境,就能從 gcloud CLI 設定複製金鑰,或從本機檔案系統或內部程式碼存放區複製金鑰檔案。因此,除了規劃如何減輕遭盜用存取權杖的影響,也請考慮如何管理下載的服務帳戶金鑰檔案。

請參閱更安全的驗證替代方案,減少或消除依賴服務帳戶金鑰的使用案例,並強制執行組織政策限制 iam.disableServiceAccountKeyCreation,停用服務帳戶金鑰建立功能。

考量最低權限原則

設計 IAM 政策時,請考慮最低權限。 依最小範圍授予使用者完成工作所需的角色。請勿授予他們不需要的角色。 查看並套用角色建議,避免環境中的 IAM 政策包含未使用的多餘角色。

保護端點

請考量攻擊者可能如何取得端點的實體存取權或遠端存取權,例如開發人員工作站或 Compute Engine 執行個體。制定計畫來解決 OAuth 權杖遭盜用的威脅固然重要,但也要考慮如何防範攻擊者入侵受信任的端點。如果攻擊者可以存取您信任的端點,就能直接在端點上執行 gcloud CLI 指令或其他程式碼。

雖然本文件不涵蓋開發人員工作站的全面防護,但建議您評估安全工具和作業如何協助保護及監控端點,防範遭到入侵。請思考以下幾個問題:

  • 如何保護開發人員工作站的實體安全?
  • 貴公司如何識別及因應網路侵害事件?
  • 使用者如何遠端存取 SSH 或 RDP 工作階段?
  • SSH 金鑰或服務帳戶金鑰等其他永久憑證可能會遭到入侵嗎?
  • 是否有使用持續性憑證的工作流程可以改用短期憑證?
  • 是否有共用裝置,可讓使用者讀取其他使用者的 gcloud CLI 快取憑證?
  • 使用者可以從不受信任的裝置,透過 gcloud CLI 進行驗證嗎?
  • 獲准的流量如何連線至 VPC Service Control 範圍內的資源?

請確保安全營運團隊能回答這些問題。

協調應變團隊

請事先確認負責事件回應的安全團隊,在 Google Cloud 控制台和管理控制台中擁有適當的存取權。如果不同團隊分別管理 Google Cloud 控制台和管理控制台,事件發生時的回應可能會延遲。

如要移除遭盜用使用者帳戶的存取權,事件應變團隊必須具備管理控制台角色,例如使用者管理管理員。為評估資源中是否發生可疑活動,這個團隊可能也需要 IAM 角色,例如所有專案的安全審查者,或集中式記錄接收器的記錄檢視者。 Google Cloud資安團隊所需的角色會因環境的設計和運作方式而異。

安全事件後的補救措施最佳做法

端點遭入侵後,請按照事件管理計畫,決定如何回應遭入侵端點的主要威脅,以及如何減輕遭入侵權杖的次要威脅可能造成的持續性損害。如果攻擊者持續存取開發人員工作站,可能會在合法使用者重新驗證後再次複製權杖。如果您懷疑 gcloud CLI 權杖可能遭到入侵,請向 Cloud Customer Care 開啟支援單,並完成下列各節的建議操作。這些措施有助於在貴機構中,限制這類事件的影響。 Google Cloud

本節的建議與處理遭盜用憑證 Google Cloud 的一般指南重疊,但特別著重於從遭入侵端點複製的 gcloud CLI 權杖所造成的威脅。

為所有啟用 Google Cloud 工作階段控制的使用者帳戶,將有效權杖設為過期

如果尚未強制執行Google Cloud 工作階段控制,請立即啟用這項功能,並設定較短的重新驗證頻率。這項控制項可確保所有重新整理權杖都會在您定義的時限結束時失效,藉此限制攻擊者使用遭盜用權杖的時間。

手動使遭駭使用者帳戶的權杖失效

請參閱處理遭入侵憑證的指引,瞭解如何處理可能遭入侵的使用者身分。具體來說,移除 gcloud CLI 憑證是安全團隊解決使用者身分 OAuth 權杖遭盜用問題最有效的方法。如要立即讓 gcloud CLI 的重新整理權杖和存取權杖失效,並強制使用者以密碼或安全金鑰重新驗證,請從使用者的已連線應用程式清單中移除 gcloud CLI。

個別使用者也可以移除個人帳戶的 gcloud CLI 憑證

其他方法 (例如停權使用者、重設使用者密碼或重設登入 Cookie) 無法具體解決 OAuth 權杖遭盜用的威脅。這些方法通常適用於事件回應,但不會使攻擊者已控制的存取權杖失效。舉例來說,如果您在調查期間選擇暫停使用者,但未撤銷 gcloud CLI 權杖,則在存取權杖到期前,如果恢復暫停使用者的存取權,存取權杖可能仍有效。

透過程式為多個使用者帳戶撤銷權杖

如果您懷疑發生違規事件,但無法判斷哪些使用者受到影響,可以考慮比重新驗證政策允許的時間更快,為機構中的所有使用者撤銷有效工作階段。

這種做法可能會干擾合法使用者,並終止依使用者憑證執行的長期程序。如果您選擇採用這種做法,請預先準備好供資安營運中心 (SOC) 執行的指令碼解決方案,並先找幾位使用者測試。

下列範例程式碼會使用 Workspace Admin SDK,找出 Google Workspace 或 Cloud Identity 帳戶中所有可存取 gcloud CLI 的使用者身分。如果使用者已授權 gcloud CLI,指令碼會撤銷更新權杖和存取權杖,並強制使用者以密碼或安全金鑰重新驗證。如需瞭解如何啟用 Admin SDK API 及執行這段程式碼,請參閱 Google Apps Script 快速入門導覽課程

/**
 * Remove access to the Google Cloud CLI for all users in an organization
 * @see https://developers.google.com/admin-sdk/directory/reference/rest/v1/tokens
 * @see https://developers.google.com/admin-sdk/directory/reference/rest/v1/users
 * @see https://developers.google.com/apps-script/guides/services/advanced#enabling_advanced_services
 */

function listUsersAndInvalidate() {
  const users = AdminDirectory.Users.list({
    customer: 'my_customer' // alias to represent your account's customerId
    }).users;
  if (!users || users.length === 0) {
    Logger.log('No users found.');
    return;
  }
  for (const user of users){
    let tokens = AdminDirectory.Tokens.list(user.primaryEmail).items
    if (!tokens || tokens.length === 0) {
      continue;
    }
    for (const token of tokens) {
      if (token.clientId === "32555940559.apps.googleusercontent.com") {
        AdminDirectory.Tokens.remove(user.primaryEmail, token.clientId)
        Logger.log('Invalidated the tokens granted to gcloud for user %s', user.primaryEmail)
      }
    }
  }
}

使服務帳戶的憑證失效並輪替

與授予使用者身分的存取權杖不同,授予服務帳戶的存取權杖無法透過管理控制台或 gcloud auth revoke 等指令失效。此外,您在Google Cloud 工作階段控制項中指定的工作階段時間長度,適用於 Cloud Identity 或 Google Workspace 目錄中的使用者帳戶,但不適用於服務帳戶。因此,針對遭入侵的服務帳戶,您在事件回應時必須同時處理永久金鑰檔案和短期存取權杖。

如果懷疑服務帳戶的憑證遭到盜用,請停用服務帳戶刪除所有服務帳戶金鑰,然後在 60 分鐘後啟用服務帳戶。刪除服務帳戶金鑰可以使長期憑證失效,避免攻擊者要求新的存取權杖,但不會使已授予的存取權杖失效。為確保存取權杖不會在 60 分鐘的有效期間內遭到濫用,您必須停用服務帳戶 60 分鐘。

或者,您也可以刪除並替換服務帳戶,立即撤銷所有短期和長期憑證,但這可能需要更多中斷性工作,才能在應用程式中替換服務帳戶。

後續步驟