このページでは、Google Distributed Cloud(GDC)エアギャップでパッケージ検証に使用されるルート認証局をローテーションする方法について説明します。
GDC パッケージの検証では、ルート認証局(CA)を使用してリリースキー証明書を検証します。そのため、ルート CA 証明書を定期的にローテーションすることが重要になります。リリース通知またはアップグレードの実行時に表示される可能性のある警告メッセージで指示された場合は、ルート CA をローテーションする必要があります。アップグレード プロセスの詳細については、アーティファクトをコンテナ レジストリに push するをご覧ください。
始める前に
パッケージ検証証明書をローテーションするには、必要な ID とアクセスロールが必要です。
- システム Artifact Registry デバッガ: すべての Harbor リソースに対する読み取り / 書き込みアクセス権があります。セキュリティ管理者に、システム アーティファクト レジストリ デバッガ(
sar-debugger)クラスタロールを付与するよう依頼します。
証明書のローテーションが必要かどうかを確認する
オペレーションを実行する前に、パッケージ検証証明書のローテーションが必要かどうかを確認します。
KUBECONFIG環境変数を設定します。$ KUBECONFIG=PATH_TO_KUBECONFIG_FILEPATH_TO_KUBECONFIG_FILEは、ルート管理クラスタでgdcloud auth loginを実行して取得したkubeconfigファイルのパスに置き換えます。現在のトラスト アンカーと最新のトラスト アンカーを比較して、アップグレードが必要かどうかを判断します。
harbor-system/package-validation-root-certsのConfigMapデータは、ローカル トラスト アンカーと比較されます。$ 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!証明書をローテーションする必要がある場合は、証明書のローテーションとアップグレードを行うをご覧ください。
証明書のローテーションとアップグレードを行う
Infrastructure as Code(IaC)ツールとプロセスを使用して、ルート管理クラスタの harbor-system/package-validation-root-certs にある ConfigMap オブジェクトをローテーションします。
次の変数を作成して値を割り当てます。
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-systemGDC_URLは、GDC プロジェクトの URL に置き換えます。リポジトリのクローンを作成します。
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 で個人用アクセス トークンを作成する方法をご覧ください。証明書のローテーション プロセスの出力ファイルを含むターゲット フォルダを作成します。
mkdir -p "${TARGET_FOLDER}"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信頼アンカーが正しく更新されたことを確認します。
$ 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信頼アンカーの値を置き換えるために使用した一時ファイルを削除します。
$ rm "${TEMPLATE_FILE}" "${AWK_RULE_FILE}" "${LATEST_TRUST_ANCHOR_CA_FILE}"変更をコミットする前にオブジェクトを検証します。
$ /root/release/gdcloud system assets validate --config "${OUTPUT}" --level object変更を 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マージ リクエストを作成します。
$ git -c http.sslVerify=false push -o merge_request.create \ https://${USERNAME}:TOKEN@gitlab.${URL}/gdch/iac ${USERNAME}-branch出力は次の例のようになります。
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変更がマージされたら、別の IO から証明書のローテーションの承認を取得する必要があります。
証明書のローテーションの承認を取得する
別の IO ユーザーが承認者の役割を引き受け、この変更を確認する必要があります。承認する IO は、次の手順を行う必要があります。
アップグレード先のターゲット バージョンの保護されたトラスト アンカーを USB ドライブにダウンロードします。このファイルをダウンロードするには、Cloud Storage バケットにアクセスできる必要があります。アクセス権を取得するには、GDC サポートにエスカレーションします。GDC ディストリビューションとファイルのダウンロードについて詳しくは、ファイルをダウンロードするをご覧ください。
USB ドライブを使用して、最新バージョンのトラスト アンカーをエアギャップ環境にコピーします。
証明書を取得し、マージ リクエストの証明書と取得した証明書を比較します。
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.zDIGEST_INFORMATION: Google の担当者から受け取ったダイジェスト情報。ダイジェスト情報は、特定のリリースによって異なります。たとえば、1.2.0-gdch.243ダイジェストは1.2.0-gdch.321ダイジェストとは異なります。この情報は、セキュリティ上の理由から手動で提供されます。
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-----RootSyncリソースを確認して、オペレーションが成功したかどうかを確認します。RootSyncリソースを使用すると、cluster-admin権限を持つクラスタ上の任意のリソースを管理できます。RootSyncリソースが正常にレンダリングされたかどうかを確認します。$ kubectl --kubeconfig=$KUBECONFIG describe rootsync/root-sync -n config-management-systemRootSyncレンダリングが成功した場合、出力にはRendering succeededというメッセージが含まれます。オペレーションが失敗した場合は、IaC 構成の問題が原因である可能性があります。詳細については、デバッグのヒントをご覧ください。