消除 CI/CD 管線中的儲存憑證
TL;DR:Docker 現已支援 OpenID Connect (OIDC) 於 GitHub Actions。您的工作流程可以使用短期、每次執行專用的權杖進行驗證,而非儲存 PAT 或 OAT。無需輪替機密,無憑證外洩風險。
GitHub OIDC 連線適用於擁有 Docker Team、Docker Business 或 Docker Hardened Images (DHI) 訂閱的組織,以及加入 Docker Sponsored Open Source Program (DSOS) 的組織。
目錄
- 儲存憑證的問題
- 誰應該使用此功能
- OIDC 連線如何運作
- 開始使用
- 哪些部分不會改變
- 了解更多
GitHub Actions 與 Docker 之間的 OIDC 權杖交換流程

儲存憑證的問題
每個需要推送或提取 Docker Hub 映像的 GitHub Actions 工作流程,都必須使用儲存在 GitHub 機密中的個人存取權杖 (PAT) 或組織存取權杖 (OAT) 進行驗證。這些憑證的有效期很長,必須有人記得去輪替。一旦權杖外洩,攻擊者就能存取您的登錄檔——提取私有映像、推送惡意映像——而且這種存取權限會持續到有人發現並撤銷為止。輪替作業是手動進行且無法擴展。隨著管線數量增加,需要追蹤的憑證也隨之增加,而過時的權杖則是常見的稽核發現。
誰應該使用此功能
- GitHub 會發出已簽章的身分權杖 (JWT),其中編碼了存放庫、分支、環境以及工作流程執行的其他中繼資料。
- 工作流程呼叫 docker/login-action,將此權杖提交給 Docker。
- Docker 會根據 GitHub 的公鑰登錄檔驗證權杖的簽章,並根據管理主控台中設定的規則集進行檢查。
- 如果權杖符合規則集,Docker 會傳回一個短期存取權杖,其範圍限定在該規則集所定義的資源。
- docker/login-action 使用此權杖驗證 Docker Hub。此後,docker pull、docker push 和 docker build 指令即可正常運作。
整個交換過程不需要任何儲存的機密、API 金鑰或存取權杖。短期 Docker 存取權杖會在數分鐘內過期,且無法重複使用。
這與 AWS 和 GCP 已經用於雲端資源存取的模式相同(AWS OIDC for GitHub Actions、GCP Workload Identity Federation)。Docker 將此模式應用於容器登錄檔存取。
開始使用
設定只需在 Docker Home 中建立一次性連線,並對您的工作流程 YAML 進行小幅更新。
步驟 1:建立連線
登入 Docker Home,選擇您的組織,然後導覽至 OIDC 連線。選擇「建立 OIDC 連線」,並設定控制哪些存放庫、分支和工作流程可以存取哪些 Docker Hub 資源的規則集。您可以為每個連線建立最多五個規則集。當工作流程觸發 OIDC 交換時,Docker 會根據連線中定義的每個規則集檢查權杖。如果某個規則集的條件得到滿足,Docker 會根據該規則集設定的參數授予存取權限。
規則集使用 OIDC 主體宣告來比對傳入的權杖。您可以將特定存放庫和分支設為固定值,這是建議的安全最佳實務:
- repo:my-org/my-repo:ref:refs/heads/main — 僅限特定存放庫的主分支
- repo:my-org/my-repo:ref:refs/heads/release-* — 所有發行分支
- repo:my-org/my-repo:* – 此存放庫的所有分支
- repo:my-org/* — 組織中的任何存放庫(不建議)
完成後請複製連線 ID。
注意:2026 年 7 月 15 日之後建立的 GitHub 存放庫,預設主體宣告會使用不可變識別碼。例如:repo:octocat@123456/my-repo@456789:ref:refs/heads/main。詳細資訊請參閱 GitHub 變更日誌。
步驟 2:更新您的工作流程
更新您的 GitHub Actions 工作流程。將 <YOUR_CONNECTION_ID> 替換為上一步的 ID,並將 <YOUR_ORG_NAME> 替換為您的 Docker 組織名稱:
permissions:
contents: read
id-token: write
steps:
- name: Docker login
uses: docker/login-action@v4 # v4.5.0+
with:
username: <YOUR_ORG_NAME>
env:
DOCKERHUB_OIDC_CONNECTIONID: <YOUR_CONNECTION_ID>
id-token: write 權限允許工作流程要求 GitHub OIDC 權杖。當設定 DOCKERHUB_OIDC_CONNECTIONID 時,docker/login-action 會在單一步驟中處理權杖交換和 Docker 登入。此後,docker pull、docker push 和 docker build 指令即可正常運作。傳入宣告 sub 值的詳細資訊可用於診斷連線失敗的原因。
步驟 3:驗證 OIDC 連線是否正常運作
執行您的工作流程,並確認其成功完成。如果遇到錯誤,OIDC 連線頁面的「失敗」分頁會顯示傳入宣告 sub 值的詳細資訊,您可以使用這些資訊來診斷連線失敗的原因。
步驟 4:移除儲存的憑證
在驗證您的工作流程能成功使用 OIDC 執行後,請從 GitHub 存放庫機密中移除舊的 PAT 或 OAT。您不再需要它。
移轉清單
- 建立連線
- 更新您的工作流程
- 驗證 OIDC 連線是否正常運作
- 移除儲存的憑證
哪些部分不會改變
- 現有的 PAT 和 OAT 仍可繼續使用。組織可以自行決定何時將工作流程移轉至 OIDC 連線。
- 映像、登錄檔和建置工作流程保持不變。OIDC 連線僅取代驗證步驟;下游的所有流程都相同。
- 本機開發和非 GitHub CI 仍使用 PAT 和 OAT。OIDC 連線是專門針對 GitHub Actions 所建議的替代方案。其他 CI 供應商將根據需求後續支援。
了解更多
- 了解更多關於 OpenID Connect 的資訊
- 前往 Docker Home 開始使用
- 閱讀 文件
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.