Controllo degli accessi basato sull'endpoint del producer PSC

1. Introduzione

Private Service Connect

Private Service Connect è una funzionalità di networking di Google Cloud che consente ai consumer di accedere ai servizi gestiti privatamente dall'interno della propria rete VPC. Allo stesso modo, consente ai producer di servizi gestiti di ospitare questi servizi nelle proprie reti VPC separate e di offrire una connessione privata ai propri consumer.

50b907b09af4d8ac.png

Controllo dell'accesso del producer di Private Service Connect

Anziché accettare automaticamente tutte le connessioni da qualsiasi consumer, i producer possono accettare le richieste di connessione in entrata solo se il consumer è presente nell'elenco di accettazione del consumer. Puoi specificare i consumer per progetto, rete VPC o singolo endpoint PSC. Non puoi includere diversi tipi di consumer nello stesso elenco di accettazione o rifiuto del consumer.

Per entrambe le preferenze di connessione, le connessioni accettate possono essere sostituite e rifiutate da una policy dell'organizzazione (compute.restrictPrivateServiceConnectConsumer) che blocca le connessioni in entrata.

Tieni presente che la policy dell'organizzazione (compute.restrictPrivateServiceConnectConsumer) si applica all'organizzazione,alla cartella o al progetto. Se vuoi un controllo dell'accesso granulare all'endpoint PSC, puoi utilizzare l'elenco di accettazione del consumer dei singoli endpoint PSC.

Controllo dell'accesso basato su endpoint

Il controllo dell'accesso basato su endpoint PSC consente a un producer di autorizzare i consumer tramite singoli endpoint PSC nelle policy di collegamento del servizio.

Questo approccio, consigliato per i servizi multi-tenant, fornisce il controllo più granulare per la gestione delle connessioni.

Questo codelab si concentra sull'apprendimento della configurazione di questa funzionalità.

Tieni presente che questo metodo non si applica ai backend di Private Service Connect.

2. Obiettivi didattici

  • Come producer, come pubblicare un servizio utilizzando PSC.
  • Come producer, come creare un controllo dell'accesso basato su endpoint PSC.
  • Come consumer, come accedere al servizio PSC.

3. Architettura complessiva del lab

3d7cbafaffb50d2d.png

4. Passaggi di preparazione

Ruoli IAM richiesti per lavorare nel lab

Inizia assegnando i ruoli IAM richiesti all'account GCP a livello di progetto.

  • Compute Network Admin (roles/compute.networkAdmin) Questo ruolo ti consente di controllare completamente le risorse di networking di Compute Engine.
  • Logging Admin (roles/logging.admin) Questo ruolo ti consente di accedere a tutte le autorizzazioni di logging e alle autorizzazioni dipendenti.
  • Service Usage Admin (roles/serviceusage.serviceUsageAdmin) Questo ruolo ti consente di abilitare, disabilitare e analizzare gli stati dei servizi, analizzare le operazioni e utilizzare la quota e la fatturazione per un progetto consumer.
  • Compute Instance Admin (roles/compute.instanceAdmin.v1) Questo ruolo ti consente di controllare completamente le istanze, i gruppi di istanze, i dischi, gli snapshot e le immagini di Compute Engine. Accesso in lettura a tutte le risorse di networking di Compute Engine.
  • Compute Security Admin (roles/compute.securityAdmin) Questo ruolo ti consente di creare, modificare ed eliminare regole firewall e certificati SSL, nonché di configurare le impostazioni di Shielded VM.

Abilita API

In Cloud Shell, assicurati che il progetto sia configurato correttamente e imposta le variabili di ambiente.

In Cloud Shell, esegui le seguenti operazioni:

gcloud auth login
gcloud config set project <your project id>
export project_id=$(gcloud config get-value project)
export region=us-central1
export zone=$region-a
echo $project_id
echo $region
echo $zone

Abilita tutte le API di Google necessarie nel progetto. In Cloud Shell, esegui le seguenti operazioni:

gcloud services enable \
  compute.googleapis.com 
  

Crea VPC producer

Nel progetto, crea una rete VPC con la modalità subnet personalizzata. Esegui le seguenti operazioni in Cloud Shell:

gcloud compute networks create producer-net \
    --subnet-mode=custom

Crea subnet nel VPC producer

Avrai bisogno di tre subnet: producer-subnet per il tuo servizio, proxy-only-subnet per il bilanciatore del carico per pubblicare il servizio e psc-subnet per PSC per pubblicare il servizio.

In Cloud Shell, esegui le seguenti operazioni per creare subnet IPV4:

gcloud compute networks subnets create producer-subnet \
    --network=producer-net \
    --range=10.10.0.0/24 \
    --region=$region
gcloud compute networks subnets create proxy-only-subnet \
    --purpose=REGIONAL_MANAGED_PROXY \
    --role=ACTIVE \
    --region=$region \
    --network=producer-net \
    --range=10.30.0.0/24
gcloud compute networks subnets create psc-subnet \
    --network=producer-net \
    --region=$region \
    --range=192.168.0.0/16 \
    --purpose=PRIVATE_SERVICE_CONNECT

Crea Cloud NAT e router Cloud per il VPC producer

Cloud NAT viene utilizzato per consentire alla VM di scaricare e installare le applicazioni.

gcloud compute routers create $region-cr \
   --network=producer-net \
   --region=$region
gcloud compute routers nats create $region-nat \
    --router=$region-cr \
    --region=$region \
    --nat-all-subnet-ip-ranges \
    --auto-allocate-nat-external-ips

Crea VPC consumer

Nel progetto, crea una rete VPC con la modalità subnet personalizzata. Esegui le seguenti operazioni in Cloud Shell:

gcloud compute networks create consumer-net \
    --subnet-mode=custom

Crea subnet nel VPC consumer

In Cloud Shell, esegui le seguenti operazioni per creare una subnet IPV4:

gcloud compute networks subnets create consumer-subnet \
    --network=consumer-net \
    --range=10.20.0.0/24 \
    --region=$region

Crea una policy del firewall globale per il VPC producer e il VPC consumer

Creerai una policy del firewall di rete globale e la assocerai al VPC producer e al VPC consumer.

gcloud compute network-firewall-policies create global-fw-policy \
--global
gcloud compute network-firewall-policies associations create \
    --firewall-policy=global-fw-policy \
    --name=producer-fw-policy \
    --network=producer-net \
    --global-firewall-policy 
gcloud compute network-firewall-policies associations create \
    --firewall-policy=global-fw-policy \
    --name=consumer-fw-policy \
    --network=consumer-net \
    --global-firewall-policy 

Consenti SSH

Per consentire a Identity-Aware Proxy (IAP) di connettersi alle tue istanze VM, crea una regola firewall che:

  • Si applichi a tutte le istanze VM a cui vuoi accedere tramite IAP.
  • Consenta il traffico in entrata dall'intervallo IP 35.235.240.0/20. Questo intervallo contiene tutti gli indirizzi IP che utilizzati da IAP per l'inoltro TCP.
gcloud compute network-firewall-policies rules create 100 \
    --action=ALLOW \
    --firewall-policy=global-fw-policy \
    --description="producer-allow-iap" \
    --direction=INGRESS \
    --src-ip-ranges=35.235.240.0/20 \
    --layer4-configs=tcp:22  \
    --global-firewall-policy

Aggiungi regole firewall in entrata al tuo servizio

Utilizzerai il bilanciatore del carico delle applicazioni interno regionale per pubblicare il servizio.La regola firewall in entrata deve consentire alla subnet solo proxy di accedere al servizio. Per informazioni dettagliate, consulta questo documento.

gcloud compute network-firewall-policies rules create 200 \
    --action=ALLOW \
    --firewall-policy=global-fw-policy \
    --description="producer-allow-access-service" \
    --direction=INGRESS \
    --src-ip-ranges=10.30.0.0/24 \
    --layer4-configs=tcp:80  \
    --global-firewall-policy

Consenti il controllo di integrità del bilanciatore del carico al tuo servizio

I probe di controllo di integrità del bilanciatore del carico delle applicazioni interno regionale utilizzano gli intervalli 35.191.0.0/16 e 130.211.0.0/22. Creerai una regola firewall in entrata per consentire i controlli di integrità dai probe. Per maggiori dettagli, consulta questo documento.

gcloud compute network-firewall-policies rules create 300 \
    --action=ALLOW \
    --firewall-policy=global-fw-policy \
    --description="producer-allow-health-check" \
    --direction=INGRESS \
    --src-ip-ranges=35.191.0.0/16,130.211.0.0/22\
    --layer4-configs=tcp:80  \
    --global-firewall-policy

Crea una VM come client HTTP nel VPC consumer

In Cloud Shell, esegui le seguenti operazioni per creare un'istanza VM come client di test:

gcloud compute instances create myclient \
    --zone=$zone \
    --subnet=consumer-subnet \
    --shielded-secure-boot \
    --no-address

Crea una VM come server HTTP nel VPC producer

In Cloud Shell, esegui le seguenti operazioni per creare un'istanza VM come server HTTP:

gcloud compute instances create myserver \
    --subnet=producer-subnet \
    --zone=$zone \
    --no-address \
    --shielded-secure-boot \
    --metadata startup-script='#! /bin/bash
    sudo apt-get update
    sudo apt-get install apache2 -y
    a2enmod ssl
    sudo a2ensite default-ssl
    echo "I am a Http Server." | \
    tee /var/www/html/index.html
    systemctl restart apache2'

5. Il producer pubblica il servizio PSC

Crea il bilanciatore del carico delle applicazioni interno regionale

Creerai un bilanciatore del carico delle applicazioni interno regionale come front-end del servizio e il backend è il gruppo di istanze non gestito il cui endpoint è il server HTTP che abbiamo creato in precedenza.

Prenota l'indirizzo IP del bilanciatore del carico

gcloud compute addresses create l7-ilb-ip-address \
    --region=$region \
    --subnet=producer-subnet

Crea un gruppo di istanze

Creerai un gruppo di istanze non gestito e aggiungerai l'istanza VM, myserver, al gruppo di istanze.

gcloud compute instance-groups unmanaged create my-service-ig \
    --zone=$zone
gcloud compute instance-groups unmanaged add-instances my-service-ig \
    --zone=$zone \
    --instances=myserver

Crea un controllo di integrità HTTP

gcloud compute health-checks create http l7-ilb-basic-check \
     --region=$region \
     --use-serving-port

Crea il servizio di backend

gcloud compute backend-services create l7-ilb-backend-service \
    --load-balancing-scheme=INTERNAL_MANAGED \
    --protocol=HTTP \
    --health-checks=l7-ilb-basic-check \
    --health-checks-region=$region \
    --region=$region

Aggiungi il backend al servizio di backend

gcloud compute backend-services add-backend l7-ilb-backend-service \
    --balancing-mode=UTILIZATION \
    --instance-group=my-service-ig \
    --instance-group-zone=$zone \
    --region=$region

Crea la mappa URL

gcloud compute url-maps create l7-ilb-map \
    --default-service=l7-ilb-backend-service \
    --region=$region

Crea il proxy di destinazione

gcloud compute target-http-proxies create l7-ilb-proxy \
    --url-map=l7-ilb-map \
    --url-map-region=$region \
    --region=$region

Crea la regola di forwarding

gcloud compute forwarding-rules create l7-ilb-forwarding-rule \
    --load-balancing-scheme=INTERNAL_MANAGED \
    --network=producer-net \
    --subnet=producer-subnet \
    --address=l7-ilb-ip-address \
    --ports=80 \
    --region=$region \
    --target-http-proxy=l7-ilb-proxy \
    --target-http-proxy-region=$region

Il producer PSC pubblica il servizio

Utilizzerai PSC per pubblicare il servizio con connection-preference=ACCEPT_MANUAL ed elenchi di consumer vuoti.

gcloud compute service-attachments create my-psc-service \
    --region=$region \
 --target-service=projects/$project_id/regions/$region/forwardingRules/l7-ilb-forwarding-rule \
    --connection-preference=ACCEPT_MANUAL \
    --nat-subnets=psc-subnet
export myserver_service_attachment=$(gcloud compute service-attachments describe my-psc-service --region=$region --format="value(selfLink.scope(v1))")

echo $myserver_service_attachment

6. Il consumer crea l'endpoint PSC

Prenota un IP per l'endpoint PSC

gcloud compute addresses create myserver-psc-endpoint-ip \
    --region=$region \
    --subnet=consumer-subnet \
    --ip-version=IPV4

Crea l'endpoint PSC

Crea l'endpoint PSC e recupera l'IP dell'endpoint PSC per i test nel passaggio successivo.

gcloud compute forwarding-rules create myserver-psc-endpoint \
    --region=$region \
    --network=consumer-net \
    --address=myserver-psc-endpoint-ip \
    --target-service-attachment=$myserver_service_attachment
psc_endpoint_ip=$(gcloud compute forwarding-rules describe myserver-psc-endpoint \
    --region=$region --format="value(IPAddress)")

echo $psc_endpoint_ip

Il consumer controlla lo stato dell'endpoint PSC

Prima che il producer aggiunga l'endpoint PSC all'elenco dei consumer, la connessione è visibile nell'endpoint connesso sul lato consumer con lo stato In attesa.

gcloud compute forwarding-rules describe myserver-psc-endpoint \
    --region=$region

Vedrai un risultato simile a quello riportato di seguito.

IPAddress: 10.20.0.3
allowPscGlobalAccess: false
creationTimestamp: '2026-02-23T16:27:27.920-08:00'
fingerprint: yh_UiYqjHCc=
id: '934193159895862912'
kind: compute#forwardingRule
labelFingerprint: 42WmSpB8rSM=
name: myserver-psc-endpoint
network: https://www.googleapis.com/compute/v1/projects/<project_id>/global/networks/consumer-net
networkTier: PREMIUM
pscConnectionId: '160443618817212419'
pscConnectionStatus: PENDING
region: https://www.googleapis.com/compute/v1/projects/<project_id>/regions/us-central1
selfLink: https://www.googleapis.com/compute/v1/projects/<project_id>/regions/us-central1/forwardingRules/myserver-psc-endpoint
selfLinkWithId: https://www.googleapis.com/compute/v1/projects/<project_id>/regions/us-central1/forwardingRules/934193159895862912
serviceDirectoryRegistrations:
- namespace: goog-psc-default
target: https://www.googleapis.com/compute/v1/projects/<project_id>/regions/us-central1/serviceAttachments/my-psc-service

7. Testa l'accesso dalla VM consumer alla VM producer

Controlla l'IP dell'endpoint PSC.

echo $psc_endpoint_ip

Accedi tramite SSH alla VM denominata myclient e verifica se può accedere a myserver sulla porta HTTP 80.

In Cloud Shell, esegui le seguenti operazioni:

gcloud compute ssh \
    --zone=$zone "myclient" \
    --tunnel-through-iap 

Utilizza curl per accedere all'endpoint PSC che hai creato.

curl -m 10 <psc_endpoint_ip> 

Verrà visualizzato il timeout del comando curl. Il client di test del VPC consumer non può accedere al server HTTP nel VPC producer.

curl: (28) Connection timed out after 10001 milliseconds

Torna a Cloud Shell uscendo dalla sessione SSH.

exit

8. Il producer approva l'endpoint PSC

Il producer controlla lo stato dell'endpoint PSC

Prima che il producer aggiunga l'endpoint PSC all'elenco dei consumer, la connessione è visibile nel collegamento del servizio con lo stato In attesa.

gcloud compute service-attachments describe my-psc-service --region=$region 

Vedrai un risultato simile a quello riportato di seguito.

connectedEndpoints:
- consumerNetwork: https://www.googleapis.com/compute/projects/<project_id>/global/networks/consumer-net
  endpoint: https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/forwardingRules/myserver-psc-endpoint
  endpointWithId: https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/forwardingRules/934193159895862912
  pscConnectionId: '160443618817212419'
  status: PENDING
connectionPreference: ACCEPT_MANUAL
creationTimestamp: '2026-02-23T13:27:33.886-08:00'
description: ''
enableProxyProtocol: false
fingerprint: -9EI8FCALrA=
id: '2578692595155826858'
kind: compute#serviceAttachment
name: my-psc-service
natSubnets:
- https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/subnetworks/psc-subnet
pscServiceAttachmentId:
  high: '149466704441770984'
  low: '2578692595155826858'
reconcileConnections: false
region: https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1
selfLink: https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/serviceAttachments/my-psc-service
targetService: https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/forwardingRules/l7-ilb-forwarding-rule

Recupera l'URI basato sull'ID dell'endpoint PSC

L'URI basato sull'ID dell'endpoint PSC è l'ID della regola di forwarding appena creata dal consumer. Nell'esempio precedente, "endpointWithId" è l'URI dell'endpoint PSC creato dal consumer. Avrai bisogno di questo URI per consentire al producer di creare il controllo dell'accesso basato su endpoint.

( Tieni presente che l'ID connessione PSC non è l'ID che stiamo cercando. )

export psc_endpoint_uri=$(gcloud compute service-attachments describe my-psc-service --region=$region --format="value(connectedEndpoints.endpointWithId)")

echo $psc_endpoint_uri

Aggiungi l'URI basato sull'ID dell'endpoint PSC all'elenco di accettazione del consumer

gcloud compute service-attachments update my-psc-service \
    --region=$region \
    --consumer-accept-list=$psc_endpoint_uri

Il producer controlla lo stato dell'endpoint PSC

gcloud compute service-attachments describe my-psc-service --region=$region --format="value(connectedEndpoints)"

Vedrai un risultato simile a quello riportato di seguito. Lo stato è cambiato in "ACCETTATO".

{'consumerNetwork': 'https://www.googleapis.com/compute/projects/<project_id>/global/networks/consumer-net', 'endpoint': 'https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/forwardingRules/myserver-psc-endpoint', 'endpointWithId': 'https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/forwardingRules/47564871796017232', 'pscConnectionId': '54547416268144643', 'status': 'ACCEPTED'}

9. Testa l'accesso dalla VM consumer alla VM producer

Controlla l'IP dell'endpoint PSC.

echo $psc_endpoint_ip

Accedi tramite SSH alla VM denominata myclient e verifica se può accedere a myserver sulla porta HTTP 80.

In Cloud Shell, esegui le seguenti operazioni:

gcloud compute ssh \
    --zone=$zone "myclient" \
    --tunnel-through-iap 

Utilizza curl per accedere all'endpoint PSC che hai creato.

curl <psc_endpoint_ip>

Vedrai che il comando curl restituisce correttamente la risposta da myserver. Il client di test del VPC consumer ha avuto accesso al server HTTP nel VPC producer.

I am a Http Server.

Torna a Cloud Shell uscendo dalla sessione SSH.

exit

10. Libera spazio

Libera spazio nelle VM

In Cloud Shell, esegui le seguenti operazioni:

gcloud compute instances delete myserver --zone $zone --quiet
gcloud compute instances delete myclient --zone $zone --quiet

Libera spazio nei componenti consumer PSC

gcloud compute forwarding-rules delete myserver-psc-endpoint \
    --region=$region --quiet
gcloud compute addresses delete myserver-psc-endpoint-ip \
    --region=$region --quiet

Liberare spazio nei componenti producer PSC

gcloud compute service-attachments delete my-psc-service \
    --region=$region --quiet
gcloud compute forwarding-rules delete l7-ilb-forwarding-rule \
    --region=$region --quiet
gcloud compute target-http-proxies delete l7-ilb-proxy \
    --region=$region --quiet
gcloud compute url-maps delete l7-ilb-map \
    --region=$region --quiet
gcloud compute backend-services remove-backend l7-ilb-backend-service \
    --instance-group=my-service-ig \
    --instance-group-zone=$zone \
    --region=$region --quiet
gcloud compute backend-services delete l7-ilb-backend-service \
    --region=$region --quiet
gcloud compute health-checks delete l7-ilb-basic-check \
     --region=$region --quiet
gcloud compute instance-groups unmanaged delete my-service-ig \
    --zone=$zone --quiet
gcloud compute addresses delete l7-ilb-ip-address \
    --region=$region --quiet

Liberare spazio per firewall, Cloud NAT, router Cloud e VPC

gcloud compute network-firewall-policies rules delete 100 \
    --firewall-policy=global-fw-policy \
    --global-firewall-policy --quiet
gcloud compute network-firewall-policies rules delete 200 \
    --firewall-policy=global-fw-policy \
    --global-firewall-policy --quiet
gcloud compute network-firewall-policies rules delete 300 \
    --firewall-policy=global-fw-policy \
    --global-firewall-policy --quiet
gcloud compute network-firewall-policies associations delete \
    --firewall-policy=global-fw-policy \
    --name=producer-fw-policy \
    --global-firewall-policy --quiet
gcloud compute network-firewall-policies associations delete \
    --firewall-policy=global-fw-policy \
    --name=consumer-fw-policy \
    --global-firewall-policy --quiet
gcloud compute network-firewall-policies delete global-fw-policy \
    --global --quiet
gcloud compute routers nats delete $region-nat \
    --router=$region-cr \
    --region=$region --quiet
gcloud compute routers delete $region-cr \
    --region=$region --quiet
gcloud compute networks subnets delete producer-subnet \
    --region=$region --quiet
gcloud compute networks subnets delete proxy-only-subnet \
    --region=$region --quiet
gcloud compute networks subnets delete psc-subnet \
    --region=$region --quiet
gcloud compute networks delete producer-net --quiet
gcloud compute networks subnets delete consumer-subnet \
    --region=$region --quiet
gcloud compute networks delete consumer-net --quiet

11. Complimenti

Hai testato correttamente il controllo dell'accesso basato su endpoint del producer di Private Service Connect.