Configura TLS reciprocamente con una CA privata

Questa pagina fornisce istruzioni per la creazione di un certificato privato l'autorità di certificazione (CA) utilizzando Certificate Authority Service e caricando il tuo certificati a una risorsa TrustConfig del Gestore certificati.

Creerai anche le risorse di sicurezza di rete necessarie configurazione di TLS reciproco per i bilanciatori del carico delle applicazioni.

Prima di iniziare

  • Consulta la panoramica di Mutual TLS.
  • Installa Google Cloud CLI. Per una panoramica completa dello strumento, consulta la panoramica dell'interfaccia a riga di comando gcloud. Puoi trovare i comandi relativi al bilanciamento del carico nel riferimento all'API e all'interfaccia a riga di comando gcloud.

    Se non hai mai eseguito l'interfaccia a riga di comando gcloud, esegui prima gcloud init per autenticarti.

  • Assicurati di sapere come crea pool di CA.

  • Se utilizzi un bilanciatore del carico delle applicazioni esterno globale o un bilanciatore del carico delle applicazioni classico, assicurati di aver configurato un bilanciatore del carico con uno dei seguenti backend supportati:

    • Backend di gruppi di istanze VM
    • Bucket Cloud Storage (supportato solo se al bilanciatore del carico è collegato anche almeno un servizio di backend, oltre al bucket di backend)
    • Funzioni di Cloud Run, App Engine o Cloud Run
    • Connettività ibrida
  • Se utilizzi un bilanciatore del carico delle applicazioni esterno regionale, un bilanciatore del carico delle applicazioni interno tra regioni, o un bilanciatore del carico delle applicazioni interno regionale, assicurati di aver configurato un bilanciatore del carico con dei seguenti backend supportati:

    • Backend di gruppi di istanze VM
    • Cloud Run
    • Connettività ibrida

Autorizzazioni

Per ottenere le autorizzazioni necessarie per completare questa guida, chiedi all'amministratore di concederti seguenti ruoli IAM sul progetto:

  • Per creare risorse di bilanciatori del carico come TargetHTTPProxy: Amministratore bilanciatore del carico Compute (roles/compute.loadBalancerAdmin)
  • Per utilizzare le risorse di Gestore certificati: Proprietario di Gestore certificati (roles/certificatemanager.owner)
  • Per creare componenti di sicurezza e di rete: Compute Network Admin (roles/compute.networkAdmin) e Compute Security Admin (roles/compute.securityAdmin)
  • Per creare un progetto (facoltativo): Autore progetto (roles/resourcemanager.projectCreator)

Per saperne di più sulla concessione dei ruoli, consulta Gestire l'accesso a progetti, cartelle e organizzazioni.

Potresti anche riuscire a ottenere le autorizzazioni richieste tramite la ruoli o altri ruoli predefiniti ruoli.

Crea una CA privata

Crea una CA privata utilizzando il servizio CA, quindi crea un certificato radice:

  1. Per creare un pool di CA, utilizza il comando gcloud privateca pools create:

    gcloud privateca pools create CA_POOL \
       --location=us-central1
    

    Sostituisci CA_POOL con l'ID o il nome del pool di CA principale.

  2. Per creare una CA privata nel pool di CA, utilizza il metodo Comando gcloud privateca roots create:

    gcloud privateca roots create CA_ROOT \
       --pool=CA_POOL \
       --subject="CN=my-ca, O=Test LLC" \
       --location=us-central1
    

    Sostituisci quanto segue:

    • CA_ROOT: l'ID o il nome della CA privata
    • CA_POOL: l'ID o il nome del pool di CA principale
  3. Per descrivere la nuova CA e creare il file root.cert, utilizza il comando gcloud privateca roots describe:

    gcloud privateca roots describe CA_ROOT \
       --pool=CA_POOL \
       --location=us-central1 \
       --format='value(pemCaCertificates)' > root.cert
    
    export ROOT=$(cat root.cert | sed 's/^[ ]*//g' | tr '\n' $ | sed 's/\$/\\n/g')

    Sostituisci quanto segue:

    • CA_ROOT: l'ID o il nome della CA privata
    • CA_POOL: l'ID o il nome del pool di CA principale

    Per ulteriori informazioni, consulta le seguenti risorse:

Crea TrustConfig con CA privata

Crea una risorsa TrustConfig Gestore certificati che rappresenti la tua PKI utilizzando il certificato radice generato utilizzando la CA privata. Partiamo dal presupposto che la risorsa TrustConfig sia un semplice archivio di attendibilità con un singolo trust anchor che rappresenta una radice certificato.

Nei seguenti passaggi, sostituisci TRUST_CONFIG_NAME con il nome della risorsa TrustConfig.

  • Per creare il file trust_config.yaml, utilizza il seguente comando:

    cat << EOF > trust_config.yaml
    name: TRUST_CONFIG_NAME
    trustStores:
    - trustAnchors:
       - pemCertificate: "${ROOT?}"
    EOF
    
  • Per creare le risorseTrustConfig di Certificate Manager, utilizza il comandogcloud certificate-manager trust-configs import:

    gcloud certificate-manager trust-configs import TRUST_CONFIG_NAME  \
       --source=trust_config.yaml \
       --location=REGION
    

    Sostituisci quanto segue:

    REGION: utilizza global per il bilanciatore del carico delle applicazioni interno tra regioni, il bilanciatore del carico delle applicazioni esterno globale o il bilanciatore del carico delle applicazioni classico. Per il bilanciatore del carico delle applicazioni esterno regionale o il bilanciatore del carico delle applicazioni interno regionale, utilizza la regione in cui hai configurato il bilanciatore del carico.

Creare le risorse di autenticazione client

Una risorsa di autenticazione client (chiamata anche ServerTLSPolicy) consente di specificare la modalità TLS lato server e la risorsa TrustConfig da utilizzare per convalidare i certificati client. Se il client presenta un certificato non valido o non ha nessun certificato per il bilanciatore del carico, il clientValidationMode specifica come viene gestita la connessione del client. Per ulteriori informazioni, consulta Modalità di convalida del client MTLS.

  • Quando clientValidationMode è impostato su ALLOW_INVALID_OR_MISSING_CLIENT_CERT, tutte le richieste vengono passate al backend anche se la convalida non va a buon fine o se manca il certificato client.
  • Quando clientValidationMode è impostato su REJECT_INVALID, al backend vengono trasmesse solo le richieste che forniscono un certificato client che può essere convalidato in base a una risorsa TrustConfig.

Per creare la risorsa ServerTLSPolicy, completa i seguenti passaggi:

  1. In base a come vuoi gestire la connessione, seleziona una delle seguenti opzioni.

    Nei passaggi che seguono, sostituisci SERVER_TLS_POLICY_NAME con il nome del criterio TLS del server e PROJECT_ID con l'ID del tuo progetto Google Cloud.

    • Opzione 1: clientValidationMode è impostata su ALLOW_INVALID_OR_MISSING_CLIENT_CERT.

      Per creare il file server_tls_policy.yaml, utilizza il seguente comando:

      globale

      Per i bilanciatori del carico delle applicazioni esterni e i bilanciatori del carico delle applicazioni interni tra regioni, utilizza il comando:

      cat << EOF > server_tls_policy.yaml
      name: SERVER_TLS_POLICY_NAME
      mtlsPolicy:
        clientValidationMode: ALLOW_INVALID_OR_MISSING_CLIENT_CERT
        clientValidationTrustConfig: projects/PROJECT_ID/locations/global/trustConfigs/TRUST_CONFIG_NAME
      EOF
      

      regionale

      Per i bilanciatori del carico delle applicazioni esterni regionali e i bilanciatori del carico delle applicazioni interni regionali, utilizza il comando:

      cat << EOF > server_tls_policy.yaml
      name: SERVER_TLS_POLICY_NAME
      mtlsPolicy:
        clientValidationMode: ALLOW_INVALID_OR_MISSING_CLIENT_CERT
        clientValidationTrustConfig: projects/PROJECT_ID/locations/REGION/trustConfigs/TRUST_CONFIG_NAME
      EOF
      
    • Opzione 2: clientValidationMode è impostata su REJECT_INVALID.

      Per creare il file server_tls_policy.yaml, utilizza il seguente comando:

      globale

      Per i bilanciatori del carico delle applicazioni esterni e i bilanciatori del carico delle applicazioni interni tra regioni, utilizza il comando:

      cat << EOF > server_tls_policy.yaml
      name: SERVER_TLS_POLICY_NAME
      mtlsPolicy:
        clientValidationMode: REJECT_INVALID
        clientValidationTrustConfig: projects/PROJECT_ID/locations/global/trustConfigs/TRUST_CONFIG_NAME
      EOF
      

      regionale

      Per i bilanciatori del carico delle applicazioni esterni e interni regionali, utilizza il comando:

      cat << EOF > server_tls_policy.yaml
      name: SERVER_TLS_POLICY_NAME
      mtlsPolicy:
        clientValidationMode: REJECT_INVALID
        clientValidationTrustConfig: projects/PROJECT_ID/locations/REGION/trustConfigs/TRUST_CONFIG_NAME
      EOF
      
  2. Per creare la risorsa ServerTlsPolicy, utilizza il comando gcloud network-security server-tls-policies import:

    globale

    Per i bilanciatori del carico delle applicazioni esterni e i bilanciatori del carico delle applicazioni interni tra regioni, utilizza il comando:

    gcloud network-security server-tls-policies import SERVER_TLS_POLICY_NAME \
      --source=server_tls_policy.yaml \
      --location=global
    

    regionale

    Per i bilanciatori del carico delle applicazioni esterni regionali e i bilanciatori del carico delle applicazioni interni regionali, utilizza il comando:

    gcloud network-security server-tls-policies import SERVER_TLS_POLICY_NAME \
      --source=server_tls_policy.yaml \
      --location=REGION
    
  3. (Facoltativo) Elenca tutte le risorse di autenticazione client (ServerTlsPolicies) nella posizione specificata del progetto corrente.

    Console

    1. Nella console Google Cloud, vai alla pagina Autenticazione client.

      Vai a Autenticazione client

    2. Vengono visualizzate tutte le risorse ServerTlsPolicies.

    gcloud

    Per visualizzare un elenco di tutte le (ServerTlsPolicies), utilizza Comando gcloud network-security server-tls-policies list:

    gcloud network-security server-tls-policies list \
      --location=REGION
    

    Sostituisci quanto segue:

    REGION: utilizzaglobal per il bilanciatore del carico delle applicazioni interno tra regioni, il bilanciatore del carico delle applicazioni esterno globale o il bilanciatore del carico delle applicazioni classico. Per il bilanciatore del carico delle applicazioni esterno regionale o il bilanciatore del carico delle applicazioni interno regionale, utilizza la regione in cui hai configurato il bilanciatore del carico.

Configura mTLS per il bilanciatore del carico

Affinché autenticazione TLS reciproca (mTLS) funzioni, dopo aver configurato un bilanciatore del carico, devi aggiornare il proxy HTTPS di destinazione utilizzando ServerTLSPolicy risorsa.

  1. Assicurati di aver già creato l'autenticazione client (ServerTLSPolicy) risorsa. Per istruzioni, vedi Crea le risorse di autenticazione client.

  2. Per elencare tutti i proxy HTTPS di destinazione nel progetto, utilizza la classe Comando gcloud compute target-https-proxies list:

    gcloud compute target-https-proxies list
    

    Prendi nota del nome del proxy HTTPS di destinazione a cui collegare la risorsa ServerTLSPolicy. Questo nome è denominato TARGET_HTTPS_PROXY_NAME nei passaggi seguenti.

  3. Per esportare la configurazione di un proxy HTTPS di destinazione in un file, utilizza gcloud compute target-https-proxies export.

    globale

      gcloud compute target-https-proxies export TARGET_HTTPS_PROXY_NAME \
          --destination=TARGET_PROXY_FILENAME \
          --global
      

    Sostituisci quanto segue:

    • TARGET_HTTPS_PROXY_NAME: il nome del target proxy.
    • TARGET_PROXY_FILENAME: il nome di un file YAML. Ad esempio, mtls_target_proxy.yaml.

    regionale

     gcloud compute target-https-proxies export TARGET_HTTPS_PROXY_NAME \
         --destination=TARGET_PROXY_FILENAME \
         --region=REGION
     

    Sostituisci quanto segue:

    • TARGET_HTTPS_PROXY_NAME: il nome del target proxy.
    • TARGET_PROXY_FILENAME: il nome di un file yaml. Ad esempio, mtls_target_proxy.yaml
    • REGION: la regione in cui hai configurato con il bilanciatore del carico di rete passthrough esterno regionale.
  4. Elenca tutte le risorse ServerTlsPolicies nella posizione specificata del progetto corrente.

    Console

    1. Nella console Google Cloud, vai alla pagina Autenticazione client.

      Vai ad Autenticazione client

    2. Sono visualizzate tutte le ServerTlsPolicies risorse.

    gcloud

    Per elencare tutte le risorse di autenticazione client (ServerTlsPolicies), utilizza il comando gcloud network-security server-tls-policies list:

    gcloud network-security server-tls-policies list \
      --location=REGION
    

    Sostituisci quanto segue:

    REGION: usa global per il bilanciatore del carico delle applicazioni interno tra regioni, il bilanciatore del carico delle applicazioni esterno globale o il bilanciatore del carico delle applicazioni classico. Per il bilanciatore del carico delle applicazioni esterno regionale o il bilanciatore del carico delle applicazioni interno regionale, utilizza la regione in cui hai configurato il bilanciatore del carico.

    Prendi nota del nome della risorsa ServerTlsPolicies per configurare mTLS. Questo nome viene chiamato SERVER_TLS_POLICY_NAME nel passaggio successivo.

  5. Per aggiungere il file di risorse ServerTlsPolicy TARGET_PROXY_FILENAME, usa questo comando. Sostituisci PROJECT_ID con l'ID del tuo progetto Google Cloud.

    echo "serverTlsPolicy: //networksecurity.googleapis.com/projects/PROJECT_ID/locations/REGION/serverTlsPolicies/SERVER_TLS_POLICY_NAME" >> TARGET_PROXY_FILENAME
  6. Per importare la configurazione di un proxy HTTPS di destinazione da un file, utilizza il comando gcloud compute target-https-proxies import.

    globale

       gcloud compute target-https-proxies import TARGET_HTTPS_PROXY_NAME \
           --source=TARGET_PROXY_FILENAME \
           --global
       

    Sostituisci quanto segue:

    • TARGET_HTTPS_PROXY_NAME: il nome del target proxy.
    • TARGET_PROXY_FILENAME: il nome di un file YAML. Ad esempio, mtls_target_proxy.yaml.

    regionale

       gcloud compute target-https-proxies import TARGET_HTTPS_PROXY_NAME \
           --source=TARGET_PROXY_FILENAME \
           --region=REGION
       

    Sostituisci quanto segue:

    • TARGET_HTTPS_PROXY_NAME: il nome del target proxy.
    • TARGET_PROXY_FILENAME: il nome di un file yaml. Ad esempio, mtls_target_proxy.yaml
    • REGION: la regione in cui hai configurato con il bilanciatore del carico di rete passthrough esterno regionale.

Aggiungi intestazioni personalizzate mTLS

Quando attivi mTLS, puoi trasmettere le informazioni sulla connessione mTLS usando intestazioni personalizzate. Puoi anche abilitare il logging in modo che Errori di connessione mTLS vengono acquisite nei log.

Aggiungi intestazioni personalizzate mTLS ai servizi di backend

Per i bilanciatori del carico delle applicazioni esterni globali o i bilanciatori del carico delle applicazioni classici, puoi utilizzare intestazioni personalizzate per passare informazioni sulla connessione mTLS ai servizi di backend.

  1. Per elencare tutti i servizi di backend nel progetto, utilizza il comando gcloud compute backend-services list:

    gcloud compute backend-services list
    

    Prendi nota del nome del servizio di backend per abilitare intestazioni e logging personalizzati. Questo nome è indicato come BACKEND_SERVICE in al passaggio successivo.

  2. Per aggiornare il servizio di backend, utilizza il comando gcloud compute backend-services update:

    gcloud compute backend-services update BACKEND_SERVICE \
      --global \
      --enable-logging \
      --logging-sample-rate=1 \
      --custom-request-header='X-Client-Cert-Present:{client_cert_present}' \
      --custom-request-header='X-Client-Cert-Chain-Verified:{client_cert_chain_verified}' \
      --custom-request-header='X-Client-Cert-Error:{client_cert_error}' \
      --custom-request-header='X-Client-Cert-Hash:{client_cert_sha256_fingerprint}' \
      --custom-request-header='X-Client-Cert-Serial-Number:{client_cert_serial_number}' \
      --custom-request-header='X-Client-Cert-SPIFFE:{client_cert_spiffe_id}' \
      --custom-request-header='X-Client-Cert-URI-SANs:{client_cert_uri_sans}' \
      --custom-request-header='X-Client-Cert-DNSName-SANs:{client_cert_dnsname_sans}' \
      --custom-request-header='X-Client-Cert-Valid-Not-Before:{client_cert_valid_not_before}' \
      --custom-request-header='X-Client-Cert-Valid-Not-After:{client_cert_valid_not_after}'
    

Aggiungere intestazioni personalizzate mTLS alla mappa degli URL

Per il bilanciatore del carico delle applicazioni interno tra regioni, il bilanciatore del carico delle applicazioni esterno regionale oppure Application Load Balancer interno regionale, puoi utilizzare intestazioni personalizzate per passare informazioni sulla connessione mTLS Mappa URL.

Per elencare tutte le mappe URL del progetto, utilizza il comando gcloud compute url-maps list:

   gcloud compute url-maps list
   

Prendi nota del nome della mappa URL per abilitare intestazioni e logging personalizzati. Questo nome è indicato come URL_MAP_NAME in al passaggio successivo.

globale

Per modificare la mappa URL per un bilanciatore del carico delle applicazioni interno tra regioni, utilizza Comando gcloud compute url-maps edit:

   gcloud compute url-maps edit URL_MAP_NAME --global
   

Di seguito è riportato un file YAML di esempio che mostra come utilizzare le variabili negli intestazioni delle richieste personalizzate (requestHeadersToAdd). Puoi utilizzare le stesse variabili per inviare intestazioni di risposta personalizzate (responseHeadersToAdd).

   headerAction:
      requestHeadersToAdd:
      - headerName: "X-Client-Cert-Present"
        headerValue: "{client_cert_present}"
      - headerName: "X-Client-Cert-Chain-Verified"
        headerValue: "{client_cert_chain_verified}"
      - headerName: "X-Client-Cert-Error"
        headerValue: "{client_cert_error}"
      - headerName: "X-Client-Cert-Hash"
        headerValue: "{client_cert_sha256_fingerprint}"
      - headerName: "X-Client-Cert-Serial-Number"
        headerValue: "{client_cert_serial_number}"
      - headerName: "X-Client-Cert-SPIFFE"
        headerValue: "{client_cert_spiffe_id}"
      - headerName: "X-Client-Cert-URI-SANs"
        headerValue: "{client_cert_uri_sans}"
      - headerName: "X-Client-Cert-DNSName-SANs"
        headerValue: "{client_cert_dnsname_sans}"
      - headerName: "X-Client-Cert-Valid-Not-Before"
        headerValue: "{client_cert_valid_not_before}"
      - headerName: "X-Client-Cert-Valid-Not-After"
        headerValue: "{client_cert_valid_not_after}"
      - headerName: "X-Client-Cert-Issuer-Dn"
        headerValue: "{client_cert_issuer_dn}"
      - headerName: "X-Client-Cert-Subject-Dn"
        headerValue: "{client_cert_subject_dn}"
      - headerName: "X-Client-Cert-Leaf"
        headerValue: "{client_cert_leaf}"
      - headerName: "X-Client-Cert-Chain"
        headerValue: "{client_cert_chain}"
   

regionale

Per modificare la mappa degli URL per un bilanciatore del carico delle applicazioni esterno regionale o un bilanciatore del carico delle applicazioni interno regionale, utilizza il comando gcloud compute url-maps edit:

   gcloud compute url-maps edit URL_MAP_NAME --region=REGION
   

Di seguito è riportato un file YAML di esempio che mostra come utilizzare le variabili negli requestHeadersToAddintestazioni delle richieste personalizzate (requestHeadersToAdd). Puoi utilizzare le stesse variabili per inviare intestazioni di risposta personalizzate (responseHeadersToAdd).

   defaultService: regions/REGION/backendServices/BACKEND_SERVICE_1
      name: regional-lb-map
      region: region/REGION
   headerAction:
      requestHeadersToAdd:
      - headerName: "X-Client-Cert-Present"
        headerValue: "{client_cert_present}"
      - headerName: "X-Client-Cert-Chain-Verified"
        headerValue: "{client_cert_chain_verified}"
      - headerName: "X-Client-Cert-Error"
        headerValue: "{client_cert_error}"
      - headerName: "X-Client-Cert-Hash"
        headerValue: "{client_cert_sha256_fingerprint}"
      - headerName: "X-Client-Cert-Serial-Number"
        headerValue: "{client_cert_serial_number}"
      - headerName: "X-Client-Cert-SPIFFE"
        headerValue: "{client_cert_spiffe_id}"
      - headerName: "X-Client-Cert-URI-SANs"
        headerValue: "{client_cert_uri_sans}"
      - headerName: "X-Client-Cert-DNSName-SANs"
        headerValue: "{client_cert_dnsname_sans}"
      - headerName: "X-Client-Cert-Valid-Not-Before"
        headerValue: "{client_cert_valid_not_before}"
      - headerName: "X-Client-Cert-Valid-Not-After"
        headerValue: "{client_cert_valid_not_after}"
      - headerName: "X-Client-Cert-Issuer-Dn"
        headerValue: "{client_cert_issuer_dn}"
      - headerName: "X-Client-Cert-Subject-Dn"
        headerValue: "{client_cert_subject_dn}"
      - headerName: "X-Client-Cert-Leaf"
        headerValue: "{client_cert_leaf}"
      - headerName: "X-Client-Cert-Chain"
        headerValue: "{client_cert_chain}"
   

Passaggi successivi