Skip to main content

Análisis de registros de eventos de seguridad

3 Tareas

20 minutos

Visible to: All users
Avanzado Pega Platform 8.3.1 Pega Platform 8.5 Pega Platform 8.6 Español

Escenario

A Front Stage le preocupa que el nombre de usuario y la contraseña de algún usuario se puedan ver comprometidos, tal vez a través de un ataque de phishing. FSG decidió hacer cumplir la restricción de que toda persona que acceda a la aplicación Booking (Reservas) deberá habilitar la geolocalización. Si la geolocalización no está habilitada, no se otorga acceso a la aplicación Booking (Reservas).

FSG quiere escribir los valores pxRequestor pxLatitude y pxLongitude de cada usuario al registrar eventos de seguridad personalizados. FSG también quiere registrar la marca de tiempo de cada evento de una manera que simplifique el cálculo de la velocidad, ya sea en millas por hora (mph) o kilómetros por hora (kph). Si la velocidad a la que el mismo usuario tendría que viajar para haber registrado dos eventos de seguridad supera el ámbito de lo posible, FSG quiere saber quién es ese usuario y dónde ocurrieron los dos eventos.

No es necesario implementar una denegación de acceso a la aplicación Booking (Reservas) si la geolocalización no está habilitada. En su lugar, idee un método para calcular de manera eficiente la velocidad entre dos eventos registrados en un archivo PegaRULES-SecurityEvent.log para el mismo usuario. Si la velocidad excede un valor razonable, genere los dos eventos.

Este reto requiere el uso de Linux Lite VM para completarlo.

Debe iniciar su propia instancia de Pega para completar este Título del desafío.

La inicialización puede demorar hasta 5 minutos. Le pedimos que tenga paciencia.

Tareas detalladas

1 Revisar el detalle de la solución

La solución a este ejercicio requiere la instalación de Apache Spark y Rumble.

2 Instalación y configuración de Apache Spark y Rumble

  1. Descargue Apache Spark con un navegador que se ejecute dentro de la máquina virtual. Según las instrucciones, mueva el archivo descargado a /usr/local/bin; para ello, ejecute el siguiente comando.

    tar zxvf spark-2.4.4-bin-hadoop2.7.tgz
    sudo mv spark-2.4.4-bin-hadoop2.7 /usr/local/bin

  2. Agregue Apache Spark a su variable de entorno PATH ejecutando el siguiente comando.

    export SPARK_HOME=/usr/local/bin/spark-2.4.4-bin-hadoop2.7
    export PATH=$SPARK_HOME/bin:$PATH

  3. Ejecute el siguiente comando para verificar los pasos.

    cd $SPARK_HOME/bin
    spark-submit –version
    cd $HOME
    spark-submit –version

  4. Use un navegador que se ejecute dentro de la máquina virtual para descargar Rumble.
  5. Cree un directorio desde donde se ejecuta Rumble (por ejemplo, $HOME/pega8/rumble).
  6. Mueva el archivo spark-rumble-1.0.jar descargado al directorio que creó.

Definir Rule-Utility-Functions en Rule-Utility-Library con el nombre Security

Security • LogCustomEventValueGroup() Void

  • Parámetros: eventType String, outcome String, message String, customFlds ClipboardProperty
  • Descripción: customFlds debe ser un valor Text ValueGroup. Llame a esta función cuando desee registrar un evento de seguridad personalizado.

Security • NumericTimestamp() String

  • Parámetros: unit String, valores permitidos = "h", "m", "s"
  • Descripción: devuelve la marca de tiempo actual en unidades de horas, minutos o segundos como una cadena.

Anular el punto de extensión FSG-Booking-Work OpenDefaults

OpenDefaults

Habilitar el registro de eventos de seguridad personalizados y geolocalización

El navegador Chrome no admite solicitudes de geolocalización a menos que el servidor esté protegido. Chrome permite solicitudes de geolocalización dentro de una máquina virtual Linux si su dirección IP está asignada al nombre localhost.

Ejemplo:

pega8@Lubuntu1:~$ more /etc/hosts
192.168.118.145 localhost
127.0.0.1 localhost
127.0.1.1 Lubuntu1

  1. Ingrese la dirección IP ifconfig como la primera entrada para localhost.
  2. Pruebe ejecutando ping localhost.

    La regla de decisión pyGeolocationTrackingIsEnabled debe devolver un valor true.

    La regla de decisión que se aplica a Data-Portal muestra la siguiente ventana emergente después de iniciar sesión.
Location access
  1. Haga clic en Allow Location Access (Permitir acceso a la ubicación).
  2. Verifique el conjunto de pxLatitude y pxLongitude dentro de la página pxRequestor en su Portapapeles.
  3. Tip: Para mejores resultados, use Firefox como navegador.
  4. Haga clic en Security > Tools > Security > Security Event Configuration (Seguridad > Herramientas > Seguridad > Configuración de eventos de seguridad) para iniciar la landing page Security Event Configuration.
  5. En la parte inferior de la landing page, haga clic en ON para habilitar eventos personalizados.
  6. Haga clic en Submit (Enviar).
    Custom event
  7. Abra un caso de evento para su revisión y marque pyWorkPage en el Portapapeles o Trace OpenDefaults para ver los valores del grupo de valores de texto customFlds, como se muestra en la siguiente imagen.
    Custom fields
  8. Haga clic en System > Operations > Logs (Sistema > Operaciones > Registros).
  9. A la derecha de SECURITYEVENT, haga clic en el enlace Text , haga clic en Log Files.
  10. Si se le solicita, ingrese el nombre de usuario admin y la contraseña admin.
  11. Abra el archivo SecurityEvent.log para ver si se han registrado los valores de customFlds.

Quitar comillas alrededor de valores numéricos (necesario para el formato JSON)

Use estos pasos para eliminar las comillas situadas alrededor de los valores numéricos (haga clic aquí para ver la fuente).

  1. Copie y pegue el texto que desea que examine la expresión regular.
  2. Reemplace cada valor numérico con (-?[0-9]*\.[0-9]*) si el valor puede ser negativo, o ([0-9]*\.[0-9]*) si el valor no puede ser negativo.
  3. Use \1, \2, etc., para especificar qué valor analizado va dónde.
Nota: No es necesario que una barra separe la cláusula find de la cláusula replace. Cualquier carácter que se muestre después de la "s" inicial se convierte en el delimitador de la instrucción. La declaración debe terminar con ese delimitador y se debe usar en el medio de la declaración al separar find de replace.
ANTES DE text.txt
{"id":"25538d8d-2861-40a9-b6df-d289e4b73a7e","eventCategory":"Custom event","eventType":"FooBla","appName":"Booking","tenantID":"shared","ipAddress":"127.0.0.1","timeStamp":"Mon 2019 Aug 05, 19:31:42:060","operatorID":"Admin@Booking","nodeID":"ff9ef7835fd4906aea82694c981938d0","outcome":"Fail","message":"FooBla failed","requestorIdentity":"20190805T192510","lon":"-98.0315889","lat":"30.123275"}
cat text.txt | sed -r 's/"lon":"(-?[0-9]*\.[0-9]*)","lat":"(-?[0-9]*\.[0-9]*)"}/"lon":\1,"lat":\2}/'
DESPUÉS DE text.txt
{"id":"25538d8d-2861-40a9-b6df-d289e4b73a7e","eventCategory":"Custom event","eventType":"FooBla","appName":"Booking","tenantID":"shared","ipAddress":"127.0.0.1","timeStamp":"Mon 2019 Aug 05, 19:31:42:060","operatorID":"Admin@Booking","nodeID":"ff9ef7835fd4906aea82694c981938d0","outcome":"Fail","message":"FooBla failed","requestorIdentity":"20190805T192510","lon":-98.0315889,"lat":30.123275}

Reemplace las líneas nuevas dentro de un archivo completo, no una línea cada vez

Si existen nuevas líneas en un archivo leído por un script Unix, cada línea se procesa individualmente. Debe tratar todo el archivo como una sola cadena grande y luego reemplazar las nuevas líneas dentro de esa cadena (haga clic aquí para ver la fuente).

La salida del comando newline-removing sed se canaliza nuevamente a sed, esta vez para reemplazar: }{ with: }{

sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g' PegaRULES-SecurityEvent.log | sed 's/} {/},{/g'

Tenga un archivo, test2.jq, que actúe como el inicio de la consulta, incluido el corchete izquierdo de la matriz JSON: let $log := [

Tenga un segundo archivo, restof_test1.jq, que contenga el final de la consulta JSONiq que comienza en el corchete derecho de la matriz JSON.

  1. El script inicializa un nuevo archivo de consulta usando > test2.jq.
  2. Luego, se generan los comandos sed consecutivos usando >> test2.jq
  3. A continuación, se agrega restof_test1.jq usando >> test2.jq.
JSONLogToArray.sh
#!/usr/bin/env bash
set -x

echo "let \$log := [" > test2.jq

cat PegaRULES-SecurityEvent.log
| sed -r 's/"lon":"(-?[0-9]*\.[0-9]*)"/"lon":\1/' \
| sed -r 's/"lat":"(-?[0-9]*\.[0-9]*)"/"lat":\1/' \
| sed -r 's/"ts":"([0-9]*\.[0-9]*)"/"ts":\1/' \
| sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g' \ | sed 's/} {/},{/g' >> test2.jq

cat restof_test1.jq >> test2.jq

Lo que resta es la consulta JSONiq (restof_test1.jq). La distancia entre dos coordenadas se calcula en millas (3958,8 es el radio de la Tierra en millas) y luego se divide por la diferencia de tiempo entre las dos entradas del archivo de registro. La marca de tiempo se calcula como horas desde el 1-1-1970 GMT.

La condición de filtro garantiza que los pares de filas solo se examinarán cuando:

  1. El valor de eventType es Open Work (consulte la anulación de FSG-Booking-Work OpenDefaults arriba).
  2. Los valores de operatorID dentro de los dos registros son idénticos.
  3. Las latitudes en ambas filas son > 20 (se usa para garantizar que ambas filas contengan coordenadas de geolocalización. Cualquier comparación puede ser suficiente).
  4. La marca de tiempo en la segunda fila está en el futuro de la marca de tiempo en la primera fila (esto evita el cálculo redundante cuando la velocidad termina siendo negativa).
restof_test1.jq
let $pi := 3.1415926
let $join :=
for $i in $log[], $j in $log[]
where $i.eventType = "Open Work"
and $i."id" != $j."id"
and $i."operatorID" = $j."operatorID"
and $i.lat>20 and $j.lat>20
and $j.ts>$i.ts
let $lat1 := $i.lat
let $lon1 := $i.lon
let $lat2 := $j.lat
let $lon2 := $j.lon
let $dlat := ($lat2 - $lat1) * $pi div 180
let $dlon := ($lon2 - $lon1) * $pi div 180
let $rlat1 := $lat1 * $pi div 180
let $rlat2 := $lat2 * $pi div 180
let $a := sin($dlat div 2) * sin($dlat div 2) + sin($dlon div 2) * sin($dlon div 2) * cos($rlat1) * cos($rlat2)
let $c := 2 * atan2(sqrt($a), sqrt(1-$a))
let $distance := $c * 3958.8
let $tdiff := $j.ts - $i.ts
let $mph := $distance div $tdiff
return { "id" : $j.id, "eventType" : $j.eventType, "distance":$distance, "mph":$mph}
return [$join]

Enviar la consulta JSONiq a Apache Spark en lugar de ejecutar comandos usando el modo shell

Idealmente, hay una manera más fácil de enviar el contenido del archivo de consulta a Apache Spark y Rumble que abriendo el archivo, seleccionando todo, copiando y pegando en la línea de comando de Rumble (haga clic aquí para obtener el origen).

  1. En lugar de: --shell yes
  2. Use: --query-path file.jq --output-path results.out
  3. En un directorio donde exista el .jar de Rumble en un sistema donde esté instalado Apache Spark, ejecute el siguiente comando:
pega8@Lubuntu1:~/rumble$ spark-submit --master local[*] --deploy-mode client spark-rumble-1.0.jar --query-path "test2.jq" --output-path "test2.out"
Ejemplo test2.out
[ { "id" : "f5b07887-11ef-4f6f-9f0f-efb060bd3cd7", "eventType" : "Open Work", "distance" : 31.6128421996284034764, "mph" : 2634.4035166357 }

El ejemplo test2.out se puede interpretar como:

Dos eventos de seguridad que se registraron uno tras otro. Para haber recorrido la distancia de 31,6 millas (50,9 km) dentro del tiempo entre el momento en que se registraron esos dos eventos de seguridad, se requiere que alguien haya viajado a una velocidad de 2634 millas por hora (4329 km/h).

3 Revisar la descarga de la solución



Disponible en la siguiente misión:

If you are having problems with your training, please review the Pega Academy Support FAQs.

¿Le ha resultado útil este contenido?

¿Quiere ayudarnos a mejorar este contenido?

We'd prefer it if you saw us at our best.

Pega Academy has detected you are using a browser which may prevent you from experiencing the site as intended. To improve your experience, please update your browser.

Close Deprecation Notice