Analisando Registos Linux

Há muita informação armazenada nos seus registos Linux, mas o desafio é saber como extraí-la. Há várias ferramentas que pode utilizar para o fazer, desde ferramentas de linha de comando até ferramentas analíticas mais avançadas capazes de pesquisar em campos específicos, calcular resumos, gerar gráficos, e muito mais.

Nesta secção, mostrar-lhe-emos como utilizar algumas destas ferramentas, e como as soluções de gestão de logs como SolarWinds® Loggly® podem ajudar a automatizar e racionalizar o processo de análise de logs.

Procura com Grep

Uma das formas mais simples de analisar os registos é realizando pesquisas com texto simples usando o grep. grep é uma ferramenta de linha de comando que pode procurar texto correspondente num ficheiro, ou na saída de outros comandos. Está incluído por defeito na maioria das distribuições Linux e está também disponível para Windows e Mac.

Para efectuar uma pesquisa simples, introduza a sua sequência de pesquisa seguida do ficheiro que pretende pesquisar. Aqui, pesquisamos o registo de autenticação por linhas contendo “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 isto retorna linhas contendo a correspondência exacta. Isto torna-o útil para pesquisas onde se sabe exactamente o que se procura.

Expressões Regulares

Uma expressão regular (ou regex) é uma sintaxe para encontrar certos padrões de texto dentro de um ficheiro. As expressões regulares são muito mais flexíveis do que as pesquisas de texto simples, permitindo-lhe usar uma série de técnicas para além da simples correspondência de strings. Permitem um elevado grau de controlo, mas construir um padrão preciso pode ser difícil.

Por exemplo, digamos que queremos encontrar tentativas de autenticação na porta 4792. A simples procura de “4792” corresponderia à porta, mas também poderia corresponder a um carimbo de data/hora, URL, ou outro número. Neste caso, corresponderia a um registo Apache que por acaso tinha 4792 no 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 isto, poderíamos usar um regex que apenas devolvesse instâncias de 4792 precedidas por “porto” e um espaço vazio. Fazemo-lo utilizando uma técnica conhecida como “lookbehind positivo”. A nossa expressão tem este aspecto (a bandeira -P indica que estamos a utilizar a sintaxe de expressão regular Perl).

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

Surround Search

Utilizar a busca em redor retorna um número de linhas antes ou depois de uma correspondência. Isto fornece o contexto para cada evento, permitindo-lhe rastrear os eventos que conduziram ao evento ou que o seguiram imediatamente. A bandeira -B especifica quantas linhas devem retornar antes do evento, e a bandeira -A especifica o número de linhas após.

Por exemplo, vamos procurar por tentativas de logins com um nome de utilizador inválido e mostrar os resultados circundantes. Vemos que os utilizadores que não conseguirem iniciar sessão também falham a verificação do mapeamento inverso. Isto significa que o cliente não tem um registo DNS invertido válido, o que é comum nas ligações públicas à Internet. Isto não significa que o seu servidor SSH seja vulnerável, mas pode significar que os atacantes estão activamente a tentar obter acesso ao mesmo.

$ 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 é outra ferramenta de linha de comando que pode exibir as últimas alterações de um ficheiro em tempo real. Isto é útil para monitorizar processos em curso, tais como reiniciar um serviço ou testar uma alteração de código. Pode também utilizar a cauda para imprimir as últimas linhas de um ficheiro, ou emparelhá-lo com grep para filtrar a saída de um ficheiro de registo.

$ 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

Uma introdução completa sobre grep e expressões regulares está fora do âmbito deste guia, mas pode encontrar mais recursos no final desta secção.

parse

Cut

O comando cut permite-lhe analisar os campos dos registos delimitados. Delimitadores são caracteres como sinais iguais ou vírgulas que quebram campos ou pares de valores chave.

Digamos que queremos analisar o utilizador a partir deste log.

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

Podemos usar o comando cut como este para obter a oitava partida. Este exemplo está num sistema Ubuntu.

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

Filtragem e Parsing With Awk

Filtragem permite pesquisar num valor de campo específico em vez de fazer uma pesquisa de texto completo. Isto torna a sua análise de registo mais precisa porque irá ignorar correspondências indesejadas de outras partes da mensagem de registo. A fim de pesquisar num valor de campo, precisa de analisar os seus registos primeiro, ou pelo menos ter uma forma de pesquisa baseada na estrutura do evento. Para tal, podemos usar awk.

Awk é uma poderosa ferramenta de linha de comando que fornece uma linguagem de script completa, para que possa filtrar e analisar os campos de forma mais eficaz. Por exemplo, digamos que queremos extrair o nome de utilizador de todas as tentativas de login falhadas. Os nossos registos têm o seguinte formato.

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

Aqui está como se pode usar o comando awk. Primeiro, utilizamos a expressão regular /sshd.*invalid user/ para corresponder às linhas de utilizador inválidas sshd. Em seguida, imprimir o nono campo utilizando o delimitador padrão (um carácter de espaço) usando { imprimir $9 }. Isto produz os nomes de utilizador.

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

Filtragem de erros com Awk

Uma das coisas mais comuns que as pessoas querem ver nos seus registos são erros. Infelizmente, a configuração padrão do syslog não produz directamente a gravidade dos erros, tornando difícil filtrar neles.

Existem duas maneiras de resolver este problema. Em primeiro lugar, pode modificar a configuração do seu rsyslog para que a gravidade saia no ficheiro de registo para facilitar a sua leitura e pesquisa. Na sua configuração do rsyslog pode adicionar um modelo com texto pri-text como o seguinte.

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

Este exemplo dá-lhe a saída no seguinte formato. Pode ver que a gravidade nesta mensagem é “err”:

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

Pode usar awk para procurar apenas as mensagens de erro. Neste exemplo, estamos a incluir alguma sintaxe envolvente para corresponder especificamente a este campo.

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

Embora as ferramentas de linha de comando sejam úteis para buscas rápidas em ficheiros pequenos, não escalam bem para ficheiros grandes ou em múltiplos sistemas. Os sistemas de gestão de registos são muito mais eficazes na pesquisa rápida através de grandes volumes de dados de registo. Discutiremos sistemas de gestão de registo na próxima secção.

Procura com sistemas de gestão de registo

Sistemas de gestão de registo simplificam o processo de análise e pesquisa de grandes colecções de ficheiros de registo. Podem analisar automaticamente os formatos comuns de registo como eventos syslog, registos SSH, e registos de servidores Web. Também indexam cada campo para que se possa pesquisar rapidamente através de gigabytes ou mesmo terabytes de dados de registo. Usam frequentemente linguagens de consulta como o Apache Lucene para fornecer pesquisas mais flexíveis do que o grep com uma sintaxe de pesquisa mais fácil do que o regex. Isto poupa tempo e esforço, uma vez que não tem de criar a sua própria lógica de análise para cada pesquisa única.

Por exemplo, aqui estamos a recolher logs de um servidor Debian usando SolarWinds® Loggly®, um serviço de gestão de logs baseado na nuvem. Aqui está um exemplo de mensagem de registo do sshd, que analisa automaticamente o campo do utilizador.

Uma tentativa de registo falhada analisada por Loggly.

P>Pode também fazer análises personalizadas para formatos não-padronizados. Usando campos derivados, podemos analisar a porção da mensagem que não foi analisada, definindo a sua disposição. Isto permite-nos indexar cada campo individual nos dados não-desmembrados em vez de o tratarmos como uma única cadeia de caracteres. Por exemplo, podemos criar um novo campo chamado “auth_stage” e usá-lo para armazenar a fase no processo de autenticação onde o erro ocorreu, que neste exemplo é “preauth”.

Visualização de um campo derivado no Explorador de Campo de Loggly.

Filtragem de erros com sistemas de gestão de logs

Os sistemas de gestão de logs facilitam a filtragem de erros uma vez que analisam automaticamente os logs para nós. Em muitos casos, pode simplesmente clicar no campo desejado e introduzir um valor para filtrar os registos resultantes. Por exemplo, podemos ver erros em Loggly clicando no campo de gravidade do syslog e seleccionando “Error”.

Filtragem em mensagens syslog com gravidade “Error” em SolarWinds Loggly.

Grep e Expressões regulares! (Ryans Tutorials)

O Guia do Utilizador GNU Awk (GNU)

Utilizar Grep + Regex (Expressões Regulares) para Pesquisar Texto em Linux (DigitalOcean)

Veja-o. Analisá-lo. Inspeccioná-lo. Resolva-o

Ver o que interessa.

INICIAR TESTE GRATUITO

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *