En esta página, se proporcionan instrucciones para crear una autoridad certificadora (CA) privada mediante Certificate Authority Service y subir tus certificados a un recurso TrustConfig
de Certificate Manager.
También debes crear los recursos de seguridad de red necesarios a fin de configurar TLS mutua para los balanceadores de cargas de aplicaciones.
Antes de comenzar
- Revisa la descripción general de la TLS mutua.
Instala Google Cloud CLI. Para obtener una descripción general completa de la herramienta, consulta la descripción general de la CLI de gcloud. Encontrarás comandos relacionados con el balanceo de cargas en la referencia de la API y la CLI de gcloud.
Si nunca ejecutaste la CLI de gcloud, primero ejecuta
gcloud init
para autenticarte.Asegúrate de que sabes crear grupos de CA.
Si usas el balanceador de cargas de aplicaciones externo global o el balanceador de cargas de aplicaciones clásico, asegúrate de haber configurado un balanceador de cargas con cualquiera de los siguientes backends compatibles:
- Backends de grupos de instancias de VM
- Buckets de Cloud Storage (compatibles solo si hay al menos un servicio de backend conectado al balanceador de cargas, además del bucket de backend)
- Backend de Cloud Run, App Engine o Cloud Run Functions
- Conectividad híbrida
Si usas un balanceador de cargas de aplicaciones externo regional, un balanceador de cargas de aplicaciones interno entre regiones o un balanceador de cargas de aplicaciones interno regional, asegúrate de haber configurado un balanceador de cargas con cualquiera de los siguientes backends admitidos:
- Backends de grupos de instancias de VM
- Cloud Run
- Conectividad híbrida
Permisos
Para obtener los permisos que necesitas a fin de completar esta guía, pídele a tu administrador que te otorgue los siguientes roles de IAM en el proyecto:
- Para crear recursos del balanceador de cargas, como
TargetHTTPProxy
: Administrador de balanceador de cargas de Compute (roles/compute.loadBalancerAdmin
) - Para usar recursos de Certificate Manager:
Propietario de Certificate Manager (
roles/certificatemanager.owner
) - Para crear componentes de seguridad y de herramientas de redes: Administrador de red de Compute (
roles/compute.networkAdmin
) y Administrador de seguridad de Compute (roles/compute.securityAdmin
) - Para crear un proyecto (opcional): Creador de proyectos (
roles/resourcemanager.projectCreator
)
Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.
También puedes obtener los permisos necesarios mediante roles personalizados o cualquier otro rol predefinido.
Crea una CA privada
Crea una CA privada mediante el Servicio de CA y, luego, crea un certificado raíz:
Para crear un grupo de CA, usa el comando
gcloud privateca pools create
:gcloud privateca pools create CA_POOL \ --location=us-central1
Reemplaza
CA_POOL
por el ID o el nombre del grupo de CA superior.Para crear una CA privada en el grupo de CA, usa el comando
gcloud privateca roots create
:gcloud privateca roots create CA_ROOT \ --pool=CA_POOL \ --subject="CN=my-ca, O=Test LLC" \ --location=us-central1
Reemplaza lo siguiente:
CA_ROOT
: el ID o el nombre de la CA privadaCA_POOL
: el ID o el nombre del grupo de AC superior
Para describir la CA nueva y crear el archivo
root.cert
, usa el comandogcloud 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')
Reemplaza lo siguiente:
CA_ROOT
: el ID o el nombre de la CA privadaCA_POOL
: el ID o el nombre del grupo de AC superior
Para obtener más información, consulta lo siguiente:
Crea TrustConfig con CA privada
Crea un recurso TrustConfig
de Certificate Manager que represente tu PKI mediante el certificado raíz generado con la CA privada. Suponemos que el recurso TrustConfig
es un almacén de confianza simple con un único ancla de confianza que representa un certificado raíz.
En los siguientes pasos, reemplaza TRUST_CONFIG_NAME
por el nombre del recurso TrustConfig
.
Para crear el archivo
trust_config.yaml
, usa el siguiente comando:cat << EOF > trust_config.yaml name: TRUST_CONFIG_NAME trustStores: - trustAnchors: - pemCertificate: "${ROOT?}" EOF
Para crear los recursos
TrustConfig
de Certificate Manager, usa el comandogcloud certificate-manager trust-configs import
:gcloud certificate-manager trust-configs import TRUST_CONFIG_NAME \ --source=trust_config.yaml \ --location=REGION
Reemplaza lo siguiente:
REGION
: usaglobal
para el balanceador de cargas de aplicaciones interno entre regiones, el balanceador de cargas de aplicaciones externo global o el balanceador de cargas de aplicaciones clásico. Para el balanceador de cargas de aplicaciones externo regional o el balanceador de cargas de aplicaciones interno regional, usa la región en la que configuraste el balanceador de cargas.
Crea los recursos de autenticación de clientes
Un recurso de autenticación de cliente (también llamado ServerTLSPolicy
) te permite especificar el modo de TLS del servidor y el recurso TrustConfig
que se usará cuando se validen los certificados de cliente. Cuando el cliente presenta un certificado no válido o ningún certificado al balanceador de cargas, clientValidationMode
especifica cómo se maneja la conexión del cliente.
Para obtener más información, consulta los modos de validación del cliente de mTLS.
- Cuando
clientValidationMode
se establece comoALLOW_INVALID_OR_MISSING_CLIENT_CERT
, todas las solicitudes se pasan al backend, incluso si la validación falla o si falta el certificado de cliente. - Cuando
clientValidationMode
se establece enREJECT_INVALID
, solo las solicitudes que proporcionan un certificado de cliente que se puede validar en un recursoTrustConfig
se pasan al backend.
Para crear el recurso ServerTLSPolicy
, completa los siguientes pasos:
Según cómo desees manejar la conexión, selecciona una de las siguientes opciones.
En los siguientes pasos, reemplaza
SERVER_TLS_POLICY_NAME
por el nombre de la política de TLS del servidor y reemplazaPROJECT_ID
por el ID de tu proyecto de Google Cloud.Opción 1:
clientValidationMode
se establece enALLOW_INVALID_OR_MISSING_CLIENT_CERT
.Para crear el archivo
server_tls_policy.yaml
, usa el siguiente comando:global
Para los balanceadores de cargas de aplicaciones externos y los balanceadores de cargas de aplicaciones internos entre regiones, usa el siguiente 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
regional
Para los balanceadores de cargas de aplicaciones externos regionales y los balanceadores de cargas de aplicaciones internos regionales, usa el siguiente 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
Opción 2:
clientValidationMode
se establece enREJECT_INVALID
.Para crear el archivo
server_tls_policy.yaml
, usa el siguiente comando:global
Para los balanceadores de cargas de aplicaciones externos y los balanceadores de cargas de aplicaciones internos entre regiones, usa el siguiente 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
regional
Para los balanceadores de cargas de aplicaciones externos regionales y los balanceadores de cargas de aplicaciones internos regionales, usa el siguiente 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
Para crear el recurso
ServerTlsPolicy
, usa el comandogcloud network-security server-tls-policies import
:global
Para los balanceadores de cargas de aplicaciones externos y los balanceadores de cargas de aplicaciones internos entre regiones, usa el siguiente comando:
gcloud network-security server-tls-policies import SERVER_TLS_POLICY_NAME \ --source=server_tls_policy.yaml \ --location=global
regional
Para los balanceadores de cargas de aplicaciones externos regionales y los balanceadores de cargas de aplicaciones internos regionales, usa el siguiente comando:
gcloud network-security server-tls-policies import SERVER_TLS_POLICY_NAME \ --source=server_tls_policy.yaml \ --location=REGION
Opcional: Enumera todos los recursos de autenticación de clientes (
ServerTlsPolicies
) en la ubicación especificada del proyecto actual.Console
En la consola de Google Cloud, ve a la página Autenticación de clientes.
Se muestran todos los recursos
ServerTlsPolicies
.
gcloud
Para enumerar todos los recursos de autenticación de clientes (
ServerTlsPolicies
), usa el comandogcloud network-security server-tls-policies list
:gcloud network-security server-tls-policies list \ --location=REGION
Reemplaza lo siguiente:
REGION
: usaglobal
para el balanceador de cargas de aplicaciones interno entre regiones, el balanceador de cargas de aplicaciones externo global o el balanceador de cargas de aplicaciones clásico. Para el balanceador de cargas de aplicaciones externo regional o el balanceador de cargas de aplicaciones interno regional, usa la región en la que configuraste el balanceador de cargas.
Configura la mTLS para el balanceador de cargas
Para que la autenticación TLS mutua funcione, después de configurar un balanceador de cargas, debes actualizar el proxy HTTPS de destino mediante el recurso ServerTLSPolicy
.
Asegúrate de haber creado el recurso de autenticación de cliente (
ServerTLSPolicy
). Para obtener instrucciones, consulta Crea los recursos de autenticación de clientes.Para obtener una lista de todos los proxies HTTPS de destino en tu proyecto, usa el comando
gcloud compute target-https-proxies list
:gcloud compute target-https-proxies list
Toma nota del nombre del proxy HTTPS de destino para conectar el recurso
ServerTLSPolicy
. Este nombre se denominaTARGET_HTTPS_PROXY_NAME
en los siguientes pasos.Para exportar la configuración de un proxy HTTPS de destino a un archivo, usa el comando
gcloud compute target-https-proxies export
.global
gcloud compute target-https-proxies export TARGET_HTTPS_PROXY_NAME \ --destination=TARGET_PROXY_FILENAME \ --global
Reemplaza lo siguiente:
TARGET_HTTPS_PROXY_NAME
: el nombre del proxy de destino.TARGET_PROXY_FILENAME
: el nombre de un archivo yaml. Por ejemplo,mtls_target_proxy.yaml
regional
gcloud compute target-https-proxies export TARGET_HTTPS_PROXY_NAME \ --destination=TARGET_PROXY_FILENAME \ --region=REGION
Reemplaza lo siguiente:
TARGET_HTTPS_PROXY_NAME
: el nombre del proxy de destino.TARGET_PROXY_FILENAME
: el nombre de un archivo yaml. Por ejemplo,mtls_target_proxy.yaml
REGION
: la región en la que configuraste el balanceador de cargas.
Enumera todos los recursos
ServerTlsPolicies
en la ubicación especificada del proyecto actual.Console
En la consola de Google Cloud, ve a la página Autenticación de clientes.
Se muestran todos los recursos
ServerTlsPolicies
.
gcloud
Para enumerar todos los recursos de autenticación de clientes (
ServerTlsPolicies
), usa el comandogcloud network-security server-tls-policies list
:gcloud network-security server-tls-policies list \ --location=REGION
Reemplaza lo siguiente:
REGION
: usaglobal
para el balanceador de cargas de aplicaciones interno entre regiones, el balanceador de cargas de aplicaciones externo global o el balanceador de cargas de aplicaciones clásico. Para el balanceador de cargas de aplicaciones externo regional o el balanceador de cargas de aplicaciones interno regional, usa la región en la que configuraste el balanceador de cargas.Ten en cuenta el nombre del recurso
ServerTlsPolicies
para configurar mTLS. Este nombre se denominaSERVER_TLS_POLICY_NAME
en el paso siguiente.Para agregar el archivo de recursos
TARGET_PROXY_FILENAME
deServerTlsPolicy
, usa el siguiente comando. ReemplazaPROJECT_ID
por el ID del proyecto de Google Cloud.echo "serverTlsPolicy: //networksecurity.googleapis.com/projects/PROJECT_ID/locations/REGION/serverTlsPolicies/SERVER_TLS_POLICY_NAME" >> TARGET_PROXY_FILENAME
Para importar la configuración de un proxy HTTPS de destino desde un archivo, usa el comando
gcloud compute target-https-proxies import
.global
gcloud compute target-https-proxies import TARGET_HTTPS_PROXY_NAME \ --source=TARGET_PROXY_FILENAME \ --global
Reemplaza lo siguiente:
TARGET_HTTPS_PROXY_NAME
: el nombre del proxy de destino.TARGET_PROXY_FILENAME
: el nombre de un archivo yaml. Por ejemplo,mtls_target_proxy.yaml
regional
gcloud compute target-https-proxies import TARGET_HTTPS_PROXY_NAME \ --source=TARGET_PROXY_FILENAME \ --region=REGION
Reemplaza lo siguiente:
TARGET_HTTPS_PROXY_NAME
: el nombre del proxy de destino.TARGET_PROXY_FILENAME
: el nombre de un archivo yaml. Por ejemplo,mtls_target_proxy.yaml
REGION
: la región en la que configuraste el balanceador de cargas.
Agrega encabezados personalizados mTLS
Cuando habilitas mTLS, puedes pasar información sobre la conexión mTLS con encabezados personalizados. También puedes habilitar el registro para que se capturen los errores de conexión mTLS en los registros.
Agrega encabezados personalizados mTLS a los servicios de backend
Para los balanceadores de cargas de aplicaciones externos globales o los balanceadores de cargas de aplicaciones clásicos, puedes usar encabezados personalizados para pasar información sobre la conexión mTLS a los servicios de backend.
Para enumerar todos los servicios de backend del proyecto, usa el comando
gcloud compute backend-services list
:gcloud compute backend-services list
Toma nota del nombre del servicio de backend para habilitar los registros y los encabezados personalizados. Este nombre se denomina
BACKEND_SERVICE
en el siguiente paso.Para actualizar el servicio de backend, usa el 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}'
Agrega encabezados personalizados mTLS al mapa de URL
Para los balanceadores de cargas de aplicaciones internos entre regiones, los balanceadores de cargas de aplicaciones externos regionales o los balanceadores de cargas de aplicaciones internos regionales, puedes usar encabezados personalizados para pasar información sobre la conexión mTLS al mapa de URL.
Para enumerar todos los mapas de URL en el proyecto, usa el comando gcloud compute url-maps list
:
gcloud compute url-maps list
Toma nota del nombre del mapa de URL para habilitar los encabezados y el registro personalizados.
Este nombre se denomina URL_MAP_NAME
en el siguiente paso.
global
Para editar el mapa de URL de un balanceador de cargas de aplicaciones interno entre regiones, usa el comando gcloud compute
url-maps edit
:
gcloud compute url-maps edit URL_MAP_NAME --global
A continuación, se muestra un archivo YAML de muestra que indica cómo usar variables en encabezados de solicitud personalizados (requestHeadersToAdd
). Puedes usar las mismas variables para enviar encabezados de respuesta personalizados (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}"
regional
Para editar el mapa de URL de un balanceador de cargas de aplicaciones externo regional o un balanceador de cargas de aplicaciones interno regional, usa el comando gcloud compute
url-maps edit
:
gcloud compute url-maps edit URL_MAP_NAME --region=REGION
A continuación, se muestra un archivo YAML de muestra que indica cómo usar variables en encabezados de solicitud personalizados (requestHeadersToAdd
). Puedes usar las mismas variables para enviar encabezados de respuesta personalizados (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}"