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.

Prima di iniziare

  1. Crea un'istanza Secure Source Manager di Private Service Connect.
  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. Enable the Cloud Build, Service Networking, and Compute Engine APIs.

    Enable the APIs

Ruoli obbligatori

Per ottenere le autorizzazioni necessarie per connettere Cloud Build a un'istanza Private Service Connect Secure Source Manager, chiedi all'amministratore di concederti il ruolo IAM Amministratore di Access Context Manager (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 disporre di autorizzazioni inutilmente ampie per il tuo caso d'uso, ad esempio l'accesso alla tua istanza di Secure Source Manager e a qualsiasi repository nel tuo progetto.

  1. Crea un account di servizio se non ne hai già uno da utilizzare.

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

    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 ilaccount di serviziot quando crei nuovi trigger.

Concedi le autorizzazioni richieste al account di servizio

  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 le diverse azioni di Cloud Build, consulta Configurazione dell'accesso a Cloud Build.

  2. Per concedere all'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'email del account di servizio che hai impostato come account di serviziot Cloud Build.
  3. Per concedere al account di servizio le autorizzazioni per accedere all'istanza di 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 all'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 di log predefinito.

Per archiviare i log di build in Cloud Logging, concedi il ruolo Writer log (roles/logging.logWriter) al tuoaccount di serviziont 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 privato 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 progetto Google Cloud che vuoi utilizzare per la zona Cloud DNS.
  • DESCRIPTION: con una descrizione della zona.
  • INSTANCE_LOCATION: con la località in cui vuoi creare l'istanza Secure Source Manager.

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

Configura la rete Virtual Private Cloud (VPC)

  1. Riserva 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 il comando seguente.

    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 con peering per connetterti 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 saperne di più sulla condivisione delle zone DNS private, consulta Condividere 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 essere compreso tra 1 e 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 il comando seguente:

    gcloud beta 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 il seguente comando:

    gcloud beta 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 Private Service Connect SSH.

Configura un bilanciatore del carico interno (ILB) proxy

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

  1. Per creare una subnet solo proxy per i bilanciatori del carico interni, esegui il comando seguente.

    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 principale 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 della maschera di sottorete consigliata è /23. Per saperne di più sulle subnet solo proxy, consulta Subnet solo proxy per i bilanciatori del carico basati su Envoy.
  2. Per creare il bilanciamento del carico interno 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 del bilanciamento del carico interno da creare per l'endpoint HTTP.

  3. Per creare un bilanciamento del carico interno di livello 4 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 del bilanciatore del carico interno da creare per l'endpoint SSH.

Registra il NEG Private Service Connect come backend dei bilanciatori del carico interni

  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 il comando seguente.

    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 i bilanciatori del carico interni

  1. Per creare un proxy TCP di destinazione per il bilanciamento del carico interno 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 il bilanciamento del carico interno HTTP.

  2. Per creare un proxy TCP di destinazione per il bilanciamento del carico interno 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 il bilanciamento del carico interno SSH.

Crea regole di forwarding per instradare il traffico ai bilanciatori del carico interni

  1. Per creare una regola di forwarding per il routing del traffico verso il bilanciamento del carico HTTP interno, 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 il routing del traffico al bilanciamento del carico interno 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 tuoi record DNS privati

Una volta configurate le regole di inoltro, devi registrare i record DNS nella zona Cloud DNS privata per ciascuno dei nomi 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 dato alla regola di forwarding per HTTP.

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

    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 Google Cloud dell'istanza.
    • INSTANCE_LOCATION: con la regione dell'istanza.
    • INSTANCE_PROJECT_ID: con l'ID progetto Google Cloud della tua istanza.
    • 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 Git, esegui il comando seguente.

    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 per l'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 dato alla regola di inoltro per SSH.

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

    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'ambito cloud-platform seguendo le istruzioni riportate in Crea 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 Google Cloud dell'istanza.
    • INSTANCE_LOCATION: con la posizione dell'istanza.
    • REPOSITORY_ID: con il nome che vuoi dare al tuo repository.

    Un repository viene creato nell'istanza Private Service Connect.

Testare 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 estrarre il codice sorgente da Secure Source Manager. Il file di configurazione della build presuppone che tu stia utilizzando Cloud Logging per archiviare i log della build. Se utilizzi un bucket Cloud Storage creato dall'utente, consulta la sezione 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 progetto Google Cloud che hai utilizzato per creare il pool di CA.
  • INSTANCE_LOCATION: con la posizione dell'istanza.
  • INSTANCE_ID: con il nome dell'istanza.
  • INSTANCE_PROJECT_NUMBER: con il numero di progetto Google Cloud dell'istanza.
  • REPOSITORY_ID: con il nome che hai dato 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