輪替套件驗證憑證

本頁說明如何在 Google Distributed Cloud (GDC) 氣隙環境中,輪替用於套件驗證的根憑證授權單位

GDC 套件驗證會使用根憑證授權單位 (CA) 驗證發布金鑰憑證。因此定期輪替根 CA 憑證至關重要。如果發布通知或升級時顯示的警告訊息指示您輪替根 CA,請務必輪替。如要進一步瞭解升級程序,請參閱「將構件推送至容器登錄檔」。

事前準備

如要輪替套件驗證憑證,您必須具備必要的 Identity and Access Management 角色:

  • 系統構件登錄檔偵錯工具:具備所有 Harbor 資源的讀寫權限。請要求安全管理員授予您「系統構件登錄檔偵錯工具」(sar-debugger) 叢集角色。

必須驗證憑證輪替

執行作業前,請先確認是否需要輪替套件驗證憑證:

  1. 設定 KUBECONFIG 環境變數:

    $ KUBECONFIG=PATH_TO_KUBECONFIG_FILE
    

    PATH_TO_KUBECONFIG_FILE 替換為您在根管理員叢集中執行 gdcloud auth login 時取得的 kubeconfig 檔案路徑

  2. 比較目前的信任錨點與最新信任錨點,判斷是否需要升級。系統會將 ConfigMap 的資料與本機信任錨點進行比較:harbor-system/package-validation-root-certs

    $ CURRENT_TRUST_ANCHOR=$(kubectl  --kubeconfig=$KUBECONFIG get cm package-validation-root-certs -n harbor-system -o jsonpath='{.data.ca\.crt}')
    
    $ LATEST_TRUST_ANCHOR=$(cat /root/release/staging_root_ca_certificate.crt)
    
    $ diff <( echo "$CURRENT_TRUST_ANCHOR" ) <( echo "$LATEST_TRUST_ANCHOR" ) && echo trust anchors are same  || echo trust anchors are different, upgrade required!
    
  3. 如果必須輪替憑證,請參閱「執行憑證輪替和升級」。

執行憑證輪替和升級

使用基礎架構即程式碼 (IaC) 工具和程序,輪替根管理員叢集 harbor-system/package-validation-root-certs 中的 ConfigMap 物件。

  1. 建立下列變數並指派值:

    USERNAME=gitlab-admin
    URL=GDC_URL
    TEMPLATE_FILE="/tmp/package-validation-root-certs.yaml.tpl"
    TARGET_FOLDER=/tmp/${USERNAME}/infrastructure/zonal/zones/ZONE_NAME/root-admin/package-validation
    OUTPUT="${TARGET_FOLDER}/package-validation-root-certs.yaml"
    LATEST_TRUST_ANCHOR_CA_FILE=/root/release/staging_root_ca_certificate.crt
    CONFIGMAP_NAME=package-validation-root-certs
    NAMESPACE=harbor-system
    

    GDC_URL 替換為 GDC 專案的網址。

  2. 複製存放區:

    git -c http.sslVerify=false clone -b main https://${USERNAME}:TOKEN@gitlab.${URL}/gdch/iac /tmp/${USERNAME}
    

    TOKEN 替換成 GitLab 的個人存取權杖。詳情請參閱 https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html#create-a-personal-access-token,瞭解如何建立個人存取權杖。

  3. 建立目標資料夾,用於存放憑證輪替程序產生的輸出檔案:

    mkdir -p "${TARGET_FOLDER}"
    
  4. 更新並替換 LATEST_TRUST_ANCHOR 的值:

      cat <<EOF  > "${OUTPUT}"
      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: ${CONFIGMAP_NAME}
        namespace: ${NAMESPACE}
      data:
        ca.crt: |
      $(sed 's/^/    /' "${LATEST_TRUST_ANCHOR_CA_FILE}")
      EOF
    
  5. 確認信任錨點已正確更新:

    $ cat "${OUTPUT}"
    apiVersion: v1
    data:
      ca.crt: |
        -----BEGIN CERTIFICATE-----
        MIID3DCCAsSgAwIBAgITb1SPkse7G8syTQUFfc8NOqY4RzANBgkqhkiG9w0BAQsF
        ADB2MQswCQYDVQQGEwJ1czETMBEGA1UECBMKY2FsaWZvcm5pYTETMBEGA1UEBxMK
        c3Vubnl2aWxsZTEPMA0GA1UEChMGZ29vZ2xlMQ0wCwYDVQQLEwRnZGNoMR0wGwYD
        VQQDExRnZGNoLWNvZGUtc2lnbmluZy1jYTAeFw0yMzAzMDUwNjMyMjlaFw0zMzAz
        MDIwNjMyMjhaMHYxCzAJBgNVBAYTAnVzMRMwEQYDVQQIEwpjYWxpZm9ybmlhMRMw
        EQYDVQQHEwpzdW5ueXZpbGxlMQ8wDQYDVQQKEwZnb29nbGUxDTALBgNVBAsTBGdk
        Y2gxHTAbBgNVBAMTFGdkY2gtY29kZS1zaWduaW5nLWNhMIIBIjANBgkqhkiG9w0B
        AQEFAAOCAQ8AMIIBCgKCAQEAsD2XLR9cxbP0dnJfqdiBr1ZX1oq3AklU0IG5p7ZL
        F7NA1/qoKDWe5RuoBM/X4snI/5gnz9zuHapXA9HLN7bfEpr7orXlK00jn2AGqiNk
        jBriDFqgOF33W+/AWDG8HujlMosYK+Gp4FU9ni5S2Ay2sMk83CC+eFh7T//ji8y9
        PnUsLEwmNiCDb1UMqrcAXpmeTxd7PZlPIsujrkqLGAwjEE02XA7SqMPe/cPfzKEO
        0mK1VvxYmHdLOJtyKWgYIwy6+8Ka6Js3WgjNi0fLnxH7kbVaIvbLSvZa00JsX4GQ
        v1bxLSRUvfuI66O/vOEWH3zzKReTjQKMflz4570gciAntQIDAQABo2MwYTAOBgNV
        HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWZ0gQZKNybd8
        BAy2gamLf7Isiq4wHwYDVR0jBBgwFoAUWZ0gQZKNybd8BAy2gamLf7Isiq4wDQYJ
        KoZIhvcNAQELBQADggEBAGtifprappLxMaPQxGS8v2DYSlF3OYcBw2+JWISR62vB
        7mRjhuwh6QmcDHxLu+9RQ7E6aNaADCKbw0/6/OtGhvaxNtmZuBaBRhYPf2juQSgW
        BtQbmdr3h99wAFtpfvt4FOFYvTMRByOm/imi8Oq1+1y3OQEp2ayiMZ9pBg8DDY59
        juuszBKNZA99cMTtAQPCFkbMODRGFDYlaM5JhxVJ8/J9TCh4tNLx1BTJUtaZYjVF
        TlkzFdCoUnHWFPsapL1Mhje1vZBrhVKkSQETBfssvWQSNamOOLL139O428pxUUrH
        a7ahVae1mO4kQce3uBp3WyKcBx3pPNmYbRtGCe2xSB0=
        -----END CERTIFICATE-----
    kind: ConfigMap
    metadata:
      name: package-validation-root-certs
      namespace: harbor-system
    
  6. 移除用於取代信任錨點值的暫時檔案:

    $ rm "${TEMPLATE_FILE}" "${AWK_RULE_FILE}" "${LATEST_TRUST_ANCHOR_CA_FILE}"
    
  7. 先驗證物件,再提交變更:

    $ /root/release/gdcloud system assets validate --config "${OUTPUT}" --level object
    
  8. 修訂變更:

    $ cd "${TARGET_FOLDER}"
    $ git add -A
    $ git config user.name "GitlabAdmin"
    $ git config user.email "gitlab-admin@example.com"
    
    $ git commit -am "upgrade package-validation-root-certs"
    $ git checkout -b ${USERNAME}-branch
    
  9. 建立合併要求:

    $ git -c http.sslVerify=false push -o merge_request.create \
    https://${USERNAME}:TOKEN@gitlab.${URL}/gdch/iac ${USERNAME}-branch
    
  10. 輸出內容必須如以下範例所示:

    warning: redirecting to https://gitlab.zone1.google.gdch.test/gdch/iac.git/
    Enumerating objects: 8, done.
    Counting objects: 100% (8/8), done.
    Delta compression using up to 16 threads
    Compressing objects: 100% (4/4), done.
    Writing objects: 100% (7/7), 920 bytes | 920.00 KiB/s, done.
    Total 7 (delta 0), reused 0 (delta 0)
    remote:
    remote: View merge request for gitlab-admin-branch:
    remote:   https://gitlab.GDC_URL/gdch/iac/-/merge_requests/1
    remote:
    To https://gitlab.zone1.google.gdch.test/gdch/iac
    * [new branch]      gitlab-admin-branch -> gitlab-admin-branch
    
  11. 變更合併後,您必須向其他 IO 取得憑證輪替的核准

取得憑證輪替的核准

其他 IO 使用者必須擔任核准者角色,並驗證這項變更。核准 IO 必須採取下列步驟:

  1. 將目標升級版本的受保護信任錨點下載至 USB 隨身碟。如要下載這個檔案,您必須有權存取 Cloud Storage bucket。如要取得存取權,請向 GDC 支援團隊回報問題。 如要進一步瞭解如何下載 GDC 發行內容和檔案,請參閱「下載檔案」。

  2. 使用 USB 隨身碟,將最新版本的信任錨點複製到無網路連線的環境。

  3. 擷取憑證,並比較合併要求中的憑證與擷取的憑證:

    VERSION=VERSION
    DIGEST=DIGEST_INFORMATION
    export GCS_BUCKET=private-cloud-release
    DOWNLOADER=gdch-downloader-root-ca-$VERSION.sh
    gcloud storage cp "gs://$GCS_BUCKET/$VERSION/$DOWNLOADER" .
    echo "$DIGEST $DOWNLOADER" | sha256sum -c && chmod +x $DOWNLOADER && ./$DOWNLOADER --skip-unzip
    $ cat root_ca_certificate.crt
    

    更改下列內容:

    • VERSION:GDC 發布版本。例如:1.x.y-gdch.z
    • DIGEST_INFORMATION:您從 Google 聯絡窗口收到的摘要資訊。摘要資訊會因特定版本而異。舉例來說,1.2.0-gdch.243 摘要與 1.2.0-gdch.321 摘要不同。 基於安全考量,這項資訊是手動提供。
  4. 如果 ca.crt 憑證資料與下載的憑證相同,請核准變更。認證必須與下列範例類似:

    -----BEGIN CERTIFICATE-----
    MIID3DCCAsSgAwIBAgITb1SPkse7G8syTQUFfc8NOqY4RzANBgkqhkiG9w0BAQsF
    ADB2MQswCQYDVQQGEwJ1czETMBEGA1UECBMKY2FsaWZvcm5pYTETMBEGA1UEBxMK
    c3Vubnl2aWxsZTEPMA0GA1UEChMGZ29vZ2xlMQ0wCwYDVQQLEwRnZGNoMR0wGwYD
    VQQDExRnZGNoLWNvZGUtc2lnbmluZy1jYTAeFw0yMzAzMDUwNjMyMjlaFw0zMzAz
    MDIwNjMyMjhaMHYxCzAJBgNVBAYTAnVzMRMwEQYDVQQIEwpjYWxpZm9ybmlhMRMw
    EQYDVQQHEwpzdW5ueXZpbGxlMQ8wDQYDVQQKEwZnb29nbGUxDTALBgNVBAsTBGdk
    Y2gxHTAbBgNVBAMTFGdkY2gtY29kZS1zaWduaW5nLWNhMIIBIjANBgkqhkiG9w0B
    AQEFAAOCAQ8AMIIBCgKCAQEAsD2XLR9cxbP0dnJfqdiBr1ZX1oq3AklU0IG5p7ZL
    F7NA1/qoKDWe5RuoBM/X4snI/5gnz9zuHapXA9HLN7bfEpr7orXlK00jn2AGqiNk
    jBriDFqgOF33W+/AWDG8HujlMosYK+Gp4FU9ni5S2Ay2sMk83CC+eFh7T//ji8y9
    PnUsLEwmNiCDb1UMqrcAXpmeTxd7PZlPIsujrkqLGAwjEE02XA7SqMPe/cPfzKEO
    0mK1VvxYmHdLOJtyKWgYIwy6+8Ka6Js3WgjNi0fLnxH7kbVaIvbLSvZa00JsX4GQ
    v1bxLSRUvfuI66O/vOEWH3zzKReTjQKMflz4570gciAntQIDAQABo2MwYTAOBgNV
    HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWZ0gQZKNybd8
    BAy2gamLf7Isiq4wHwYDVR0jBBgwFoAUWZ0gQZKNybd8BAy2gamLf7Isiq4wDQYJ
    KoZIhvcNAQELBQADggEBAGtifprappLxMaPQxGS8v2DYSlF3OYcBw2+JWISR62vB
    7mRjhuwh6QmcDHxLu+9RQ7E6aNaADCKbw0/6/OtGhvaxNtmZuBaBRhYPf2juQSgW
    BtQbmdr3h99wAFtpfvt4FOFYvTMRByOm/imi8Oq1+1y3OQEp2ayiMZ9pBg8DDY59
    juuszBKNZA99cMTtAQPCFkbMODRGFDYlaM5JhxVJ8/J9TCh4tNLx1BTJUtaZYjVF
    TlkzFdCoUnHWFPsapL1Mhje1vZBrhVKkSQETBfssvWQSNamOOLL139O428pxUUrH
    a7ahVae1mO4kQce3uBp3WyKcBx3pPNmYbRtGCe2xSB0=
    -----END CERTIFICATE-----
    
  5. 檢查 RootSync 資源,確認作業是否成功。RootSync 資源可用於管理叢集上具有 cluster-admin 權限的任何資源。檢查 RootSync 資源是否已順利算繪:

    $ kubectl --kubeconfig=$KUBECONFIG describe rootsync/root-sync -n config-management-system
    
  6. 如果 RootSync 算繪成功,輸出內容會包含 Rendering succeeded 訊息。

  7. 如果作業失敗,問題可能出在 IaC 設定。 詳情請參閱偵錯提示,瞭解如何解決常見的 IaC 問題。