Control de acceso basado en extremos del productor de PSC

1. Introducción

Private Service Connect

Private Service Connect es una función de las redes de Google Cloud que permite a los consumidores acceder a los servicios administrados de forma privada desde su red de VPC. Del mismo modo, permite a los productores de servicios administrados alojar estos servicios en sus propias redes de VPC independientes y ofrecer una conexión privada a sus consumidores.

50b907b09af4d8ac.png

Control de acceso del productor de Private Service Connect

En lugar de aceptar automáticamente todas las conexiones de cualquier consumidor, los productores solo pueden aceptar solicitudes de conexión entrantes si el consumidor está en la lista de aceptación del consumidor. Puedes especificar consumidores por proyecto, red de VPC o extremo de PSC individual. No puedes incluir diferentes tipos de consumidores en la misma lista de aceptación o rechazo del consumidor.

Para cualquier preferencia de conexión, una política de la organización (compute.restrictPrivateServiceConnectConsumer) que bloquea las conexiones entrantes puede anular y rechazar las conexiones aceptadas.

Ten en cuenta que la política de la organización (compute.restrictPrivateServiceConnectConsumer) se aplica a la organización,la carpeta o el proyecto. Si deseas un control de acceso detallado al extremo de PSC, puedes usar la lista de aceptación del consumidor de extremos de PSC individuales.

Control de acceso basado en extremos

El control de acceso basado en extremos de PSC es la capacidad de un productor para autorizar a los consumidores a través de extremos de PSC individuales en las políticas de adjuntos de servicio.

Este enfoque, que se recomienda para los servicios de múltiples usuarios, proporciona el control más detallado para administrar las conexiones.

Este codelab se centra en aprender a configurar esta función.

Ten en cuenta que este método no se aplica a los backends de Private Service Connect.

2. Qué aprenderás

  • Como productor, cómo publicar un servicio con PSC
  • Como productor, cómo crear un control de acceso basado en extremos de PSC
  • Como consumidor, cómo acceder al servicio de PSC

3. Arquitectura general del lab

3d7cbafaffb50d2d.png

4. Pasos de preparación

Roles de IAM necesarios para trabajar en el lab

Comienza por asignar los roles de IAM necesarios a la cuenta de GCP a nivel del proyecto.

  • Administrador de redes de Compute (roles/compute.networkAdmin): Este rol te otorga control total de los recursos de redes de Compute Engine.
  • Administrador de Logging (roles/logging.admin): Este rol te otorga acceso a todos los permisos de Logging y a los permisos dependientes.
  • Administrador de Service Usage (roles/serviceusage.serviceUsageAdmin): Este rol te permite inspeccionar, habilitar y también inhabilitar estados de servicio, inspeccionar operaciones junto con cuotas de consumo y facturación para un proyecto de consumidor.
  • Administrador de instancias de Compute (roles/compute.instanceAdmin.v1): Este rol te otorga control total de instancias, grupos de instancias, discos, instantáneas y, también, imágenes de Compute Engine. Acceso de lectura a todos los recursos de red de Compute Engine.
  • Administrador de seguridad de Compute (roles/compute.securityAdmin): Este rol te otorga permisos para crear, modificar y borrar reglas de firewall y certificados SSL, y también para configurar parámetros de configuración de VMs protegidas.

Habilita las APIs

En Cloud Shell, asegúrate de que tu proyecto esté configurado correctamente y establece las variables de entorno.

En Cloud Shell, haz lo siguiente:

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

Habilita todas las APIs de Google necesarias en el proyecto. En Cloud Shell, haz lo siguiente:

gcloud services enable \
  compute.googleapis.com 
  

Crea una VPC de productor

En el proyecto, crea una red de VPC con modo de subred personalizado. Realiza lo siguiente en Cloud Shell:

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

Crea subredes en la VPC de productor

Necesitarás tres subredes: producer-subnet para tu servicio, proxy-only-subnet para que el balanceador de cargas publique tu servicio y psc-subnet para que PSC publique el servicio.

En Cloud Shell, haz lo siguiente para crear subredes 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 y Cloud Router para la VPC de productor

Cloud NAT se usa para permitir que la VM descargue e instale aplicaciones.

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 una VPC de consumidor

En el proyecto, crea una red de VPC con modo de subred personalizado. Realiza lo siguiente en Cloud Shell:

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

Crea una subred en la VPC de consumidor

En Cloud Shell, haz lo siguiente para crear una subred IPV4:

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

Crea una política de firewall global para la VPC de productor y la VPC de consumidor

Crearás una política de firewall de red global y la asociarás a la VPC de productor y a la VPC de consumidor.

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 

Permite SSH

Para permitir que Identity-Aware Proxy (IAP) se conecte a tus instancias de VM, crea una regla de firewall que cumpla con lo siguiente:

  • Se aplica a todas las instancias de VM a las que deseas acceder mediante IAP.
  • Permite el tráfico de entrada desde el rango de IP 35.235.240.0/20. Este rango contiene todas las direcciones IP que IAP usa para el reenvío de 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

Agrega reglas de firewall de entrada a tu servicio

Usarás el balanceador de cargas de aplicaciones interno regional para publicar el servicio.La regla de firewall de entrada debe permitir que la subred de solo proxy acceda al servicio. Para obtener información detallada, consulta este 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

Permite la verificación de estado del balanceador de cargas a tu servicio

Los sondeos de verificación de estado del balanceador de cargas de aplicaciones interno regional usan los rangos de 35.191.0.0/16 y 130.211.0.0/22. Crearás una regla de firewall de entrada para permitir las verificaciones de estado de los sondeos. Para obtener más detalles, consulta este 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 como cliente HTTP en la VPC de consumidor

En Cloud Shell, haz lo siguiente para crear una instancia de VM como cliente de prueba:

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

Crea una VM como servidor HTTP en la VPC de productor

En Cloud Shell, haz lo siguiente para crear una instancia de VM como servidor 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. El productor publica el servicio de PSC

Crea un balanceador de cargas de aplicaciones interno regional

Crearás un balanceador de cargas de aplicaciones interno regional como el frontend del servicio, y el backend es el grupo de instancias no administrado cuyo extremo es el servidor HTTP que creamos anteriormente.

Reserva la dirección IP del balanceador de cargas

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

Crea un grupo de instancias

Crearás un grupo de instancias no administrado y agregarás la instancia de VM, myserver, al grupo de instancias.

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 una verificación de estado HTTP

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

Crea el servicio de 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

Agrega un backend al servicio de 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 el mapa de URL

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

Crea el proxy de destino

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

Crea la regla de reenvío

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

El productor de PSC publica el servicio

Usarás PSC para publicar el servicio con connection-preference=ACCEPT_MANUAL y listas de consumidores vacías.

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. El consumidor crea el extremo de PSC

Reserva una IP para el extremo de PSC

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

Crea un extremo de PSC

Crea un extremo de PSC y obtén la IP del extremo de PSC para realizar pruebas en el siguiente paso.

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

El consumidor verifica el estado del extremo de PSC

Antes de que el productor agregue el extremo de PSC a la lista de consumidores, la conexión es visible en el extremo conectado en el lado del consumidor con el estado Pendiente.

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

Verás un resultado similar al siguiente:

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. Prueba el acceso de la VM de consumidor a la VM de productor

Verifica la IP del extremo de PSC.

echo $psc_endpoint_ip

Establece una conexión SSH con la VM llamada myclient y prueba si puede acceder a myserver en el puerto HTTP 80.

En Cloud Shell, haz lo siguiente:

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

Usa curl para acceder al extremo de PSC que creaste.

curl -m 10 <psc_endpoint_ip> 

Verás que se agotó el tiempo de espera del comando curl. El cliente de prueba de la VPC de consumidor no puede acceder al servidor HTTP en la VPC de productor.

curl: (28) Connection timed out after 10001 milliseconds

Para regresar a Cloud Shell, sal de la sesión de SSH.

exit

8. El productor aprueba el extremo de PSC

El productor verifica el estado del extremo de PSC

Antes de que el productor agregue el extremo de PSC a la lista de consumidores, la conexión es visible en el adjunto de servicio con el estado Pendiente.

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

Verás un resultado similar al siguiente:

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

Obtén el URI basado en el ID del extremo de PSC

El URI basado en el ID del extremo de PSC es el ID de la regla de reenvío que acaba de crear el consumidor. En el ejemplo anterior, “endpointWithId” es el URI del extremo de PSC creado por el consumidor. Necesitarás este URI para que el productor cree un control de acceso basado en extremos.

( Ten en cuenta que el ID de conexión de PSC no es el ID que estamos buscando. )

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

echo $psc_endpoint_uri

Agrega el URI basado en el ID del extremo de PSC a la lista de aceptación del consumidor

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

El productor verifica el estado del extremo de PSC

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

Verás un resultado similar al siguiente: El estado cambió a “ACCEPTED”.

{'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. Prueba el acceso de la VM de consumidor a la VM de productor

Verifica la IP del extremo de PSC.

echo $psc_endpoint_ip

Establece una conexión SSH con la VM llamada myclient y prueba si puede acceder a myserver en el puerto HTTP 80.

En Cloud Shell, haz lo siguiente:

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

Usa curl para acceder al extremo de PSC que creaste.

curl <psc_endpoint_ip>

Verás que el comando curl muestra correctamente la respuesta de myserver. El cliente de prueba de la VPC de consumidor accedió al servidor HTTP en la VPC de productor.

I am a Http Server.

Para regresar a Cloud Shell, sal de la sesión de SSH.

exit

10. Limpia

Limpia las VMs

En Cloud Shell, haz lo siguiente:

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

Limpia los componentes de consumidor de PSC

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

Limpia los componentes de productor de 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

Limpia el firewall, Cloud NAT, Cloud Router y las VPCs

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. Felicitaciones

Probaste correctamente el control de acceso basado en extremos de productor de Private Service Connect.