Análisis de registros de Linux

Hay una gran cantidad de información almacenada dentro de sus registros de Linux, pero el desafío es saber cómo extraerla. Hay una serie de herramientas que puede utilizar para hacerlo, desde herramientas de línea de comandos hasta herramientas de análisis más avanzadas capaces de buscar en campos específicos, calcular resúmenes, generar gráficos y mucho más.

En esta sección, le mostraremos cómo utilizar algunas de estas herramientas y cómo las soluciones de gestión de registros como SolarWinds® Loggly® pueden ayudar a automatizar y agilizar el proceso de análisis de registros.

Búsqueda con Grep

Una de las formas más sencillas de analizar los registros es realizar búsquedas en texto plano utilizando grep. grep es una herramienta de línea de comandos que puede buscar texto coincidente en un archivo o en la salida de otros comandos. Se incluye por defecto en la mayoría de las distribuciones de Linux y también está disponible para Windows y Mac.

Para realizar una búsqueda simple, introduzca su cadena de búsqueda seguida del archivo que desea buscar. Aquí, buscamos en el registro de autenticación líneas que contengan «user hoover».

$ grep "user hoover" /var/log/auth.logpam_unix(sshd:session): session opened for user hoover by (uid=0)pam_unix(sshd:session): session closed for user hoover

Nota que esto devuelve líneas que contienen la coincidencia exacta. Esto lo hace útil para búsquedas en las que sabes exactamente lo que estás buscando.

Expresiones regulares

Una expresión regular (o regex) es una sintaxis para encontrar ciertos patrones de texto dentro de un archivo. Las expresiones regulares son mucho más flexibles que las búsquedas de texto plano, ya que le permiten utilizar una serie de técnicas más allá de la simple coincidencia de cadenas. Permiten un alto grado de control, pero construir un patrón preciso puede ser difícil.

Por ejemplo, digamos que queremos encontrar intentos de autenticación en el puerto 4792. La simple búsqueda de «4792» coincidiría con el puerto, pero también podría coincidir con una marca de tiempo, una URL u otro número. En este caso, coincidió con un registro de Apache que casualmente tenía 4792 en la URL.

$ grep "4792" /var/log/auth.logAccepted password for hoover from 10.0.2.2 port 4792 ssh274.91.21.46 - - "GET /scripts/samples/search?q=4792HTTP/1.1" 404 545 "-" "-”

Para evitar esto, podríamos utilizar una regex que sólo devolviera instancias de 4792 precedidas por «port» y un espacio vacío. Hacemos esto usando una técnica conocida como lookbehind positivo. Nuestra expresión tiene el siguiente aspecto (la bandera -P indica que estamos utilizando la sintaxis de expresiones regulares de Perl).

$ grep -P "(?<=port\s)4792" /var/log/auth.logAccepted password for hoover from 10.0.2.2 port 4792 ssh2

Búsqueda envolvente

El uso de la búsqueda envolvente devuelve un número de líneas antes o después de una coincidencia. Esto proporciona un contexto para cada evento, permitiéndole rastrear los eventos que condujeron o siguieron inmediatamente al evento. La bandera -B especifica cuántas líneas se devolverán antes del evento, y la bandera -A especifica el número de líneas después.

Por ejemplo, busquemos intentos de inicio de sesión con un nombre de usuario no válido y mostremos los resultados circundantes. Vemos que los usuarios que no logran iniciar sesión también fallan en la comprobación del mapeo inverso. Esto significa que el cliente no tiene un registro DNS inverso válido, lo que es común con las conexiones públicas de Internet. Esto no significa que su servidor SSH sea vulnerable, pero podría significar que los atacantes están tratando activamente de obtener acceso a él.

$ grep -B 3 -A 2 'Invalid user' /var/log/auth.logApr 28 17:06:20 ip-172-31-11-241 sshd: reverse mapping checking getaddrinfo for 216-19-2-8.commspeed.net failed - POSSIBLE BREAK-IN ATTEMPT!Apr 28 17:06:20 ip-172-31-11-241 sshd: Received disconnect from 216.19.2.8: 11: Bye Bye Apr 28 17:06:20 ip-172-31-11-241 sshd: Invalid user admin from 216.19.2.8Apr 28 17:06:20 ip-172-31-11-241 sshd: input_userauth_request: invalid user admin Apr 28 17:06:20 ip-172-31-11-241 sshd: Received disconnect from 216.19.2.8: 11: Bye Bye 

Tail

Tail es otra herramienta de línea de comandos que puede mostrar los últimos cambios de un archivo en tiempo real. Esto es útil para monitorear procesos en curso, como reiniciar un servicio o probar un cambio de código. También puede utilizar tail para imprimir las últimas líneas de un archivo, o emparejarlo con grep para filtrar la salida de un archivo de registro.

$ tail -f /var/log/auth.log | grep 'Invalid user'Apr 30 19:49:48 ip-172-31-11-241 sshd: Invalid user ubnt from 219.140.64.136Apr 30 19:49:49 ip-172-31-11-241 sshd: Invalid user admin from 219.140.64.136

Una introducción completa sobre grep y las expresiones regulares está fuera del alcance de esta guía, pero puedes encontrar más recursos al final de esta sección.

parse

Cut

El comando cut te permite analizar los campos de los registros delimitados. Los delimitadores son caracteres como signos de igualdad o comas que rompen los campos o los pares clave-valor.

Digamos que queremos analizar el usuario de este registro.

pam_unix(su:auth): authentication failure; logname=hoover uid=1000 euid=0 tty=/dev/pts/0 ruser=hoover rhost= user=root

Podemos utilizar el comando cut así para obtener la octava coincidencia. Este ejemplo es en un sistema Ubuntu.

$ grep "authentication failure" /var/log/auth.log | cut -d '=' -f 8root

Filtrado y análisis con Awk

El filtrado te permite buscar en un valor de campo específico en lugar de hacer una búsqueda de texto completo. Esto hace que su análisis de registro sea más preciso porque ignorará las coincidencias no deseadas de otras partes del mensaje de registro. Para buscar en un valor de campo, es necesario analizar primero los registros, o al menos tener una forma de buscar basada en la estructura del evento. Para hacer esto, podemos usar awk.

Awk es una poderosa herramienta de línea de comandos que proporciona un completo lenguaje de scripting, para que puedas filtrar y analizar los campos de manera más efectiva. Por ejemplo, digamos que queremos extraer el nombre de usuario de todos los intentos fallidos de inicio de sesión. Nuestros registros tienen el siguiente formato.

Mar 24 08:28:18 ip-172-31-11-241 sshd: input_userauth_request: invalid user guest 

Así es como se puede utilizar el comando awk. Primero, usamos la expresión regular /sshd.*invalid user/ para que coincida con las líneas de usuarios inválidos de sshd. Luego imprimimos el noveno campo usando el delimitador por defecto (un carácter de espacio) usando { print $9 }. Esto da salida a los nombres de usuario.

$ awk '/sshd.*invalid user/ { print $9 }' /var/log/auth.logguest

Filtrado de errores con Awk

Una de las cosas más comunes que la gente quiere ver en sus registros son los errores. Desafortunadamente, la configuración de syslog por defecto no muestra la gravedad de los errores directamente, lo que hace difícil filtrarlos.

Hay dos maneras de resolver este problema. En primer lugar, puede modificar su configuración de rsyslog para mostrar la gravedad en el archivo de registro para que sea más fácil de leer y buscar. En su configuración de rsyslog puede añadir una plantilla con pri-texto como la siguiente.

"<%pri-text%> : %timegenerated%,%HOSTNAME%,%syslogtag%,%msg%n"

Este ejemplo le da salida en el siguiente formato. Puedes ver que la severidad en este mensaje es «err»:

<authpriv.err> : Mar 11 18:18:00,hoover-VirtualBox,su:, pam_authenticate: Authentication failure

Puedes usar awk para buscar sólo los mensajes de error. En este ejemplo, incluimos una sintaxis circundante para que coincida con este campo específicamente.

$ awk '/.err>/ {print}' /var/log/auth.log<authpriv.err> : Mar 11 18:18:00,hoover-VirtualBox,su:, pam_authenticate: Authentication failure

Aunque las herramientas de línea de comandos son útiles para realizar búsquedas rápidas en archivos pequeños, no se adaptan bien a archivos grandes o a varios sistemas. Los sistemas de gestión de registros son mucho más eficaces para buscar rápidamente en grandes volúmenes de datos de registro. Hablaremos de los sistemas de gestión de registros en la siguiente sección.

Búsqueda con sistemas de gestión de registros

Los sistemas de gestión de registros simplifican el proceso de análisis y búsqueda de grandes colecciones de archivos de registro. Pueden analizar automáticamente los formatos de registro más comunes, como los eventos syslog, los registros SSH y los registros del servidor web. También indexan cada campo para poder buscar rápidamente en gigabytes o incluso terabytes de datos de registro. Suelen utilizar lenguajes de consulta como Apache Lucene para ofrecer búsquedas más flexibles que grep con una sintaxis de búsqueda más sencilla que regex. Esto ahorra tiempo y esfuerzo, ya que no tiene que crear su propia lógica de análisis para cada búsqueda única.

Por ejemplo, aquí estamos recopilando registros de un servidor Debian utilizando SolarWinds® Loggly®, un servicio de gestión de registros basado en la nube. Aquí hay un ejemplo de mensaje de registro de sshd, que analiza automáticamente el campo de usuario.

Un intento de inicio de sesión fallido analizado por Loggly.

También se puede hacer un parsing personalizado para formatos no estándar. Usando campos derivados, podemos analizar la parte no analizada del mensaje definiendo su diseño. Esto nos permite indexar cada campo individual en los datos no analizados en lugar de tratarlos como una sola cadena. Por ejemplo, podemos crear un nuevo campo llamado «auth_stage» y utilizarlo para almacenar la etapa del proceso de autenticación en la que se produjo el error, que en este ejemplo es «preauth».

Visualización de un campo derivado en el explorador de campos de Loggly.

Filtrar sobre errores con sistemas de gestión de registros

Los sistemas de gestión de registros facilitan el filtrado sobre errores ya que analizan automáticamente los registros por nosotros. En muchos casos, basta con hacer clic en el campo deseado e introducir un valor para filtrar los registros resultantes. Por ejemplo, podemos ver los errores en Loggly haciendo clic en el campo de severidad del syslog y seleccionando «Error».

Filtrado en mensajes de syslog con severidad «Error» en SolarWinds Loggly.

¡Grep y expresiones regulares! (Ryans Tutorials)

Guía del usuario de GNU Awk (GNU)

Usando Grep + Regex (Expresiones regulares) para buscar texto en Linux (DigitalOcean)

Verlo. Analizarlo. Inspeccionarlo. Resuélvelo

Ve lo que importa.

Comienza la prueba gratuita

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *