En este documento, se describe cómo configurar el acceso basado en certificados para la federación de identidades para cargas de trabajo con certificados X.509.
El acceso basado en certificados usa la TLS mutua (mTLS) para autenticar al cliente y al servidor durante un protocolo de enlace TLS. En este proceso, una vinculación de mTLS incorpora políticas basadas en el contexto de transporte y usa el estado del certificado del cliente dentro de la sesión de TLS para tomar decisiones de autorización.
Para la federación de identidades para cargas de trabajo X.509, una vinculación de mTLS garantiza que todo el flujo de autenticación esté vinculado de forma segura a una carga de trabajo de confianza. Esto mitiga el riesgo de robo de credenciales, ya que el sistema vincula la autenticación a un extremo específico y de confianza.
Descripción general de la configuración del acceso basado en certificados para la federación de identidades para cargas de trabajo
A continuación, se proporciona una descripción general de alto nivel del proceso para configurar el acceso basado en certificados para la federación de identidades para cargas de trabajo:
Establece la federación de identidades para cargas de trabajo configurando la confianza con el ancla de confianza de los certificados X.509.
Crea un nivel de acceso para el acceso basado en certificados.
Agrega el nivel de acceso a una política de acceso adaptado al contexto que aplique la vinculación de mTLS.
Antes de comenzar
Verifica que cumplas con los siguientes requisitos previos:
La versión más reciente de Google Cloud CLI.
Para actualizar a la versión más reciente de gcloud CLI, ejecuta el siguiente comando:
gcloud components updateSi necesitas instalar gcloud CLI, consulta Instala gcloud CLI.
Una configuración de la federación de identidades para cargas de trabajo que use el ancla de confianza de tus certificados X.509.
Para usar esta función, completa el formulario de solicitud de lista de entidades permitidas para solicitar acceso.
Crea un nivel de acceso para los certificados
Crea un nivel de acceso de mTLS. El nivel de acceso de mTLS valida los certificados cuando se determina el acceso a los recursos.
Console
En Access Context Manager, crea un nivel de acceso personalizado y, luego, ingresa la siguiente expresión en el campo Expresión de CEL:
request.auth.matchesMtlsTokens(origin) == true.gcloud
Para crear un nivel de acceso personalizado, ejecuta el siguiente comando:
gcloud access-context-manager levels create ACCESS_LEVEL_NAME \ --title=TITLE \ --custom-level-spec=FILE \ --description=DESCRIPTION \ --policy=POLICY_NAME
Reemplaza lo siguiente:
ACCESS_LEVEL_NAME: Es el nombre del nivel de acceso.TITLE: Es el título del nivel de acceso.FILE: Es un archivo YAML con el siguiente contenido:expression: "request.auth.matchesMtlsTokens(origin) == true".DESCRIPTION: Es una descripción del nivel de acceso.POLICY_NAME: Es el nombre de la política de acceso.
Exporta el nivel de acceso que creaste a una variable de entorno para usarlo en los pasos siguientes:
export ACCESS_LEVEL_ID=ACCESS_LEVEL_ID
Reemplaza
ACCESS_LEVEL_IDpor el nombre del nivel de acceso, por ejemplo,accessPolicies/12345/accessLevels/acl_1.
Crea una vinculación de acceso adaptado al contexto para un grupo de identidades para cargas de trabajo
Configura las siguientes variables de entorno:
export ORG_ID=ORG_ID export CALLER_PROJECT_ID=CALLER_PROJECT_ID export FEDERATED_PRINCIPAL=FEDERATED_PRINCIPAL
Reemplaza lo siguiente:
ORG_ID: el ID de tu organización.CALLER_PROJECT_ID: Es el ID del proyecto que se usará para llamar a las APIs.FEDERATED_PRINCIPAL: Es el nombre de la principal de identidad en el grupo de identidades para cargas de trabajo que se adhiere a la política de Acceso adaptado al contexto. Puedes usar una de las siguientes opciones:- Una sola identidad:
principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT_ATTRIBUTE_VALUE - Todas las identidades de un grupo:
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*
- Una sola identidad:
gcloud
gcloud alpha access-context-manager cloud-bindings create \ --organization=
ORG_ID\ --federated-principal=FEDERATED_PRINCIPAL\ --level=ACCESS_LEVEL_ID\ --dry-run-level=DRY_RUN_ACCESS_LEVEL_IDReemplaza lo siguiente:
ACCESS_LEVEL_ID: Es el nombre del nivel de acceso.DRY_RUN_ACCESS_LEVEL_ID: Es el nombre del nivel de acceso de la ejecución de prueba. Te recomendamos que primero habilites una vinculación de política de ejecución de prueba para comprender el impacto potencial en el tráfico existente.
curl
Crea un archivo JSON con la vinculación de Acceso adaptado al contexto:
Solo puedes proporcionar un nivel de acceso en una solicitud, aunque el campo se repita. Puedes usar los siguientes tipos de principales federadas:
- Identidad única:
principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT_ATTRIBUTE_VALUE - Todas las identidades de un grupo:
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*
cat <<EOF > request.json { "principal": { "federatedPrincipal": "${FEDERATED_PRINCIPAL:?}" }, "accessLevels": ["${ACCESS_LEVEL_ID:?}"] } EOF- Identidad única:
Usa
curlpara enviar la siguiente solicitud HTTP:curl -H "X-Goog-User-Project: ${CALLER_PROJECT_ID:?}" -X POST \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json; charset=utf-8" \ -d @request.json \ "https://accesscontextmanager.googleapis.com/v1alpha/organizations/${ORG_ID:?}/gcpUserAccessBindings"
Autoriza con las bibliotecas cliente de Google Cloud
Para autorizar las cargas de trabajo de la federación de identidades para cargas de trabajo con las bibliotecas cliente deGoogle Cloud , completa los siguientes pasos:
Crea un archivo de credenciales predeterminadas de la aplicación (ADC) configurado para la autenticación de la federación de identidades para cargas de trabajo:
gcloud iam workload-identity-pools create-cred-config IDENTITY_POOL_ID \ --credential-cert-path WORKLOAD_CERTIFICATE_PATH \ --credential-cert-private-key-path WORKLOAD_KEY_PATH \ --output-file ADC_FILE_OUTPUT_PATH
Reemplaza lo siguiente:
IDENTITY_POOL_ID: Es el ID de tu grupo de identidades para cargas de trabajo.WORKLOAD_CERTIFICATE_PATH: Es la ruta de acceso al archivo del certificado de tu carga de trabajo.WORKLOAD_KEY_PATH: Es la ruta de acceso al archivo de clave privada de tu carga de trabajo.ADC_FILE_OUTPUT_PATH: Es la ruta de acceso de salida para el archivo de ADC.
Este comando también genera un archivo de configuración de certificado en el directorio de configuración predeterminado de gcloud CLI. El archivo de configuración del certificado admite la autenticación inicial y establece los protocolos de enlace de mTLS para las solicitudes posteriores a los recursos de Google Cloud .
Configura una variable de entorno para que apunte al archivo de ADC y que las bibliotecas cliente de Google puedan descubrir tus credenciales:
export GOOGLE_APPLICATION_CREDENTIALS=ADC_FILE_OUTPUT_PATH
Este paso es opcional si omites el argumento
--output-filecuando generas el archivo de ADC. Si omites el argumento, gcloud CLI crea y lee el archivo de ADC desde el directorio de configuración predeterminado de gcloud CLI.La función admite las bibliotecas cliente en Go, Python y Java. Debes configurar la variable de entorno para activar mTLS en Python y Java.
Para establecer y probar con rapidez el acceso de mTLS a las APIs de Google Cloud , puedes usar los siguientes ejemplos de código:
Go
Usa el siguiente ejemplo para crear un archivo de Go, como
golang_test.go:package golang_test import ( "io" "log" "testing" "cloud.google.com/go/auth/credentials" "cloud.google.com/go/auth/httptransport" ) func TestGoExample(t *testing.T) { scopes := []string{ "https://www.googleapis.com/auth/pubsub", // Scope for Pub/Sub access // Add other scopes as needed } dopts := credentials.DetectOptions{ Scopes: scopes, } // Create httptransport.Options with the scopes opts := &httptransport.Options{ DetectOpts: &dopts, } hc, err := httptransport.NewClient(opts) if err != nil { t.Fatalf("NewHTTPClient: %v", err) } resp, err := hc.Get("https://pubsub.mtls.googleapis.com/v1/projects/PROJECT_ID/topics") if err != nil { t.Fatalf("Get: %v", err) } t.Logf("Status: %s", resp.Status) t.Cleanup(func() { resp.Body.Close() }) b, err := io.ReadAll(resp.Body) if err != nil { t.Fatal(err) } log.Println(string(b)) }Reemplaza
PROJECT_IDpor el ID del proyecto deGoogle Cloud .Para ejecutar una prueba en una VM de Compute Engine, usa el siguiente comando:
go mod init example.com go mod tidy go test -v golang_test.go --count=1Python
Usa el siguiente ejemplo para crear un archivo de prueba, como
python_test.py:import google.auth import google.auth.transport.requests import requests def test_python_example(): # Define the required scopes for your application scopes = [ "https://www.googleapis.com/auth/pubsub", # Scope for Pub/Sub access # Add other scopes as needed ] # Obtain Application Default Credentials (ADC) with the specified scopes credentials, _ = google.auth.default(scopes=scopes) # Create an authorized HTTP session using the ADC credentials authed_session = google.auth.transport.requests.AuthorizedSession(credentials) try: # Make a GET request to the Pub/Sub API endpoint response = authed_session.get( "https://pubsub.mtls.googleapis.com/v1/projects/PROJECT_ID/topics" ) # Check if the request was successful response.raise_for_status() # Raise an exception for error statuses # Log the response status and content print(f"Status: {response.status_code}") print(response.text) except requests.exceptions.RequestException as e: print(f"Error making the request: {e}") if __name__ == "__main__": test_python_example()Reemplaza
PROJECT_IDpor el ID del proyecto deGoogle Cloud .Para ejecutar una prueba en una VM de Compute Engine, completa los siguientes pasos:
- Configura un entorno virtual de Python.
Instala las bibliotecas requeridas:
pip install google-auth google-auth-httplib2 requestsEjecuta la prueba:
python3 python_test.py
Autoriza con solicitudes HTTP sin formato
Para autorizar las cargas de trabajo de la federación de identidades para cargas de trabajo con solicitudes HTTP sin formato, completa los siguientes pasos:
Obtén un token de acceso vinculado a un certificado del servicio de tokens de seguridad de Google Cloud a través de un protocolo de enlace mTLS estándar.
Llama a los servicios de Google Cloud con el token de acceso que obtuviste del Servicio de tokens de seguridad. En este ejemplo, se consulta Cloud Storage:
curl --key WORKLOAD_KEY_PATH --cert WORKLOAD_CERTIFICATE_PATH \ -X GET "https://storage.mtls.googleapis.com/RESOURCE_PATH" \ -H "Authorization: Bearer $ACCESS_TOKEN"
La vinculación de mTLS aplica el uso de mTLS. Ejecuta el siguiente comando para verificar que una conexión que no sea de mTLS falle con un error de falta de autorización:
curl -X GET "https://storage.googleapis.com/RESOURCE_PATH" \ -H "Authorization: Bearer $ACCESS_TOKEN"
Enumera la vinculación de políticas
Para enumerar la vinculación de políticas de la federación de identidades para cargas de trabajo, ejecuta el siguiente comando:
gcloud
Con el siguiente comando, se enumeran las vinculaciones específicas dentro de una organización determinada, filtrando por aquellas que se aplican a las principales federadas:
gcloud alpha access-context-manager cloud-bindings list \
--organization=ORG_ID \
--filter='principal:federatedPrincipal'
curl
curl -H "X-Goog-User-Project: ${CALLER_PROJECT_ID:?}" -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://accesscontextmanager.googleapis.com/v1alpha/organizations/${ORG_ID:?}/gcpUserAccessBindings?filter=principal%3Afederated_principal"
Actualiza una vinculación de política
Para actualizar una vinculación de política, completa los siguientes pasos:
gcloud
gcloud alpha access-context-manager cloud-bindings update \ --binding=BINDING_ID\ --organization=ORG_ID\ --level=NEW_ACCESS_LEVEL_ID
curl
Agrega el nuevo nivel de acceso al archivo request.json y ejecuta el siguiente
comando:
curl -H "X-Goog-User-Project: ${CALLER_PROJECT_ID:?}" -X PATCH \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://accesscontextmanager.googleapis.com/v1alpha/organizations/${ORG_ID:?}/gcpUserAccessBindings/${BINDING_ID:?}?updateMask=access_levels"
Borra una vinculación de políticas
Para borrar una vinculación de política, ejecuta el siguiente comando:
gcloud
gcloud alpha access-context-manager cloud-bindings delete \ --binding=BINDING_ID\ --organization=ORG_ID
curl
curl -H "X-Goog-User-Project: ${CALLER_PROJECT_ID:?}" -X DELETE \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://accesscontextmanager.googleapis.com/v1alpha/organizations/${ORG_ID:?}/gcpUserAccessBindings/${BINDING_ID:?}"