Introducción a la federación de identidad saliente - AWS Identity and Access Management

Introducción a la federación de identidad saliente

En esta guía se muestra cómo habilitar la federación de identidad saliente para su cuenta de AWS y cómo obtener su primer token web JSON (JWT) (mediante la API GetWebIdentityToken). Habilitará la característica, establecerá una relación de confianza con un servicio externo, configurará los permisos de IAM y solicitará un token mediante AWS CLI o AWS SDK para Python (Boto3).

Requisitos previos

Antes de comenzar, asegúrese de que dispone de lo siguiente:

  • La versión más reciente de AWS CLI o Python 3.8 (o posteriores) y Boto3 instaladas (para ejemplos de AWS SDK)

  • La cuenta de un servicio externo en la que puede configurar relaciones de confianza (como un proveedor de servicios en la nube externo, un proveedor de SaaS o una aplicación de prueba)

nota
  • La API GetWebIdentityToken no está disponible en el punto de conexión global de STS.

  • Los tokens web JSON (JWT) generados por la API GetWebIdentityToken no se pueden usar para la federación de OpenID Connect (OIDC) en AWS (a través de la API AssumeRoleWithWebIdentity).

Habilitación de la federación de identidad saliente para una cuenta

Debe habilitar la federación de identidad saliente para poder solicitar los tokens. Puede habilitar la característica mediante la Consola de administración de AWS o mediante programación con la API EnableOutboundWebIdentityFederation.

Uso de la CLI de AWS

aws iam enable-outbound-web-identity-federation

Uso de AWS SDK para Python

import boto3 # Create IAM client iam_client = boto3.client('iam') # Enable outbound identity federation response = iam_client.enable_outbound_web_identity_federation() print(f"Feature enabled. Issuer URL: {response['IssuerUrl']}") print(f"Status: {response['Status']}")

Uso de la consola de AWS

Vaya a IAM y seleccione Configuración de la cuenta en la sección Administración de acceso del menú de navegación de la izquierda.

Cuando habilite la característica, tome nota de la URL del emisor específico de su cuenta. Utilizará esta URL al configurar las relaciones de confianza en los servicios externos. También puede recuperar la URL de este emisor según sea necesario mediante la API GetOutboundWebIdentityFederationInfo.

Establecimiento de una relación de confianza en el servicio externo

Configure el servicio externo para que confíe en los tokens emitidos por su cuenta de AWS y los acepte. Los pasos específicos varían según el servicio, pero por lo general incluyen lo siguiente:

  • Registro de la URL del emisor de la cuenta de AWS como proveedor de identidades de confianza

  • Configuración de las notificaciones que validar (audiencia, patrones de temas)

  • Asignación de notificaciones de tokens a permisos en el servicio externo

Consulte la documentación del servicio externo para obtener instrucciones de configuración detalladas.

Configurar los permisos de IAM

Cree una política de IAM que conceda permiso para llamar a la API GetWebIdentityToken y adjunte la política a un rol de IAM que necesite generar tokens.

Este ejemplo de política otorga acceso a la generación de tokens con restricciones específicas. Solo permite solicitar tokens para “https://api.ejemplo.com” como audiencia y aplica una duración máxima de los tokens de 5 minutos (300 segundos). Consulte la lista de claves de condición que puede utilizar para aplicar las propiedades de los tokens en Claves de contexto de condición de IAM y AWS STS.

Política de IAM de ejemplo

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:GetWebIdentityToken", "Resource": "*", "Condition": { "ForAnyValue:StringEquals": { "sts:IdentityTokenAudience": "https://api.example.com" }, "NumericLessThanEquals": { "sts:DurationSeconds": 300 } } } ] }

Solicitud de su primer token web JSON (JWT)

Puede solicitar un token web JSON mediante la API GetWebIdentityToken. Puede especificar los siguientes parámetros al llamar a la API:

  • Audience (obligatorio): el destinatario previsto del token. Este valor rellena la notificación “aud” en el JWT. Los servicios externos validan esta notificación para asegurarse de que el token estaba destinado a ellos.

  • SigningAlgorithm (obligatorio): el algoritmo criptográfico que se utiliza para firmar el token. Los valores válidos son ES384 y RS256. Utilice ES384 para una seguridad y un rendimiento óptimos o RS256 para una compatibilidad más amplia con sistemas que no admiten ECDSA.

  • DurationSeconds (opcional): la vida útil del token en segundos. Los valores válidos están comprendidos entre 60 y 3600. El valor predeterminado es 300 (5 minutos). Recomendamos que los tokens tengan una vida útil más corta para aumentar la seguridad.

  • Tags (opcional): una lista de pares de clave-valor para incluirlos como notificaciones personalizadas en el token. Los servicios externos pueden usar estas notificaciones para la autorización detallada.

La API devuelve los siguientes campos:

  • IdentityToken: el JWT firmado como una cadena codificada en base64url. Incluya este token en las solicitudes a servicios externos.

  • Expiration: la marca de tiempo UTC del momento en que vence el token.

Uso de la CLI de AWS

aws sts get-web-identity-token \ --audience "https://api.example.com" \ --signing-algorithm ES384 \ --duration-seconds 300 \ --tags Key=team,Value=data-engineering \ Key=environment,Value=production \ Key=cost-center,Value=analytics

Uso de AWS SDK para Python

import boto3 sts_client = boto3.client('sts') response = sts_client.get_web_identity_token( Audience=['https://api.example.com'], DurationSeconds=300, SigningAlgorithm='RS256', Tags=[ {'Key': 'team', 'Value': 'data-engineering'}, {'Key': 'environment', 'Value': 'production'}, {'Key': 'cost-center', 'Value': 'analytics'} ] ) token = response['WebIdentityToken']

También puede descodificar el JWT para inspeccionar su contenido mediante bibliotecas de JWT estándar como PyJWT, Python-jose para Python, Nimbus JOSE+JWT para Java o depuradores como jwt.io. Consulte Descripción de las notificaciones de tokens para obtener más información sobre las notificaciones incluidas en el token.

Uso del token con un servicio externo

Tras recibir el token, inclúyalo en las solicitudes al servicio externo. El método varía según el servicio, pero la mayoría de los servicios aceptan los tokens en el encabezado de autorización. El servicio externo debe implementar una lógica de validación de tokens que recupere las claves de JWKS del punto de conexión conocido del emisor, verifique la firma del token y valide las notificaciones esenciales antes de conceder acceso a sus cargas de trabajo de AWS.

Recuperación de claves de verificación y metadatos de los puntos de conexión de OpenID Connect (OIDC)

La URL única del emisor de su cuenta de AWS aloja los puntos de conexión de detección de OpenID Connect (OIDC) que contienen las claves de verificación y los metadatos necesarios para la verificación de los tokens.

La URL del punto de conexión de detección de OIDC contiene los metadatos que algunos proveedores utilizan para verificar los tokens. Está disponible en:

{issuer_url}/.well-known/openid-configuration

El punto de conexión de JWKS (conjunto de claves web JSON) contiene las claves que se utilizan para verificar las firmas de los tokens. Está disponible en:

{issuer_url}/.well-known/jwks.json

Recuperación de JWKS mediante curl

curl https://{issuer_url}/.well-known/jwks.json

Respuesta:

{ "keys": [ { "kty": "EC", "use": "sig", "kid": "key-id-1", "alg": "ES384", "crv": "P-384", "x": "base64-encoded-x-coordinate", "y": "base64-encoded-y-coordinate" }, { "kty": "RSA", "use": "sig", "kid": "key-id-2", "n": "base64-encoded-modulus", "e": "AQAB" } ] }

Uso de AWS SDK para Python

import requests # Fetch Openid Configuration open_id_config_response = requests.get("https://{issuer_url}/.well-known/openid-configuration") open_id_config = open_id_config_response.json() # Fetch JWKS jwks_response = requests.get("https://{issuer_url}/.well-known/jwks.json") jwks = jwks_response.json()

Recomendamos almacenar en caché estas claves para evitar recuperarlas cada vez que se verifique un token.

Validaciones de notificaciones esenciales

  • Tema (sub): verifique que la notificación del tema contenga el patrón de ARN de entidad principal de IAM esperado.

  • Vencimiento (exp): asegúrese de que el token no haya vencido. Las bibliotecas de JWT suelen gestionar esto automáticamente.

  • Audiencia (aud): verifique que la audiencia coincida con el valor esperado. Esto evita que los tokens destinados a otros servicios se utilicen con los suyos.

  • Emisor (iss): verifique que el emisor coincida con las cuentas de AWS en las que confía. Mantenga una lista de direcciones URL de emisores de confianza.

Siempre que sea posible, debe validar otras notificaciones específicas de AWS para implementar el control de acceso detallado en el servicio externo. Por ejemplo, valide la notificación org_id para restringir el acceso a las entidades principales de IAM de su organización de AWS, compruebe principal_tags para aplicar el control de acceso basado en atributos (por ejemplo, permitir solo entornos de producción o equipos específicos) o verifique las notificaciones de contexto de sesión, como lambda_source_function_arn o ec2_instance_source_vpc, para restringir el acceso en función del recurso de computación. Consulte Descripción de las notificaciones de tokens para ver una lista completa de las notificaciones incluidas en el token.