

AWS El servicio de modernización de mainframes (experiencia en entornos de ejecución gestionados) ya no está abierto a nuevos clientes. Para obtener prestaciones similares a las del Servicio de Modernización de AWS Mainframe (experiencia en entornos de ejecución gestionados), explore el Servicio de Modernización de AWS Mainframe (experiencia autogestionada). Los clientes existentes pueden seguir utilizando el servicio con normalidad. Para obtener más información, consulte Cambio en la disponibilidad de la modernización del [AWS mainframe.](https://docs.aws.amazon.com/m2/latest/userguide/mainframe-modernization-availability-change.html)

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Configuración de la seguridad para las aplicaciones de Gapwalk
<a name="ba-runtime-security"></a>

En los siguientes temas se describe cómo administrar las aplicaciones de Gapwalk.

Es su responsabilidad proporcionar la configuración correcta para garantizar que el uso del marco de AWS Blu Age sea seguro.

Todas las características relacionadas con la seguridad están deshabilitadas de manera predeterminada. Para habilitar la autenticación (y CSRF, XSS, CSP, etc.), establezca `gapwalk-application.security` en `enabled` y `gapwalk-application.security.identity` en `oauth`.

**Topics**
+ [Configuración de la accesibilidad de URI para las aplicaciones de Gapwalk](ba-runtime-filteringURIs.md)
+ [Configurar la autenticación para las aplicaciones de Gapwalk](ba-runtime-auth.md)
+ [Configurar el límite de velocidad para AWS Blu Age Runtime](ba-runtime-rate-limiting.md)

# Configuración de la accesibilidad de URI para las aplicaciones de Gapwalk
<a name="ba-runtime-filteringURIs"></a>

En este tema se describe cómo configurar el filtrado de las aplicaciones URIs de Gapwalk. Esta característica no requiere un nuevo proveedor de identidades (IdP).

Para bloquear una lista de URIs, añada las dos líneas siguientes a la `application-main.yml` de su aplicación modernizada*URI-1*, *URI-2* sustituyéndolas, etc., por las URIs que desee bloquear.

```
gapwalk-application.security.filterURIs: enabled
gapwalk-application.security.blockedURIs: URI-1, URI-2, URI-3
```

# Configurar la autenticación para las aplicaciones de Gapwalk
<a name="ba-runtime-auth"></a>

Para configurar la OAuth2 autenticación de su aplicación Gapwalk, debe configurar un proveedor de identidad (IdP) e integrarlo con su aplicación. En esta guía se describen los pasos para utilizar Amazon Cognito o Keycloak como IdP. Con Amazon Cognito, puede actualizar el archivo de configuración de la aplicación con los detalles del grupo de usuarios de Cognito. Con Keycloak, puedes controlar el acceso a tu aplicación APIs y a los recursos en función de las funciones asignadas al usuario.

**Topics**
+ [Configurar la OAuth2 autenticación de Gapwalk con Amazon Cognito](ba-runtime-auth-cognito.md)
+ [Configura la autenticación de Gapwalk con Keycloak OAuth2](ba-runtime-auth-keycloak.md)

# Configurar la OAuth2 autenticación de Gapwalk con Amazon Cognito
<a name="ba-runtime-auth-cognito"></a>

En este tema se describe cómo configurar la OAuth2 autenticación para las aplicaciones de Gapwalk que utilizan Amazon Cognito como proveedor de identidad (IdP).

## Requisitos previos
<a name="ba-runtime-auth-cognito-prereq"></a>

En este tutorial utilizaremos Amazon Cognito como IdP y PlanetDemo como proyecto modernizado.

Puede utilizar cualquier otro proveedor de identidades externo. La ClientRegistration información debe obtenerse de su IDP y es necesaria para la autenticación de Gapwalk. Para obtener más información, consulte la [Guía para desarrolladores de Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/).

**La información: ClientRegistration **

client-id  
El ID de la ClientRegistration. En nuestro ejemplo, lo será PlanetsDemo.

client-secret  
Su secreto de cliente.

authorization endpoint  
El URI del punto de conexión de autorización para el servidor de autorizaciones.

token endpoint  
El URI del punto de conexión del token para el servidor de autorización.

jwks endpoint  
El URI utilizado para obtener la clave web JSON (JWK) que contiene las claves para validar la firma web JSON emitida por el servidor de autorización.

redirect URI  
URI al que el servidor de autorización redirige al usuario final si se le concede acceso.

## Configuración de Amazon Cognito
<a name="cog-setup"></a>

En primer lugar, crearemos y configuraremos un usuario y un grupo de usuarios de Amazon Cognito que utilizaremos con nuestra aplicación de Gapwalk implementada con fines de prueba.

**nota**  
Si utiliza otro IdP, puede saltarse este paso.

**Creación de un grupo de usuarios**

1. Vaya a Amazon Cognito en Consola de administración de AWS y autentíquese con sus credenciales. AWS 

1. Elija **Grupos de usuarios**.

1. Elija **Crear un grupo de usuarios**.

1. En **Configurar la experiencia de inicio de sesión**, mantenga el tipo de proveedor predeterminado **Grupo de usuarios de Cognito**. **Puede elegir una o varias **Opciones de inicio de sesión del grupo de usuarios de Cognito**; por ahora, elija **Nombre de usuario** y, a continuación, Siguiente**.  
![\[alt_text\]](http://docs.aws.amazon.com/es_es/m2/latest/userguide/images/cog-auth-provider.png)

1. En **Configurar los requisitos de seguridad**, mantenga los valores predeterminados y deshabilite **Autenticación multifactor** seleccionando **Sin MFA** y, a continuación, elija **Siguiente**.  
![\[alt_text\]](http://docs.aws.amazon.com/es_es/m2/latest/userguide/images/cog-sec-requirements.png)

1. Como seguridad, deshabilite **Habilitar el registro automático** y, a continuación, seleccione **Siguiente**.  
![\[alt_text\]](http://docs.aws.amazon.com/es_es/m2/latest/userguide/images/cog-config-sign-up.png)

1. Elija **Enviar correo electrónico con Cognito** y, a continuación, elija **Siguiente**.  
![\[alt_text\]](http://docs.aws.amazon.com/es_es/m2/latest/userguide/images/cog-email.png)

1. En **Integrar su aplicación**, especifique un nombre para su grupo de usuarios. En **Páginas de autenticación alojadas**, elija **Usar la interfaz de usuario alojada de Cognito**.  
![\[alt_text\]](http://docs.aws.amazon.com/es_es/m2/latest/userguide/images/cog-domain.png)

1. Para simplificar, en **Dominio**, elija **Utilizar un dominio de Cognito** e introduzca un prefijo de dominio; por ejemplo, `https://planetsdemo`. La aplicación de demostración debe añadirse como cliente.

   1. En **Cliente de aplicación inicial**, elija **Cliente confidencial**. Introduzca un nombre de cliente de aplicación, por ejemplo **planetsdemo**, y, a continuación, elija **Generar un secreto de cliente**.

   1. En **URL de devolución de llamadas permitidas**, introduzca la URL a la que redirigir al usuario tras la autenticación. La URL debe finalizar con `/login/oauth2/code/cognito`. Por ejemplo, para nuestra aplicación y aplicaciones de backend de Gapwalk y BAC:

      ```
      http://localhost:8080/bac
            http://localhost:8080/bac/login/oauth2/code/cognito
            http://localhost:8080/gapwalk-application
            http://localhost:8080/gapwalk-application/login/oauth2/code/cognito
            http://localhost:8080/planetsdemo
            http://localhost:8080/planetsdemo/login/oauth2/code/cognito
      ```

      Puede editar la URL más adelante.  
![\[alt_text\]](http://docs.aws.amazon.com/es_es/m2/latest/userguide/images/cog-urls.png)

   1. En **Permitido cierre de sesión**, URLs introduzca la URL de la página de cierre de sesión a la que desea que Amazon Cognito redirija cuando la aplicación cierre sesión de los usuarios. Por ejemplo, para las aplicaciones de backend de Gapwalk y BAC:

      ```
      http://localhost:8080/bac/logout
      http://localhost:8080/gapwalk-application/logout
      http://localhost:8080/planetsdemo/logout
      ```

      Puede editar la URL más adelante.

   1. Mantenga los valores predeterminados de las secciones **Configuración avanzada del cliente de aplicación** y **Permisos avanzados de lectura y escritura de atributos**.

   1. Elija **Siguiente**.

1. En **Revisar y crear**, verifique sus opciones y, a continuación, elija **Crear un grupo de usuarios**.

Para obtener más información, consulte [Creación de un grupo de usuarios](https://docs.aws.amazon.com/cognito/latest/developerguide/tutorial-create-user-pool.html).

**Creación de usuarios**

Como el registro automático está deshabilitado, cree un usuario de Amazon Cognito. Vaya a la consola de Amazon Cognito. Elija el grupo de usuarios que ha creado y, a continuación, en **Usuarios**, elija **Crear usuario**.

En **Información del usuario**, elija **Enviar una invitación por email**, introduzca un nombre de usuario y una dirección de correo electrónico y, a continuación, seleccione **Generar una contraseña**. Seleccione la opción **Crear usuario**.

**Creación de roles**

En la pestaña **Grupos**, cree 3 grupos (SUPER\$1ADMIN, ADMIN y USER) y asocie su usuario a uno o más de estos grupos. Posteriormente, la aplicación de Gapwalk asigna estos roles a ROLE\$1SUPER\$1ADMIN, ROLE\$1ADMIN y ROLE\$1USER para poder acceder a algunas llamadas API REST restringidas.

La aplicación implementa un scope-to-role mapeo jerárquico que funciona con varios proveedores de identidad. OAuth2 Cuando los tokens JWT emitidos por Cognito se utilizan para la autorización del servidor de recursos, los ámbitos definidos en el token se asignan automáticamente a las funciones correspondientes.

## Integración de Amazon Cognito en la aplicación de Gapwalk
<a name="integrate-cognito"></a>

Ahora que el grupo de usuarios y el usuario de Amazon Cognito están preparados, vaya al archivo `application-main.yml` de la aplicación modernizada y agregue el siguiente código:

```
gapwalk-application.security: enabled
gapwalk-application.security.identity: oauth
gapwalk-application.security.issuerUri: https://cognito-idp.<region-id>.amazonaws.com/<pool-id>
gapwalk-application.security.domainName: <your-cognito-domain>

spring:
  security:
    oauth2:
      client:
        registration:
          cognito:
            client-id: <client-id>
            client-name: <client-name>
            client-secret: <client-secret>
            provider: cognito
            authorization-grant-type: authorization_code
            scope: openid
            redirect-uri: "<redirect-uri>"
        provider:
          cognito:
            issuer-uri: ${gapwalk-application.security.issuerUri}
            authorization-uri: ${gapwalk-application.security.domainName}/oauth2/authorize
            jwk-set-uri: ${gapwalk-application.security.issuerUri}/.well-known/jwks.json
            token-uri: ${gapwalk-application.security.domainName}/oauth2/token
            user-name-attribute: username
      resourceserver:
        jwt:
          jwk-set-uri: ${gapwalk-application.security.issuerUri}/.well-known/jwks.json
```

Reemplace los siguientes marcadores de posición como se indica:

1. Vaya a Amazon Cognito en Consola de administración de AWS y autentíquese con sus credenciales. AWS 

1. Elija **Grupos de usuarios** y el grupo de usuarios que ha creado. Puede encontrar su ID de **grupo *pool-id* de usuarios**.

1. Selecciona **Integración de aplicaciones**, donde encontrarás la tuya*your-cognito-domain*, y luego ve a **Clientes y análisis de aplicaciones** y elige tu aplicación.

1. En el **cliente de aplicaciones: YourApp**, puedes encontrar las opciones *client-name**client-id*, y *client-secret* (**Mostrar el secreto del cliente**).

1. *region-id*corresponde al ID de AWS región en el que creó su usuario y grupo de usuarios de Amazon Cognito. Ejemplo: `eu-west-3`.

1. Para, *redirect-uri* introduzca el URI que especificó para la URL de devolución de **llamada permitida.** En nuestro ejemplo, es `http://localhost:8080/planetsdemo/login/oauth2/code/cognito`.

Ahora puede implementar su aplicación de Gapwalk y usar el usuario creado anteriormente para iniciar sesión en su aplicación.

# Configura la autenticación de Gapwalk con Keycloak OAuth2
<a name="ba-runtime-auth-keycloak"></a>

En este tema se describe cómo configurar la OAuth2 autenticación para las aplicaciones de Gapwalk que utilizan Keycloak como proveedor de identidad (IdP). En este tutorial, utilizaremos 24.0.0.

## Requisitos previos
<a name="ba-runtime-auth-keycloak-prereq"></a>
+ [Keycloak](https://www.keycloak.org/)
+ Aplicación Gapwalk

## Configuración de Keycloak
<a name="keycloak-setup"></a>

1. Vaya al panel de Keycloak en el navegador web. Las credenciales predeterminadas son admin/admin. Vaya a la barra de navegación superior izquierda y cree un dominio con el nombre **demo**, tal como se muestra en la imagen siguiente.  
![\[alt_text\]](http://docs.aws.amazon.com/es_es/m2/latest/userguide/images/ba-runtime-auth-keycloak_2.png)

1. Cree un cliente con el nombre **app-demo**.  
![\[User interface for creating a new client in an authentication management system.\]](http://docs.aws.amazon.com/es_es/m2/latest/userguide/images/ba-runtime-auth-keycloak_3.jpg)

   Reemplace `localhost:8080` por la dirección de su aplicación de Gapwalk  
![\[alt_text\]](http://docs.aws.amazon.com/es_es/m2/latest/userguide/images/ba-runtime-auth-keycloak_4.png)  
![\[alt_text\]](http://docs.aws.amazon.com/es_es/m2/latest/userguide/images/ba-runtime-auth-keycloak_5.png)

1. Para obtener su secreto de cliente, elija **Clientes**, **app-demo** y **Credenciales**.  
![\[alt_text\]](http://docs.aws.amazon.com/es_es/m2/latest/userguide/images/ba-runtime-auth-keycloak_6.jpg)

1. Elija **Clientes**, **Ámbitos de clientes** y **Agregar asignador predefinido**. Elija los **roles de dominio**.  
![\[alt_text\]](http://docs.aws.amazon.com/es_es/m2/latest/userguide/images/ba-runtime-auth-keycloak_7.jpg)

1. Edite su rol de dominio con la configuración que se muestra en la imagen siguiente.  
![\[alt_text\]](http://docs.aws.amazon.com/es_es/m2/latest/userguide/images/ba-runtime-auth-keycloak_8.jpg)

1. Recuerde el **Nombre de notificación de token** definido. Necesitará este valor en la definición de configuración de Gapwalk para la propiedad `gapwalk-application.security.claimGroupName`.  
![\[alt_text\]](http://docs.aws.amazon.com/es_es/m2/latest/userguide/images/ba-runtime-auth-keycloak_9.jpg)

1. Elige **Roles de dominios** y cree 3 roles: **SUPER\$1ADMIN**, **ADMIN** y **USER**. Estos roles se asignan posteriormente a `ROLE_SUPER_ADMIN`, `ROLE_ADMIN` y `ROLE_USER` por la aplicación de Gapwalk para poder acceder a algunas llamadas API de REST restringidas.  
![\[alt_text\]](http://docs.aws.amazon.com/es_es/m2/latest/userguide/images/ba-runtime-auth-keycloak_10.jpg)

## Integración de Keycloak en la aplicación de Gapwalk
<a name="gapwalk-setup"></a>

Edite el archivo `application-main.yml` de la siguiente manera:

```
gapwalk-application.security: enabled
gapwalk-application.security.identity: oauth
gapwalk-application.security.issuerUri: http://<KEYCLOAK_SERVER_HOSTNAME>/realms/<YOUR_REALM_NAME>
gapwalk-application.security.claimGroupName: "keycloak:groups"

gapwalk-application.security.userAttributeName: "preferred_username"
# Use "username" for cognito, 
#     "preferred_username" for keycloak
#      or any other string

spring:
  security:
    oauth2:
      client:
        registration:
          demo:
            client-id: <YOUR_CLIENT_ID>
            client-name: Demo App
            client-secret: <YOUR_CLIENT_SECRET>
            provider: keycloak
            authorization-grant-type: authorization_code
            scope: openid
            redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
        provider:
          keycloak:
            issuer-uri: ${gapwalk-application.security.issuerUri}
            authorization-uri: ${gapwalk-application.security.issuerUri}/protocol/openid-connect/auth
            jwk-set-uri: ${gapwalk-application.security.issuerUri}/protocol/openid-connect/certs
            token-uri: ${gapwalk-application.security.issuerUri}/protocol/openid-connect/token
            user-name-attribute: ${gapwalk-application.security.userAttributeName}
      resourceserver:
        jwt:
          jwk-set-uri: ${gapwalk-application.security.issuerUri}/protocol/openid-connect/certs
```

Sustituya*<KEYCLOAK\$1SERVER\$1HOSTNAME>*, *<YOUR\$1REALM\$1NAME>**<YOUR\$1CLIENT\$1ID>*, y *<YOUR\$1CLIENT\$1SECRET>* por el nombre de host del servidor Keycloak, el nombre de dominio, el ID de cliente y el secreto de cliente.

# Configurar el límite de velocidad para AWS Blu Age Runtime
<a name="ba-runtime-rate-limiting"></a>

AWS Blu Age Runtime incluye una función de limitación de velocidad integrada para proteger la aplicación Gapwalk de solicitudes excesivas y posibles abusos. El sistema de limitación de velocidad utiliza el algoritmo Token Bucket para proporcionar tanto la capacidad de ráfaga como una limitación de velocidad sostenida.

**Topics**
+ [Descripción general de los límites de velocidad](#ba-runtime-rate-limiting-overview)
+ [Propiedades de configuración](#ba-runtime-rate-limiting-config)
+ [Habilite la limitación de velocidad](#ba-runtime-rate-limiting-enable)
+ [Identificación del cliente](#ba-runtime-rate-limiting-client-id)
+ [Cabeceras de límite de velocidad](#ba-runtime-rate-limiting-headers)
+ [Administración de la memoria](#ba-runtime-rate-limiting-memory)

## Descripción general de los límites de velocidad
<a name="ba-runtime-rate-limiting-overview"></a>

El sistema de limitación de velocidad ofrece las siguientes funciones:

**Algoritmo Token Bucket**  
+ Permite el tráfico en ráfagas hasta la capacidad de ráfaga configurada
+ Recarga los tokens a un ritmo constante en función de las solicitudes por minuto
+ Proporciona una limitación de velocidad fluida sin bloquear los picos de tráfico legítimos

**Identificación del cliente**  
+ Identifica a los clientes por dirección IP con soporte de proxy
+ Soportes X-Forwarded-For y X-Real-IP encabezados
+ Maneja escenarios de equilibrio de carga y proxy inverso

**Automatic Memory Management**  
+ Limpia automáticamente los intervalos de límite de velocidad vencidos
+ Intervalos de limpieza y tiempos de caducidad configurables
+ Evita las pérdidas de memoria en aplicaciones de ejecución prolongada

**Integración de HTTP**  
+ Devuelve HTTP 429 (demasiadas solicitudes) cuando se superan los límites
+ Incluye encabezados de límite de velocidad estándar en las respuestas
+ Proporciona información útil para los clientes

## Propiedades de configuración
<a name="ba-runtime-rate-limiting-config"></a>

Configura la limitación de velocidad en tu `application-main.yaml` archivo:

```
gapwalk:
  ratelimiting:
    enabled: true                                        # Enable/disable rate limiting
    requestsPerMinute: 1000                              # Sustained rate limit per minute
    burstCapacity: 1500                                  # Maximum burst requests allowed
    includeHeaders: true                                 # Include X-RateLimit-* headers
    cleanupIntervalMinutes: 5                            # Cleanup interval for expired buckets
    bucketExpiryHours: 1                                 # Hours after which unused buckets expire
    errorMessage: "Too many requests. Try again later."  # Custom error message
    whitelistIps: ""                                     # Comma-separated IPs to bypass limiting
    perEndpointLimiting: false                           # Apply limits per endpoint (not implemented)
```

### Descripciones de propiedades
<a name="ba-runtime-rate-limiting-config-properties"></a>

**enabled**  
Interruptor maestro para activar o desactivar la funcionalidad de limitación de velocidad. Valor predeterminado: `false`

**requestsPerMinute**  
Número de solicitudes permitidas por minuto para limitar la velocidad de forma sostenida. Esto representa la tasa de recarga del token. Valor predeterminado: `1000`

**Capacidad de ráfaga**  
Número máximo de solicitudes permitidas en una ráfaga antes de que se aplique el límite de velocidad. Debe ser mayor que `requestsPerMinute` para permitir picos de tráfico. Valor predeterminado: `1500`

**Incluya encabezados**  
Si se deben incluir encabezados de límite de velocidad estándar (`X-RateLimit-Limit`,`X-RateLimit-Remaining`,`X-RateLimit-Reset`) en las respuestas HTTP. Valor predeterminado: `true`

**cleanupIntervalMinutes**  
Intervalo en minutos entre la limpieza automática de los intervalos de límite de velocidad vencidos. Ayuda a evitar pérdidas de memoria. Valor predeterminado: `5`

**bucketExpiryHours**  
Tiempo en horas tras el cual los intervalos de límite de velocidad no utilizados se consideran vencidos y aptos para ser limpiados. Valor predeterminado: `1`

**errorMessage**  
Se devuelve un mensaje de error personalizado en la respuesta de JSON cuando se supera el límite de velocidad. Valor predeterminado: `"Too many requests. Try again later."`

**Consejos de la lista blanca**  
Lista de direcciones IP separadas por comas que eluden por completo la limitación de velocidad. Útil para controles de estado o sistemas confiables. Valor predeterminado: `empty`

**perEndpointLimiting**  
Si se deben aplicar límites de velocidad separados por punto final en lugar de solo por cliente. Actualmente no está implementado. Valor predeterminado: `false`

## Habilite la limitación de velocidad
<a name="ba-runtime-rate-limiting-enable"></a>

Para activar la limitación de velocidad con la configuración predeterminada:

```
gapwalk:
  ratelimiting:
    enabled: true
```

## Identificación del cliente
<a name="ba-runtime-rate-limiting-client-id"></a>

El sistema de limitación de velocidad identifica a los clientes según el siguiente orden de prioridad:

1. **X-Forwarded-For encabezado** (primera IP si está separada por comas)

1. **X-Real-IP encabezado**

1. **Dirección remota** de la solicitud HTTP

Esto garantiza la correcta identificación del cliente cuando la aplicación está inactiva:
+ Equilibradores de carga
+ Proxies inversos
+ CDNs
+ Puertas de enlace API

### Ejemplo de identificación de cliente
<a name="ba-runtime-rate-limiting-client-id-example"></a>

```
# Direct connection
Client IP: 192.168.1.100

# Behind load balancer with X-Forwarded-For
X-Forwarded-For: 203.0.113.45, 192.168.1.100
Client IP: 203.0.113.45 (first IP used)

# Behind reverse proxy with X-Real-IP
X-Real-IP: 203.0.113.45
Client IP: 203.0.113.45
```

## Cabeceras de límite de velocidad
<a name="ba-runtime-rate-limiting-headers"></a>

Cuando `includeHeaders` está habilitada, se agregan los siguientes encabezados a las respuestas HTTP:

**Límite X RateLimit**  
El límite máximo de tarifa para el cliente (solicitudes por minuto)

**X- RateLimit -Restante**  
El número de solicitudes que quedan en la ventana de límite de velocidad actual

**X- RateLimit -Restablecer**  
Hora a la que se restablece la ventana de límite de velocidad (marca de tiempo de Unix)

### Ejemplos de encabezados de respuesta
<a name="ba-runtime-rate-limiting-headers-example"></a>

```
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 847
X-RateLimit-Reset: 1640995200
```

### Se ha superado el límite de velocidad de respuesta
<a name="ba-runtime-rate-limiting-headers-exceeded"></a>

Cuando se supera el límite de velocidad, el sistema devuelve:

**Estado HTTP**  
429 Demasiadas solicitudes

**Contenido-Tipo**  
application/json

**Retry-After**  
Número de segundos de espera antes de volver a intentarlo

```
{
  "error": "Rate limit exceeded",
  "message": "Too many requests. Try again later.",
  "retryAfter": 60,
  "timestamp": 1640995140000
}
```

## Administración de la memoria
<a name="ba-runtime-rate-limiting-memory"></a>

El sistema de limitación de velocidad gestiona automáticamente la memoria para evitar fugas en aplicaciones de larga duración:

**Limpieza automática**  
+ Se ejecuta cada minuto `cleanupIntervalMinutes`
+ Elimina los cubos que no se hayan utilizado durante horas `bucketExpiryHours`
+ Registra la actividad de limpieza para su supervisión

**Eficiencia de la memoria**  
+ Utiliza estructuras de datos simultáneas para garantizar la seguridad de los subprocesos
+ Creación de cubos diferidos (solo cuando es necesario)
+ Implementación eficiente de un depósito de fichas

### Supervisión de la actividad de limpieza
<a name="ba-runtime-rate-limiting-memory-monitoring"></a>

Compruebe los registros para ver los mensajes de limpieza:

```
INFO  RateLimitingService - Cleaned up 15 expired rate limiting buckets
```