パッケージ検証証明書をローテーションする

このページでは、Google Distributed Cloud(GDC)エアギャップでパッケージ検証に使用されるルート認証局をローテーションする方法について説明します。

GDC パッケージの検証では、ルート認証局(CA)を使用してリリースキー証明書を検証します。そのため、ルート CA 証明書を定期的にローテーションすることが重要になります。リリース通知またはアップグレードの実行時に表示される可能性のある警告メッセージで指示された場合は、ルート CA をローテーションする必要があります。アップグレード プロセスの詳細については、アーティファクトをコンテナ レジストリに push するをご覧ください。

始める前に

パッケージ検証証明書をローテーションするには、必要な ID とアクセスロールが必要です。

  • システム Artifact Registry デバッガ: すべての Harbor リソースに対する読み取り / 書き込みアクセス権があります。セキュリティ管理者に、システム アーティファクト レジストリ デバッガ(sar-debugger)クラスタロールを付与するよう依頼します。

証明書のローテーションが必要かどうかを確認する

オペレーションを実行する前に、パッケージ検証証明書のローテーションが必要かどうかを確認します。

  1. KUBECONFIG 環境変数を設定します。

    $ KUBECONFIG=PATH_TO_KUBECONFIG_FILE
    

    PATH_TO_KUBECONFIG_FILE は、ルート管理クラスタで gdcloud auth login を実行して取得した kubeconfig ファイルのパスに置き換えます。

  2. 現在のトラスト アンカーと最新のトラスト アンカーを比較して、アップグレードが必要かどうかを判断します。harbor-system/package-validation-root-certsConfigMap データは、ローカル トラスト アンカーと比較されます。

    $ 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. 証明書をローテーションする必要がある場合は、証明書のローテーションとアップグレードを行うをご覧ください。

証明書のローテーションとアップグレードを行う

Infrastructure as Code(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 プロジェクトの URL に置き換えます。

  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. 変更を commit します。

    $ 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 バケットにアクセスできる必要があります。アクセス権を取得するには、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 構成の問題が原因である可能性があります。詳細については、デバッグのヒントをご覧ください。