Connetti Cloud Build a un'istanza Private Service Connect

Puoi connettere Cloud Build a un'istanza Private Service Connect di Secure Source Manager utilizzando i pool privati di Cloud Build. Questa connessione è un'alternativa più complessa all'utilizzo di Developer Connect. Utilizza l'approccio descritto in questa guida se non ti senti a tuo agio a esporre un endpoint proxy Git.

Prima di iniziare

  1. Crea un'istanza Private Service Connect di Secure Source Manager.
  2. Se in precedenza hai configurato gli endpoint per l'istanza Private Service Connect, devi disconnetterli. Per rilasciare gli endpoint, segui le istruzioni riportate in Rilascia un indirizzo IPv4 o IPv6 interno statico.
  3. Abilita le API Cloud Build, Service Networking e Compute Engine.

    Ruoli richiesti per abilitare le API

    Per abilitare le API, devi disporre del ruolo IAM Amministratore utilizzo servizi (roles/serviceusage.serviceUsageAdmin), che contiene l'autorizzazione serviceusage.services.enable. Scopri come concedere i ruoli.

    Abilita le API

Ruoli obbligatori

Per ottenere le autorizzazioni necessarie per connettere Cloud Build a un'istanza Private Service Connect di Secure Source Manager, chiedi all'amministratore di concederti il ruolo IAM Amministratore Gestore contesto accesso (roles/accesscontextmanager.policyAdmin) nell'organizzazione.

Configura il account di servizio

Per seguire il principio del privilegio minimo in Cloud Build, puoi configurare Cloud Build in modo che utilizzi un service account con privilegi sufficienti per eseguire una build.

Se non specifichi un account di servizio, Cloud Build potrebbe selezionarne automaticamente uno per eseguire le build per tuo conto. Questo account di servizio potrebbe avere autorizzazioni inutilmente ampie per il tuo caso d'uso, come l'accesso all'istanza Secure Source Manager e a tutti i repository nel tuo progetto.

  1. Crea un service account se non ne hai già uno che vuoi utilizzare.

  2. Nella Google Cloud console, vai alla Secure Source Manager Autorizzazioni pagina:

    Vai ad Autorizzazioni

  3. Nella scheda Autorizzazioni service account, seleziona il account di servizio che vuoi utilizzare come account di servizio Cloud Build.

  4. (Facoltativo) Seleziona Imposta come service account preferito per precompilare il account di servizio quando crei nuovi trigger.

Concedi al account di servizio le autorizzazioni richieste

  1. Concedi al account di servizio i ruoli Cloud Build richiesti per il tuo caso d'uso. Per informazioni sui ruoli Cloud Build richiesti per diverse azioni di Cloud Build, consulta Configurazione dell'accesso a Cloud Build.

  2. Per concedere al account di servizio le autorizzazioni per recuperare il certificato CA, esegui questo comando.

    gcloud projects add-iam-policy-binding CA_PROJECT_ID \
      --member=serviceAccount:SA_EMAIL \
      --role=roles/privateca.auditor \
      --condition=None
    

    Sostituisci quanto segue:

    • CA_PROJECT_ID: con l'ID progetto del progetto del pool di CA.
    • SA_EMAIL: con l'indirizzo email del account di servizio che hai impostato come account di servizio Cloud Build.
  3. Per concedere al account di servizio le autorizzazioni per accedere all'istanza Secure Source Manager, esegui questo comando.

    gcloud projects add-iam-policy-binding INSTANCE_PROJECT_ID \
      --member=serviceAccount:SA_EMAIL \
      --role=roles/securesourcemanager.instanceAccessor \
      --condition=None
    
  4. Per concedere al account di servizio le autorizzazioni per leggere dai repository Secure Source Manager, esegui questo comando.

    gcloud projects add-iam-policy-binding INSTANCE_PROJECT_ID \
      --member=serviceAccount:SA_EMAIL \
      --role=roles/securesourcemanager.repoReader \
      --condition=None
    

Configura i log di build

Quando specifichi il tuo account di servizio per le build, devi archiviare i log di build in Cloud Logging o in un bucket Cloud Storage creato dall'utente. Non puoi archiviare i log nel bucket dei log predefinito.

Per archiviare i log di build in Cloud Logging, concedi il ruolo Writer log (roles/logging.logWriter) al tuo account di servizio Cloud Build.

Per ulteriori informazioni su come configurare i log di build, consulta Configurare i service account specificati dall'utente.

Crea una zona Cloud DNS privata

Per creare una zona Cloud DNS privata gestita, esegui questo comando.

gcloud dns managed-zones create ZONE_NAME \
    --project=PROJECT_ID \
    --description=DESCRIPTION \
    --dns-name="INSTANCE_LOCATION.p.sourcemanager.dev." \
    --visibility="private" \
    --networks="https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK"

Sostituisci quanto segue:

  • ZONE_NAME: con il nome che vuoi assegnare alla zona gestita.
  • PROJECT_ID: con l'ID progetto del Google Cloud progetto che vuoi utilizzare per la zona DNS di Cloud DNS.
  • DESCRIPTION: con una descrizione per la zona.
  • INSTANCE_LOCATION: con la località in cui vuoi creare l'istanza Secure Source Manager.

Per ulteriori informazioni sulle zone Cloud DNS private gestite, consulta Panoramica di Cloud DNS.

Configura la rete Virtual Private Cloud (VPC)

  1. Prenota un intervallo IP che vuoi utilizzare per il peering del VPC Secure Source Manager con il pool privato Cloud Build.

     gcloud compute addresses create CB_PEER_RANGE \
      --global \
      --purpose=VPC_PEERING \
      --prefix-length=24 \
      --description="IP range for peering with Cloud Build private pool" \
      --network=NETWORK \
      --project=INSTANCE_PROJECT_ID
    

    Sostituisci quanto segue:

    • CB_PEER_RANGE: con il nome dell'indirizzo da creare.
    • NETWORK: con la risorsa di rete in cui devono essere riservati gli indirizzi. Se utilizzi la rete predefinita, il valore è default.
    • INSTANCE_PROJECT_ID: con l'ID progetto dell'istanza Private Service Connect.
  2. Per creare un peering VPC con servicenetworking.googleapis.com, esegui questo comando.

    gcloud services vpc-peerings connect \
      --service=servicenetworking.googleapis.com \
      --ranges=CB_PEER_RANGE \
      --network=NETWORK \
      --project=INSTANCE_PROJECT_ID
    
  3. Per creare un dominio DNS in peering per la connessione a Cloud Build, esegui questo comando.

    gcloud services peered-dns-domains create DNS_PEERING_DOMAIN \
      --network=NETWORK \
      --project=INSTANCE_PROJECT_ID \
      --dns-suffix=INSTANCE_LOCATION.p.sourcemanager.dev.
    

    Sostituisci quanto segue:

    • DNS_PEERING_DOMAIN: con il nome del dominio DNS in peering che stai creando.

    Le zone DNS private devono essere condivise in modo esplicito. Per ulteriori informazioni sulla condivisione delle zone DNS private, consulta Condividere le zone DNS private con i produttori di servizi.

  4. Per esportare le route di rete in Cloud Build, esegui questo comando.

    gcloud compute networks peerings update servicenetworking-googleapis-com \
      --network=NETWORK \
      --export-custom-routes \
      --no-export-subnet-routes-with-public-ip \
      --project=INSTANCE_PROJECT_ID
    
  5. Per creare il pool privato Cloud Build nello stesso Google Cloud progetto dell'istanza Private Service Connect, esegui questo comando.

    gcloud builds worker-pools create PRIVATE_POOL_ID \
      --project=INSTANCE_PROJECT_ID \
      --region=INSTANCE_LOCATION \
      --peered-network=projects/INSTANCE_PROJECT_ID/global/networks/NETWORK \
      --worker-disk-size=100 \
      --no-public-egress
    

    Dove PRIVATE_POOL_ID è il nome del pool privato che stai creando. Il nome deve contenere da 1 a 63 caratteri e i caratteri validi sono [a-zA-Z0-9_-]+.

  6. Per creare un gruppo di endpoint di rete (NEG) Private Service Connect per l'endpoint HTTP, esegui questo comando:

    gcloud compute network-endpoint-groups create HTTP_NEG_NAME \
        --project=INSTANCE_PROJECT_ID \
        --region=INSTANCE_LOCATION \
        --network-endpoint-type=PRIVATE_SERVICE_CONNECT \
        --psc-target-service=HTTP_PSC \
        --network=NETWORK --subnet=SUBNET
    

    Dove:

    • HTTP_NEG_NAME è il nome del NEG che vuoi creare per l'endpoint HTTP.
    • HTTP_PSC è il valore dell'endpoint HTTP Private Service Connect.
  7. Per creare un NEG Private Service Connect per l'endpoint SSH, esegui questo comando:

    gcloud compute network-endpoint-groups create SSH_NEG_NAME \
      --project=INSTANCE_PROJECT_ID \
      --region=INSTANCE_LOCATION \
      --network-endpoint-type=PRIVATE_SERVICE_CONNECT \
      --psc-target-service=SSH_PSC \
      --network=NETWORK --subnet=SUBNET
    

    Dove:

    • SSH_NEG_NAME è il nome del NEG che vuoi creare per l'endpoint SSH.
    • SSH_PSC è il valore dell'endpoint SSH Private Service Connect.

Configura un bilanciatore del carico interno (ILB) proxy

Gli endpoint non sono accessibili dalle reti VPC in peering. Per accedere agli endpoint Secure Source Manager, devi configurare un bilanciatore del carico interno (ILB) L4 per ogni endpoint. Per ulteriori informazioni sull'accesso ai servizi pubblicati tramite gli endpoint, consulta Informazioni sull'accesso ai servizi pubblicati tramite gli endpoint.

  1. Per creare una subnet solo proxy per gli ILB, esegui questo comando.

    gcloud compute networks subnets create ILB_PROXY_SUBNET_NAME \
    --purpose=REGIONAL_MANAGED_PROXY \
    --role=ACTIVE \
    --region=INSTANCE_LOCATION \
    --network=NETWORK \
    --range=CIDR_RANGE \
    --project=INSTANCE_PROJECT_ID
    

    Dove:

    • ILB_PROXY_SUBNET_NAME è il nome della subnet da creare.
    • CIDR_RANGE è l'intervallo di indirizzi IP primario della subnet. Devi utilizzare una subnet mask non superiore a 26 in modo che siano disponibili almeno 64 indirizzi IP per i proxy nella regione. La lunghezza consigliata della subnet mask è /23. Per ulteriori informazioni sulle subnet solo proxy, consulta Subnet solo proxy per i bilanciatori del carico basati su Envoy.
  2. Per creare un ILB L4 per il NEG di connessione HTTP, esegui questo comando.

    gcloud compute backend-services create HTTP_PROXY_ILB \
      --project=INSTANCE_PROJECT_ID \
      --region=INSTANCE_LOCATION \
      --load-balancing-scheme=INTERNAL_MANAGED
    

    Dove HTTP_PROXY_ILB è il nome dell'ILB da creare per l'endpoint HTTP.

  3. Per creare un ILB L4 per il NEG di connessione SSH, esegui questo comando.

    gcloud compute backend-services create SSH_PROXY_ILB \
        --project=INSTANCE_PROJECT_ID \
        --region=INSTANCE_LOCATION \
        --load-balancing-scheme=INTERNAL_MANAGED
    

    Dove SSH_PROXY_ILB è il nome dell'ILB da creare per l'endpoint SSH.

Registra il NEG Private Service Connect come backend degli ILB

  1. Per registrare il NEG HTTP, esegui questo comando.

    gcloud compute backend-services add-backend HTTP_PROXY_ILB \
      --network-endpoint-group=HTTP_NEG_NAME \
      --network-endpoint-group-region=INSTANCE_LOCATION \
      --project=INSTANCE_PROJECT_ID
    
  2. Per registrare il NEG SSH, esegui questo comando.

    gcloud compute backend-services add-backend SSH_PROXY_ILB \
      --network-endpoint-group=SSH_NEG_NAME \
      --network-endpoint-group-region=INSTANCE_LOCATION \
      --project=INSTANCE_PROJECT_ID
    

Crea proxy TCP di destinazione per gli ILB

  1. Per creare un proxy TCP di destinazione per l'ILB HTTP, esegui questo comando.

    gcloud compute target-tcp-proxies create ILB_HTTP_TCP_TARGET_PROXY \
      --backend-service=HTTP_PROXY_ILB \
      --region=INSTANCE_LOCATION \
      --project=INSTANCE_PROJECT_ID
    

    Dove ILB_HTTP_TCP_TARGET_PROXY è il nome del proxy TCP di destinazione che vuoi creare per l'ILB HTTP.

  2. Per creare un proxy TCP di destinazione per l'ILB SSH, esegui questo comando.

    gcloud compute target-tcp-proxies create ILB_SSH_TCP_TARGET_PROXY \
      --backend-service=SSH_PROXY_ILB \
      --region=INSTANCE_LOCATION \
      --project=INSTANCE_PROJECT_ID
    

    Dove ILB_SSH_TP_TARGET_PROXY è il nome del proxy TCP di destinazione che stai creando per l'ILB SSH.

Crea regole di forwarding per indirizzare il traffico agli ILB

  1. Per creare una regola di forwarding per indirizzare il traffico all'ILB HTTP, esegui questo comando.

    gcloud compute forwarding-rules create HTTP_PROXY_FORWARD \
        --project=INSTANCE_PROJECT_ID \
        --ports 443 \
        --target-tcp-proxy=ILB_HTTP_TCP_TARGET_PROXY \
        --target-tcp-proxy-region=INSTANCE_LOCATION \
        --network-tier PREMIUM \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --network=NETWORK \
        --subnet=SUBNET \
        --subnet-region=INSTANCE_LOCATION
    

    Dove HTTP_PROXY_FORWARD è il nome della regola di forwarding che stai creando.

  2. Per creare una regola di forwarding per indirizzare il traffico all'ILB SSH, esegui questo comando.

    gcloud compute forwarding-rules create SSH_PROXY_FORWARD \
        --project=INSTANCE_PROJECT_ID \
        --ports 22 \
        --target-tcp-proxy=ILB_SSH_TCP_TARGET_PROXY \
        --target-tcp-proxy-region=INSTANCE_LOCATION \
        --network-tier PREMIUM \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --network=NETWORK \
        --subnet=SUBNET \
        --subnet-region=INSTANCE_LOCATION
    

    Dove SSH_PROXY_FORWARD è il nome della regola di forwarding che stai creando.

Crea i record DNS privati

Una volta configurate le regole di forwarding, devi registrare i record DNS nella tua zona DNS privata di Cloud DNS per ogni nome host dell'istanza.

  1. Per ottenere l'indirizzo IP della regola di forwarding HTTP, esegui questo comando.

    gcloud compute forwarding-rules describe HTTP_PROXY_FORWARD \
        --project=INSTANCE_PROJECT_ID \
        --region=INSTANCE_LOCATION
    

    Dove HTTP_PROXY_FORWARD è il nome che hai assegnato alla regola di forwarding per HTTP.

  2. Per registrare il nome host dell'API, esegui questo comando.

    gcloud dns record-sets create INSTANCE_ID-INSTANCE_PROJECT_NUMBER-api.INSTANCE_LOCATION.p.sourcemanager.dev. \
        --project=INSTANCE_PROJECT_ID \
        --zone=ZONE_NAME \
        --type=A \
        --ttl=300 \
        --rrdatas=HTTP_LB_IP
    

    Sostituisci quanto segue:

    • INSTANCE_ID: con l'ID istanza.
    • INSTANCE_PROJECT_NUMBER: con il numero di progetto dell'istanza. Google Cloud
    • INSTANCE_LOCATION: con la regione dell'istanza.
    • INSTANCE_PROJECT_ID: con l'ID progetto dell'istanza. Google Cloud
    • ZONE_NAME: con il nome che hai assegnato alla zona gestita.
    • HTTP_LB_IP: è l'output di gcloud compute forwarding-rules describe HTTP_PROXY_FORWARD.
  3. Per registrare il nome host HTTP di Git, esegui questo comando.

    gcloud dns record-sets create INSTANCE_ID-INSTANCE_PROJECT_NUMBER-git.INSTANCE_LOCATION.p.sourcemanager.dev. \
        --project=INSTANCE_PROJECT_ID \
        --zone=ZONE_NAME \
        --type=A \
        --ttl=300 \
        --rrdatas=HTTP_LB_IP
    
  4. Per registrare il nome host HTML dell'interfaccia web, esegui questo comando.

    gcloud dns record-sets create INSTANCE_ID-INSTANCE_PROJECT_NUMBER.INSTANCE_LOCATION.p.sourcemanager.dev.\
        --project=INSTANCE_PROJECT_ID \
        --zone=ZONE_NAME \
        --type=A \
        --ttl=300 \
      --rrdatas=HTTP_LB_IP
    
  5. Per ottenere l'indirizzo IP della regola di forwarding SSH, esegui questo comando.

    gcloud compute forwarding-rules describe SSH_PROXY_FORWARD \
        --project=INSTANCE_PROJECT_ID \
        --region=INSTANCE_LOCATION
    

    Dove SSH_PROXY_FORWARD è il nome che hai assegnato alla regola di forwarding per SSH.

  6. Per registrare il nome host SSH di Git, esegui questo comando.

    gcloud dns record-sets create INSTANCE_ID-INSTANCE_PROJECT_NUMBER-ssh.INSTANCE_LOCATION.p.sourcemanager.dev. \
        --project=INSTANCE_PROJECT_ID \
        --zone=ZONE_NAME \
        --type=A \
        --ttl=300 \
        --rrdatas=SSH_LB_IP
    

    Dove SSH_LB_IP è l'output di gcloud compute forwarding-rules describe SSH_PROXY_FORWARD.

Crea un repository nell'istanza

Puoi utilizzare un bastion host per accedere e creare un repository nell'istanza Private Service Connect.

  1. Crea una VM bastion host con l'cloud-platform ambito seguendo le istruzioni riportate in Creare una VM bastion host.

  2. Crea un repository eseguendo questo comando.

    curl \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://INSTANCE_ID-PROJECT_NUMBER-api.INSTANCE_LOCATION.p.sourcemanager.dev/v1/projects/PROJECT_NUMBER/locations/INSTANCE_LOCATION/repositories?repository_id=REPOSITORY_ID \
    -d '{}'
    

    Sostituisci quanto segue:

    • INSTANCE_ID: con il nome dell'istanza Secure Source Manager.
    • PROJECT_NUMBER: con il numero di progetto dell'istanza. Google Cloud
    • INSTANCE_LOCATION: con la località dell'istanza.
    • REPOSITORY_ID: con il nome che vuoi assegnare al repository.

    Viene creato un repository nell'istanza Private Service Connect.

Testa l'accesso a Secure Source Manager da Cloud Build

Per verificare che tutto funzioni correttamente, puoi utilizzare il seguente file di configurazione della build per testare la connettività ed eseguire il pull del codice sorgente da Secure Source Manager. Il file di configurazione della build presuppone che tu stia utilizzando Cloud Logging per archiviare i log di build. Se utilizzi un bucket Cloud Storage creato dall'utente, consulta Eseguire una build utilizzando un file di configurazione per istruzioni su come modificare il file di configurazione della build.

Prima di utilizzare il seguente file YAML, sostituisci quanto segue:

  • CA_POOL_NAME: con il nome del pool di CA che hai utilizzato quando hai creato l'istanza Private Service Connect.
  • CA_PROJECT_ID: con il Google Cloud progetto che hai utilizzato per creare il pool di CA.
  • INSTANCE_LOCATION: con la località dell'istanza.
  • INSTANCE_ID: con il nome dell'istanza.
  • INSTANCE_PROJECT_NUMBER: con il numero di progetto dell'istanza. Google Cloud
  • REPOSITORY_ID: con il nome che hai assegnato al repository.
  • SA_PROJECT_ID: con l'ID progetto del account di servizio che utilizzi con Cloud Build.
  • SERVICE_ACCOUNT: con l'indirizzo email del account di servizio che utilizzi con Cloud Build.
steps:
  - name: gcr.io/cloud-builders/gcloud
    args:
      - privateca
      - pools
      - get-ca-certs
      - CA_POOL_NAME
      - '--project'
      - CA_PROJECT_ID
      - '--location'
      - INSTANCE_LOCATION
      - '--output-file=cacert.pem'
  - name: gcr.io/cloud-builders/git
    args:
      - config
      - '--global'
      - 'credential.https://INSTANCE_ID-INSTANCE_PROJECT_NUMBER-git.INSTANCE_LOCATION.p.sourcemanager.dev.helper'
      - gcloud.sh
  - name: gcr.io/cloud-builders/git
    args:
      - config
      - '--global'
      - http.sslCAInfo
      - cacert.pem
  - name: gcr.io/cloud-builders/git
    env:
      - GIT_TRACE=1
      - GIT_CURL_VERBOSE=1
    args:
      - clone
      - >-
        https://INSTANCE_ID-INSTANCE_PROJECT_NUMBER-git.INSTANCE_LOCATION.p.sourcemanager.dev/INSTANCE_PROJECT_ID/REPOSITORY_ID
      - https-clone
serviceAccount: 'projects/SA_PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT'
options:
  logging: CLOUD_LOGGING_ONLY

Passaggi successivi