Configura le impostazioni della rete

Le impostazioni di rete di Cloud Functions consentono di controllare il traffico in entrata e in uscita dalla rete da e verso le singole funzioni. Ad esempio, puoi utilizzare le impostazioni di rete per i seguenti casi d'uso:

  • Proteggi le tue funzioni implementando controllo dell'accesso basato sulla rete.
  • Fai in modo che il traffico in uscita di una funzione rispetti le regole firewall, DNS e di routing associate alla tua rete VPC.
  • Associa il traffico in uscita di una funzione a un indirizzo IP statico.

Per ulteriori dettagli sui casi d'uso, consulta la sezione Esempi di casi d'uso.

Impostazioni traffico in entrata

Le impostazioni in entrata controllano se le risorse esterne al progetto Google Cloud o al perimetro di servizio dei Controlli di servizio VPC possono richiamare una funzione.

Per essere soggetta al criterio del perimetro di Controlli di servizio VPC, una risorsa deve appartenere al servizio da limitare. Per Cloud Functions (1ª generazione.), il servizio limitato è l'API Cloud Functions. Per Cloud Functions (2nd gen), si tratta dell'API Cloud Run Admin.

Limitazioni

Cloud Functions (1ª generazione.): le funzioni attivate solo tramite HTTP possono essere richiamate solo da richieste HTTP create all'interno di una rete VPC, come quelle di Kubernetes Engine, Compute Engine, dall'ambiente flessibile di App Engine oppure da Cloud Scheduler, Cloud Tasks, Workflows o risorse BigQuery che si trovano nello stesso progetto o perimetro di Controlli di servizio VPC. Ciò significa che le richieste HTTP create da o instradate tramite Pub/Sub o Eventarc non possono attivare queste funzioni. I trigger di eventi sono sempre considerati "interni" e sono consentiti indipendentemente dall'impostazione del traffico in entrata.

Configura le impostazioni del traffico in entrata

Per limitare le risorse all'esterno del progetto o del perimetro, specifica uno dei seguenti valori di impostazione del traffico in entrata:

  • Consenti tutto il traffico: impostazione predefinita. Sono consentite tutte le richieste in entrata alla funzione da internet e da risorse all'interno dello stesso progetto.
  • Consenti solo traffico interno: è consentito solo il traffico da Cloud Scheduler, Cloud Tasks, Eventarc, monitor sintetici (inclusi i controlli di uptime), Workflows, BigQuery e reti VPC nello stesso progetto o Controlli di servizio VPC. Tutte le altre richieste vengono rifiutate con un errore 404.

    Per le richieste provenienti da un VPC condiviso, tieni presente le seguenti considerazioni:

    • Il traffico è considerato interno se è stato eseguito il deployment della funzione nel progetto host del VPC condiviso.
    • Il traffico è considerato interno se l'host del VPC condiviso e tutti i progetti di servizio si trovano all'interno dello stesso perimetro dei Controlli di servizio VPC.
    • Il traffico verso una funzione Cloud Functions (2nd gen) è considerato interno se la funzione è connessa alla stessa rete VPC condiviso.
    • Tutto il resto del traffico dalle reti VPC condiviso è negato.
  • Consenti traffico interno e traffico da Cloud Load Balancing: è consentito il traffico proveniente da Cloud Scheduler, Cloud Tasks, Eventarc, monitor sintetici (inclusi i controlli di uptime), Workflows, BigQuery e reti VPC nello stesso progetto o perimetro dei Controlli di servizio VPC. Il traffico da Cloud Load Balancing è consentito.

Puoi specificare le impostazioni di traffico in entrata quando esegui il deployment o l'aggiornamento della funzione utilizzando la console Google Cloud, Google Cloud CLI o Terraform:

Console

  1. Apri la pagina Panoramica di Functions nella console Google Cloud:

    Vai alla pagina Panoramica di Cloud Functions

  2. Fai clic su Crea funzione. In alternativa, fai clic su una funzione esistente per andare alla relativa pagina dei dettagli, poi fai clic su Modifica.

  3. Espandi le impostazioni avanzate facendo clic su Runtime, build ....

  4. Nella sezione Connessioni, seleziona un valore per le Impostazioni in entrata.

gcloud

Utilizza il comando gcloud functions deploy per eseguire il deployment della funzione o aggiornarla e specificare il flag --ingress-settings:

  gcloud functions deploy FUNCTION_NAME 
--trigger-http
--ingress-settings INGRESS_SETTINGS
FLAGS...

dove:

  • FUNCTION_NAME è il nome della funzione.
  • INGRESS_SETTINGS è uno dei valori supportati per le impostazioni in entrata. I valori possibili sono:

    • all
    • internal-only
    • internal-and-gclb: consente il traffico interno, nonché il traffico inviato a un IP pubblico esposto da Cloud Load Balancing. Blocca il traffico inviato a cloudfunctions.net o a qualsiasi dominio personalizzato configurato tramite Cloud Functions. Impedisce agli utenti di eludere i controlli dell'accesso (Cloud Armor, IAP) configurati tramite Cloud Load Balancing.
  • FLAGS... si riferisce ad altri flag che passi al comando deploy.

Terraform

Facoltativo. Per aggiornare il campo delle impostazioni di Ingress del file main.tf della risorsa Terraform, includi l'argomento ingress_settings di cui vuoi eseguire il deployment o l'aggiornamento. Se apporti modifiche alle impostazioni di traffico, la funzione viene ricreata.

  1. Dal file main.tf, individua la risorsa di cui vuoi limitare le impostazioni in entrata e aggiornala in base all'impostazione che preferisci, ad esempio:

    resource "google_cloudfunctions_function" "function" {
      name             = "function"
      location         = "us-central1"
      description      = "Sample function"
      ingress_settings = "INGRESS_SETTINGS"
    }
    

    dove INGRESS_SETTINGS è uno dei valori supportati per le impostazioni in entrata. I valori possibili sono:

    • ALLOW_ALL (predefinito): sono consentite tutte le richieste in entrata alla funzione sia da internet sia da risorse all'interno dello stesso progetto.
    • ALLOW_INTERNAL_ONLY: è consentito solo il traffico proveniente da reti Cloud Scheduler, Cloud Tasks, Eventarc, Workflows e VPC nello stesso progetto o nel perimetro dei Controlli di servizio VPC.
    • ALLOW_INTERNAL_AND_GCLB: consente il traffico interno, nonché il traffico inviato a un IP pubblico esposto da Cloud Load Balancing. Blocca il traffico inviato a cloudfunctions.net o a qualsiasi dominio personalizzato configurato tramite Cloud Functions. Impedisce agli utenti di eludere i controlli dell'accesso (Cloud Armor, IAP) che hanno configurato tramite Cloud Load Balancing.

Se utilizzi Google Cloud Armor con Cloud Load Balancing, puoi creare criteri di sicurezza che filtrano le condizioni basate sul traffico, ad esempio l'indirizzo IP, l'intervallo IP, il codice regione o le intestazioni della richiesta di una richiesta in entrata. Per ulteriori informazioni, consulta la panoramica dei criteri di sicurezza di Google Cloud Armor.

Impostazioni traffico in uscita

Le impostazioni in uscita controllano il routing delle richieste HTTP in uscita da una funzione. Per specificare le impostazioni in uscita, devi connettere la funzione a una rete VPC utilizzando un connettore di accesso VPC serverless. Le impostazioni in uscita controllano quando il traffico viene instradato attraverso il connettore nella rete VPC.

Limitazioni

  • L'accesso VPC serverless supporta solo il routing del traffico IPv4. Il traffico IPv6 non è supportato, anche se nella rete VPC sono presenti route IPv6.

  • Per maggiore sicurezza, Google Cloud blocca i pacchetti in uscita verso indirizzi IP esterni sulla porta 25 di destinazione TCP.

  • Le funzioni o i servizi utente che richiamano funzioni o servizi protetti da una rete VPC devono instradare le chiamate tramite un connettore VPC.

Configura le impostazioni del traffico in uscita

Per le impostazioni del traffico in uscita, puoi specificare quanto segue:

  • Instrada solo le richieste a IP privati tramite il connettore VPC: impostazione predefinita. Il traffico viene instradato attraverso la rete VPC solo se i pacchetti che lo trasportano hanno destinazioni corrispondenti a quanto segue:

    I pacchetti verso qualsiasi altra destinazione vengono instradati da Cloud Functions a internet e non tramite alcuna rete VPC.

  • Instrada tutto il traffico attraverso il connettore VPC: il traffico viene sempre instradato tramite la rete VPC associata al connettore, per tutte le destinazioni del pacchetto. Devi utilizzare questa opzione nelle seguenti circostanze:

    • Se devi inviare traffico a intervalli di subnet VPC con intervalli di indirizzi IP esterni utilizzati privatamente, Per ulteriori informazioni sugli intervalli di subnet VPC, consulta Intervalli IPv4 validi nella panoramica delle subnet.
    • Se devi inviare traffico a un endpoint Private Service Connect per le API di Google il cui indirizzo è un indirizzo IP esterno utilizzato privatamente. Per ulteriori informazioni sugli endpoint Private Service Connect per le API di Google, vedi Accedere alle API di Google tramite endpoint.
    • Se devi inviare traffico a qualsiasi altra destinazione di indirizzo IP esterno utilizzato privatamente e instradabile all'interno della rete VPC del connettore. Esempi di altre destinazioni che coprono indirizzi IP esterni utilizzati privatamente possono includere intervalli di subnet di peering, intervalli di subnet di peering creati da intervalli di indirizzi IP allocati per i servizi e destinazioni accessibili tramite route personalizzate nella rete VPC.

    Se la tua rete VPC include una route predefinita, i pacchetti possono comunque essere instradati a internet dopo l'elaborazione dal connettore se configuri un gateway Cloud NAT per fornire i servizi NAT alla subnet utilizzata dal connettore. Questi pacchetti sono soggetti alle route della rete VPC e alle regole firewall che si applicano alla rete VPC. Puoi utilizzare la configurazione di route e firewall per controllare il traffico in uscita da internet per tutte le richieste in uscita inviate dalla tua funzione tramite un connettore di accesso VPC serverless.

Puoi specificare le impostazioni del traffico in uscita quando esegui il deployment o l'aggiornamento della funzione utilizzando la console Google Cloud o Google Cloud CLI.

Console

  1. Apri la pagina Panoramica di Functions nella console Google Cloud:

    Vai alla pagina Panoramica di Cloud Functions

  2. Fai clic su Crea funzione. In alternativa, fai clic su una funzione esistente per andare alla relativa pagina dei dettagli, poi fai clic su Modifica.

  3. Espandi le impostazioni avanzate facendo clic su Runtime, build ....

  4. Nella sezione Connessioni, in Impostazioni in uscita, seleziona un connettore di accesso VPC serverless.

  5. Seleziona l'impostazione del traffico in uscita appropriata in base a come intendi instradare il traffico in uscita attraverso il connettore.

gcloud

Utilizza il comando gcloud functions deploy per eseguire il deployment della funzione o aggiornarla e specificare il flag --egress-settings:

  gcloud functions deploy FUNCTION_NAME 
--vpc-connector CONNECTOR_NAME
--egress-settings EGRESS_SETTINGS
FLAGS...

dove:

  • FUNCTION_NAME è il nome della funzione.
  • CONNECTOR_NAME è il nome del connettore di accesso VPC serverless da utilizzare. Per ulteriori informazioni, consulta la documentazione di gcloud.

  • EGRESS_SETTINGS è uno dei valori supportati per le impostazioni del traffico in uscita: consulta la documentazione di gcloud.

  • FLAGS... si riferisce ad altri flag che passi al comando deploy.

Esempi di casi d'uso

I seguenti esempi mostrano come configurare l'accesso alla rete in diversi scenari comuni.

Creazione di una funzione che non può essere chiamata da clienti esterni

Puoi proteggere le funzioni HTTP consentendole di chiamarle solo dalle risorse nello stesso progetto Google Cloud o perimetro di servizio Controlli di servizio VPC.

  1. Esegui il deployment della funzione e consenti solo il traffico interno. Utilizza la console Google Cloud o Google Cloud CLI:

    Console

    1. Apri la pagina Panoramica di Functions nella console Google Cloud:

      Vai alla pagina Panoramica di Cloud Functions

    2. Fai clic su Crea funzione. In alternativa, fai clic su una funzione esistente per andare alla relativa pagina dei dettagli, poi fai clic su Modifica.

    3. Espandi le impostazioni avanzate facendo clic su Runtime, build ....

    4. Nella sezione Connessioni, in Impostazioni in entrata, seleziona Consenti solo traffico interno.

    gcloud

    Usa il comando gcloud functions deploy:

    gcloud functions deploy FUNCTION_NAME \
    --ingress-settings internal-only \
    FLAGS...
    

Dopo il deployment della funzione, le richieste provenienti dall'esterno del progetto Google Cloud non possono raggiungere la funzione. Se utilizzi Controlli di servizio VPC, le richieste provenienti dall'esterno del perimetro di servizio vengono bloccate. Le istanze VM all'interno del progetto o del perimetro di servizio possono comunque raggiungere la tua funzione inviando richieste al relativo endpoint HTTPS.

Se vuoi chiamare questa funzione limitata da un'altra funzione, la funzione di chiamata deve instradare il traffico in uscita attraverso la rete VPC.

Utilizzo delle impostazioni del traffico in entrata e in uscita per limitare l'accesso

Puoi incorporare sia il traffico in entrata che in uscita nei tuoi servizi per aggiungere un ulteriore livello di restrizione.

  1. Clona il repository cloud-run-sample e passa alla directory vpc-sample:

    git clone https://github.com/GoogleCloudPlatform/cloud-run-samples
    cd vpc-sample
    

  2. Installa le dipendenze Python:

    pip3 install -r requirements.txt
    

  3. Puoi aprire il file main.py nella directory vpc-sample per vedere la funzione di cui stai eseguendo il deployment:

    def hello_world(request):
        return "Hello World!"

  4. Esegui il deployment della funzione:

    gcloud functions deploy restricted-function 
    --runtime=python38
    --trigger-http
    --no-allow-unauthenticated
    --ingress-settings=internal-only
    --entry-point=hello_world

  5. Configura un connettore di accesso VPC serverless:

    gcloud compute networks vpc-access connectors create serverless-connector 
    --region=SERVICE_REGION
    --range=10.8.0.0/28

    dove SERVICE_REGION è una regione per il connettore; deve corrispondere alla regione del servizio serverless. Se il servizio si trova nella regione us-central o europe-west, utilizza us-central1 o europe-west1.

  6. Crea la tua immagine container:

    gcloud builds submit --tag=gcr.io/PROJECT_ID/restricted-function-caller .
    

    dove PROJECT_ID è l'ID progetto.

    Questa operazione crea un'immagine container che richiama get_hello_world quando viene eseguito il deployment dal file main.py:

    import os
    import urllib
    
    import google.auth.transport.requests
    import google.oauth2.id_token
    
    
    def get_hello_world(request):
        try:
            url = os.environ.get("URL")
            req = urllib.request.Request(url)
    
            auth_req = google.auth.transport.requests.Request()
            id_token = google.oauth2.id_token.fetch_id_token(auth_req, url)
            req.add_header("Authorization", f"Bearer {id_token}")
    
            response = urllib.request.urlopen(req)
            return response.read()
    
        except Exception as e:
            print(e)
            return str(e)

  7. Utilizza il comando gcloud run deploy run-function per eseguire il deployment del container Cloud Run:

      gcloud run deploy run-function 
    --image gcr.io/PROJECT_ID/restricted-function-caller
    --no-allow-unauthenticated
    --update-env-vars=URL=https://SERVICE_REGION-PROJECT_ID.cloudfunctions.net/restricted-function-caller
    --vpc-egress=all
    --vpc-connector=serverless-connector
    --region=SERVICE_REGION

    dove:

    • PROJECT_ID è l'ID progetto.
    • SERVICE_REGION è una regione per il connettore, che deve corrispondere alla regione del servizio serverless. Se il servizio si trova nella regione us-central o europe-west, utilizza us-central1 o europe-west1.

    Il servizio run-function di Cloud Run è ora impostato per inviare una richiesta GET dal connettore VPC alla funzione con limitazioni di rete.

Funzione di routing in uscita attraverso la rete VPC

Le reti VPC in Google Cloud supportano un ricco set di configurazioni e funzionalità di networking. Instradando il traffico in uscita dalla funzione alla rete VPC, puoi assicurarti che il traffico in uscita di Cloud Functions segua le regole del firewall, del DNS, del routing e di altre regole della tua rete VPC. Puoi inoltre utilizzare prodotti come Cloud NAT.

  1. Configura una rete VPC. Configura una rete VPC esistente o creane una nuova seguendo la guida in Utilizzo delle reti VPC.

  2. Configura un connettore di accesso VPC serverless. Per instradare il traffico alla rete VPC, Cloud Functions ha bisogno di un connettore di accesso VPC serverless. Crea un connettore e configura le autorizzazioni appropriate seguendo le istruzioni riportate in Connessione a una rete VPC.

  3. Esegui il deployment di una funzione che utilizza il connettore e instrada tutto il traffico in uscita attraverso il connettore. Utilizza la console Google Cloud o lo strumento a riga di comando gcloud:

    Console

    1. Apri la pagina Panoramica di Functions nella console Google Cloud:

      Vai alla pagina Panoramica di Cloud Functions

    2. Fai clic su Crea funzione. In alternativa, fai clic su una funzione esistente per andare alla relativa pagina dei dettagli, poi fai clic su Modifica.

    3. Espandi le impostazioni avanzate facendo clic su Runtime, build ....

    4. Nella sezione Connessioni, in Impostazioni in uscita, seleziona il connettore di accesso VPC serverless e seleziona Instrada tutto il traffico attraverso il connettore VPC.

    gcloud

    Usa il comando gcloud functions deploy:

    gcloud functions deploy FUNCTION_NAME \
    --vpc-connector CONNECTOR_NAME \
    --egress-settings all \
    FLAGS...
    

Dopo aver eseguito il deployment della funzione, tutto il traffico proveniente dalla funzione viene instradato tramite la rete VPC e ottempera alle regole impostate sulla rete VPC. Tieni presente che la tua funzione non può accedere alla rete internet pubblica a meno che non configuri Cloud NAT. Tieni inoltre presente che Cloud NAT deve mappare tutti gli intervalli IP primari e secondari di tutte le subnet al gateway NAT, in modo da includere la subnet del connettore nella mappatura.

Associazione del traffico in uscita dalla funzione a un indirizzo IP statico

In alcuni casi, potresti volere che il traffico proveniente dalla tua funzione venga associato a un indirizzo IP statico. Ad esempio, ciò è utile se chiami un servizio esterno che consente solo le richieste provenienti da indirizzi IP specificati esplicitamente.

  1. Instrada il traffico in uscita della funzione attraverso la rete VPC. Consulta la sezione precedente, Funzione di routing in uscita attraverso la rete VPC.

  2. Configura Cloud NAT e specifica un indirizzo IP statico. Segui le guide riportate in Specificare gli intervalli di subnet per NAT e Specificare gli indirizzi IP per NAT per configurare Cloud NAT per la subnet associata al connettore di accesso VPC serverless della funzione. Cloud NAT deve mappare tutti gli intervalli IP principali e secondari di tutte le subnet al gateway NAT per includere la subnet del connettore nella mappatura.

Bilanciamento del carico tra più regioni

Puoi eseguire il deployment di una funzione in diverse regioni e consentire l'invio della richiesta alla regione integro più vicino. A questo scopo, devi configurare un gruppo di endpoint di rete (NEG) serverless per la funzione e connetterlo a un bilanciatore del carico, come descritto in Configurazione di un bilanciatore del carico HTTP(S) con NEG serverless.