Alerting: Ejemplo de reglas de EPL avanzado

Document created by RSA Information Design and Development on Feb 9, 2017
Version 1Show Document
  • View in full screen mode
  

Los siguientes son ejemplos de reglas avanzadas de ESA. Cada ejemplo tiene varias formas de implementar el mismo caso de uso.

Ejemplo n.º 1: 

Cree una cuenta de usuario y elimine la misma cuenta de usuario en 300 s. La información del usuario se almacena en los metadatos user_src.

EPL n.º 1:

                     
Nombre de la reglaCreateuseraccountFollowedbyDeletionof Useraccount1
Descripción de la reglaCreación de una cuenta de usuario seguida de una acción para eliminar la misma cuenta de usuario en 300 segundos.
Código de la regla

SELECT * FROM Event(ec_subject='User'
                    AND ec_outcome='Success'
                    AND user_src is NOT NULL
                    AND ec_activity IN ('Create', 'Delete')
                   ).win:time(300 seconds)

match_recognize (partition by user_src
                measures C as c, D as d
                 pattern (C D)
                 define
                 C as C.ec_activity='Create' ,
                 D as D.ec_activity='Delete');

Nota
  • Filtre eventos necesarios para el patrón en el intervalo de tiempo dado. Las condiciones de filtrado solo deben requerir que se transmitan eventos a la función de reconocimiento de coincidencias. En este caso son crear y eliminar la cuenta de usuario Eventos. Es decir, Event(ec_subject='User' AND ec_outcome='Success' AND user_src is NOT NULL AND ec_activity IN ('Create', 'Delete')
  • Partición mediante la creación de agrupaciones. En este caso, Esper crea depósitos por valor de user_src. Por lo tanto, el valor de user_src es común entre ambos eventos.
  • Defina el patrón que desea. Actualmente está configurado para Crear y luego eliminar. Puede ejecutar varias veces Crear y luego eliminar (C + D). El patrón es muy similar a una expresión regular.
  • Caso de uso más eficiente.

EPL n.º 2:

                     
Nombre de la reglaCreateuseraccountFollowedbyDeletionof Useraccount2
Descripción de la reglaCreación de una cuenta de usuario seguida de una acción para eliminar la misma cuenta de usuario en 300 segundos.
Código de la regla

SELECT * from pattern[every (a= Event(ec_subject='User' AND ec_outcome='Success' AND user_dst is NOT NULL AND ec_activity IN ('Create'))

 ->

( Event(ec_subject='User' AND ec_outcome='Success' AND user_dst is NOT NULL AND ec_activity IN ('Create') AND user_src = a.user_src)
) )where timer:within(300 Sec) ]; 
Nota
  • Digamos que se crea el mismo usuario dos veces y se elimina una vez en ese orden. En ese caso, el patrón anterior activará dos alertas.
  • Se crea un hilo de ejecución para cada creación de usuario.
  • No hay forma de controlar los hilos de ejecución. Es importante tener bonos de tiempo y preferentemente intervalos cortos.

Ejemplo n.º 2: 

Detecte el patrón donde se crea el usuario, el mismo usuario inicia sesión y, finalmente, el usuario se elimina. En caso de que Windows registre información del usuario, esta se almacena en user_dst o user_src según el evento.

user_src(create) = user_dst(Login) = user_src(Delete)

EPL n.º 3:

                     
Nombre de la reglaCreateUserLoginandDeleteUser
Descripción de la reglaDetección de un patrón en el cual un usuario crea una cuenta de usuario, seguida del inicio de sesión del mismo usuario y la posterior eliminación de la cuenta de usuario. 
Código de la regla       

SELECT * FROM Event(ec_subject='User'
                    and ec_activity in ('Create','Logon','Delete')
                    and ec_theme in ('UserGroup', 'Authentication')
                    and ec_outcome='Success'
                   ).win:time(300 seconds)
match_recognize (measures C as c, L as l, D as d
                 pattern (C L D)
                 define
                 C as C.ec_activity = 'Create',
                 L as L.ec_activity = 'Logon' AND L.user_dst = C.user_src,
                 D as D.ec_activity = 'Delete' AND D.user_src = C.user_src
                );

Nota
  • Debido a que user_src/user_dst es no es común en todos los eventos, no podemos usar la partición. Será una sola agrupación que ejecuta un patrón por vez. Por ejemplo, para el usuario 1 y 2 si el flujo de eventos es C1C2L1D1, C1L1C2D1, no habrá alerta debido a que el hilo de ejecución C2 restableció C1. La alerta se activará solo si C1L1D1 está en orden y no hay otro evento entremedio, ya sea del mismo usuario o de otro. 
  • Otra solución sería usar la ventana con nombre y combinar user_dst con user_src en una única columna y, a continuación, ejecutar el reconocimiento de coincidencias. (EPL n.º 3). 
  • También se puede usar el patrón. Es posible que obtenga más alertas de lo esperado. (EPL n.º4).

EPL n.º 4: Uso de NamedWindows y reconocimiento de coincidencias

                  
Nombre de la reglaCreateUserLoginandDeleteUser
Descripción de la reglaDetección de un patrón en el cual un usuario crea una cuenta de usuario, seguida del inicio de sesión del mismo usuario y la posterior eliminación de la cuenta de usuario. 
Código de la regla

@Name('NormalizedWindow')
create window FilteredEvents.win:time(300 sec) 
(user String, ecactivity string, sessionid Long);

@Name('UsersrcEvents') 
Insert into FilteredEvents 
select user_src as user, ec_activity as ecactivity, sessionid from Event(
ec_subject='User' and ec_activity in ('Create','Delete') and ec_theme in ('UserGroup', 'Authentication') and ec_outcome='Success' and user_src is not null );

@Name('UsrdstEvents') 
Insert into FilteredEvents 
select user_dst as user, ec_activity 

as ecactivity, sessionid from Event(
ec_subject='User' and ec_activity in (Logon’) and ec_theme in ('UserGroup', 'Authentication') and ec_outcome='Success' and user_dst is not null 
);

@Name('Pattern')

@RSAAlert(oneInSeconds=0, identifiers={"user"})


select * from FilteredEvents
     
  match_recognize (

         partition by user

         measures C as c, L as l, D as d
         pattern (C L+D)

         define 
C as C.ecactivity= ‘Create’,
                
L as L.ecactivity= ‘Logon’,
                D as D.ecactivity=’Delete’
                 );

EPL n.º 5: Uso cada @RSAAlert(oneInSeconds=0, identifiers={"user_src"})

SELECT a.time as time,a.ip_src as ip_src,a.user_dst as user_dst,a.ip_dst as ip_dst,a.alias_host as alias_host from pattern[every (a=Event (ec_subject='User' and ec_activity='Create' and ec_theme='UserGroup' and ec_outcome='Success') ->  (Event(ec_subject='User' and ec_activity='Logon' and ec_theme='Authentication' and user_src=a.user_dst) -> b=Event(ec_subject='User' and ec_activity='Delete' and ec_theme='UserGroup' and user_dst=a.user_dst))) where timer:within(300 sec)];

               
Nombre de la reglaCreateUserLoginandDeleteUser
Descripción de la reglaDetección de un patrón en el cual un usuario crea una cuenta de usuario, seguida del inicio de sesión del mismo usuario y la posterior eliminación de la cuenta de usuario. 

Ejemplo n.º 3:

Exceso de errores al iniciar sesión desde el mismo IP de origen 

EPL n.º 6: @RSAAlert(oneInSeconds=0, identifiers={"ip_src"})

                      
Nombre de la reglaExcessLoginFailure
Descripción de la reglaEl mismo usuario intentó iniciar sesión desde la misma dirección IP de origen y recibió errores al iniciar sesión 
Código de la regla

SELECT * FROM
         Event(
         ip_src IS NOT NULL AND ec_activity=’Logon’ AND ec_outcome = ‘Failure’ ).std:groupwin(ip_src).win:time_length_batch(300 sec, 10) GROUP BY ip_src HAVING COUNT(*) = 10;
    

Nota
  • Crea una ventana por ip_src
  • Usa time_length_batch: Puede ver eventos en lotes (ventana extensible). Cada evento será parte de solo una ventana. La ventana libera eventos cuando transcurre el tiempo o cuando se alcanza el conteo.
  • Uno de los problemas con las ventanas extensibles es que es posible que los eventos que ocurren cerca del final del lote no activen una alerta.

En la secuencia de eventos a continuación en t=301, incluso cuando se produjeron diez fallas de inicio de sesión para el mismo inicio de sesión en los últimos 300 segundos, no hubo una alerta porque el lote de eventos se descartó en t=300

                                                                         
Hora tFallas de inicio de sesión para usuarios específicosAlertaLote de tiempo
0001
295601
299301
301102
420602
550302
600003
720603
850303
900113 finaliza y comienza 4
  • El problema anterior se puede solucionar con ventanas win:time (EPL#7) en lugar de ventanas win:time_length_batch.

  • Agrupar exteriormente por es para controlar eventos cuando transcurre el tiempo. Por ejemplo, tiene nueve eventos con un fin de 60 segundos, el motor Esper enviará esos nueve eventos al oyente. Agrupar por y conteo lo restringirán debido a que el conteo no es igual a 10.

  • La hora y el conteo se pueden modificar según sea necesario.

EPL n.º 7: @RSAAlert(oneInSeconds=0, identifiers={"ip_src"})

                     
Nombre de la reglaExcessLoginFailure
Descripción de la reglaEl mismo usuario intentó iniciar sesión desde la misma dirección IP de origen y recibió errores al iniciar sesión 
Código de la regla

SELECT * FROM
                  Event(
           ip_src IS NOT NULL AND ec_activity=’Logon’ AND ec_outcome = ‘Failure’ 
  ).std:groupwin(ip_src).win:time (300 sec) GROUP BY ip_src HAVING COUNT(*) = 10

Nota
  • Esta es una ventana deslizante y, por lo tanto, una vez que se activa la alarma para un conjunto de eventos, se pueden utilizar para otra alerta además de hasta que haya pasado el tiempo.
  • Si hubiera diez eventos implicados en la activación de la alerta, solo aparecerá el último evento
  • Si usa < o >, puede ver más de una alerta. Debe usar la supresión de alertas según corresponda.

Ejemplo n.º 4:

Múltiples inicios de sesión fallidos a partir de múltiples usuarios distintos desde el mismo origen al mismo destino, un solo usuario desde múltiples orígenes distintos al mismo destino.

EPL n.º 8: Uso de groupwin , time_length_batch y unique

                     
Nombre de la reglaMultiplefailedLogins
Descripción de la reglaExisten múltiples inicios de sesión fallidos para los mismos casos:
- Desde varios usuarios desde el mismo origen al mismo destino.
- Usuarios solos desde varios orígenes al mismo destino. 
Código de la regla

SELECT * FROM 
  Event( ec_activity='Logon' AND ec_outcome='Failure'  AND  ip_src IS NOT NULL   AND  ip_dst IS NOT NULL AND  user_dst IS NOT NULL ).std:groupwin(ip_src,ip_dst).win:time_length_batch(300 seconds, 5}).std:unique(user_dst) group by ip_src,ip_dst having count(*) = 5;

Nota
  • ip.dst and ip.src es común en todos los eventos.
  • user_dst es único para todos los eventos.
  • Se activa la alerta cuando hay por lo menos cinco usuarios distintos que intentan iniciar sesión desde la misma combinación de ip.src e ip.dst.

Ejemplo n.º 5:

NoLog traffic desde un dispositivo en un marco de tiempo determinado.

EPL n.º 9: Uso de groupwin, time_length_batch y unique

                     
Nombre de la reglaNoLogTraffic
Descripción de la reglaNo se observa un tráfico de registros desde un dispositivo en un marco de tiempo determinado.
Código de la regla

SELECT * FROM pattern [every a = Event(device_ip IN ('10.0.0.0','10.0.0.1') AND medium = 32) -> (timer:interval (3600 seconds) AND NOT Event(device_ip = a.device_ip AND device_type = a.device_type AND medium = 32))];

Nota
  • La regla solo detecta una pérdida repentina de tráfico. No alertará si no hay tráfico en primer lugar. Necesita al menos 1 evento para que la regla emita una alerta.
  • Lista de direcciones IP de dispositivo o nombres de host de dispositivo como entrada. Solo se rastrearán estos sistemas.
  • Se requiere una entrada de tiempo. Se activa la alerta cuando el intervalo de tiempo entre eventos excede el tiempo de entrada.

Ejemplo n.º 6:

Múltiples inicios de sesión a los que NO les sigue un evento de bloqueo realizados por el mismo usuario.

EPL n.º 10: uso de groupwin, time_length_batch y unique

                     
Nombre de la reglaFailedloginswoLockout
Descripción de la reglaExisten múltiples inicios de sesión fallidos a los que no les sigue un evento de bloqueo realizados por el mismo usuario.
Código de la regla

SELECT * FROM pattern 
[every-distinct(a.user_dst, a.device_ip, 1 msec) (a= Event(ec_activity='Logon' and ec_outcome='Failure' and user_dst IS NOT NULL)
-> [2]( Event( device_ip =a.device_ip and ec_activity='Logon' and ec_outcome='Failure' and user_dst=a.user_dst) 


AND NOT Event( ( ec_activity='Logon' and ec_outcome='Success' and device_ip = a.device_ip and user_dst=a.user_dst) or (ec_activity='Lockout' and device_ip = a.device_ip and user_dst=a.user_dst))))


where timer:within(60 seconds) -> (timer:interval(30 seconds) and not Event(device_ip=a.device_ip and user_dst=a.user_dst and ec_activity='Lockout'))
];

Nota
  • La consulta detecta la ausencia de un evento de bloqueo después de que se produzcan dos inicios de sesión fallidos por parte del mismo usuario.
  • La aparición de múltiples inicios de sesión fallidos se cronometra y se asume que sucede dentro de cierto período. Además, en la práctica, se asume que el evento de bloqueo se produce dentro de un período corto después de la aparición del último evento de inicio de sesión fallido debido a que el valor del umbral de inicios de sesión fallidos por usuario está establecido en cierto dominio.
  • En la consulta actual, cada valor distinto suprimirá el nuevo hilo de ejecución para la combinación de usuario y dispositivo para 1 milisegundo.
  • El tiempo permitido para tres inicios de sesión fallidos es de 60 segundos desde el primer intento fallido. El período de espera para que se produzca el evento de bloqueo es de 30 segundos

Nota:
1. “.” en las claves de metadatos se debe reemplazar por (“_”).
2. Todos los patrones deben tener bonos de tiempo.
3. Use las etiquetas adecuadas frente a las declaraciones
     a) @RSAPersist:
     b) @RSAAlert:

Para obtener detalles adicionales, puede consultar:

Previous Topic:Anotaciones de ESA
You are here
Table of Contents > Agregar reglas a la Biblioteca de reglas > Agregar una regla de EPL avanzado > Ejemplo de reglas de EPL avanzado

Attachments

    Outcomes