quinta-feira, 4 de março de 2010

Monitorando redes e servidores com Nagios

Um dos melhores programas de monitoramento de hosts e serviços open source é o Nagios, essa incrível e, a princípio, complicada ferramenta. Existe muita documentação sobre o Nagios, porém poucas reúnem todo o processo, desde a instalação, configuração e testes. Por isso, depois de enfrentar dificuldades, resolvi publicar minhas descobertas.

Por: Ricardo Gavioli

Fonte: http://www.vivaolinux.com.br/artigo/Monitorando-redes-e-servidores-com-Nagios/

 

Apresentação e motivação

Muitos administradores e estudantes ouvem falar (bem) sobre o Nagios. Porém, as corretas instalações e configurações nem sempre são alcançadas, devido ao grande número de funções e serviços que o Nagios oferece. 

Depois de apanhar muito durante a instalação e, principalmente, na configuração dessa ferramenta, resolvi fazer um apanhado de todos os meus passos para chegar até um sistema de monitoramento e notificações otimizado e bem configurado. 

Preparação do ambiente

Este artigo foi estruturado utilizando:
  • Pentium 4 3.0 GHz
  • 512MB RAM
  • HD 40GB
  • Linux Debian Etch
  • Nagios 2.9
  • Apache2
Antes de iniciarmos os trabalhos com o Nagios, primeiro devemos realizar a preparação do ambiente, para que não tenhamos problemas futuros nem necessidades de recompilação. 

O Nagios é uma ferramenta para uso totalmente via Web. Por isso é importante que seu Apache esteja instalado e funcionando, assim como seu MTA (para envio das notificações). 

Para o correto funcionamento do Nagios, é importante que os seguintes pacotes estejam instalados:
  • openssl (para monitoramento de hosts remotos)
  • libssl-dev (para compilação do NRPE, explicado adiante)
  • mcrypt (criptografia de envio dos dados remotos)
  • build-essential (para compilação dos pacotes)
  • nmap (para testes das portas)
  • xinetd (para iniciar o serviço NRPE)
  • apache2 (óbvio)
  • gd (para geração dos mapas de status)
  • libjpeg e libpng (criação das imagens dos mapas)
No Debian: 

# apt-get install openssl libssl-dev mcrypt build-essential nmap xinetd apache2 libjpeg62 libjpeg-dev libpng12-0 libpng12-dev libgd2-xpm libgd2-xpm-dev fontconfig 

Pacotes Nagios

Utilizaremos nessa instalação três pacotes fornecidos no site www.nagios.org/download:
  • nagios-2.9
  • nagios-plugins-1.4.9
  • nrpe-2.8.1
Abaixo os links para download desses pacotes. Se esses links estiverem quebrados, acesse o site www.nagios.org/download e baixe a última versão destes. 

Nagios: Nagios Plugins: NRPE: Antes de começar, precisamos também criar o usuário e os diretórios que serão utilizados. 

Adicionar usuário nagios: 

# adduser nagios 

Criar o diretório de instalação: 

# mkdir /usr/local/nagios 

Acertar a permissão no diretório: 

# chown -R nagios. /usr/local/nagios 

Criar o grupo de acesso via Web: 

# groupadd nagcmd 

Definir os usuários do Apache e Nagios como integrantes desse grupo: 

# usermod -G nagcmd www-data (verifique se esse é o seu usuário do Apache2)
# usermod -G nagcmd nagios 

 

Mãos à obra

 
No diretório onde você baixou os pacotes (aconselho /root/nagios), descompacte o Nagios: 

# tar zxvf nagios-2.9.tar.gz
# cd nagios-2.9
 

Finalmente, vamos começar!!! 

Primeiro, criaremos o Makefile para instalação. Um simples "./configure" já resolve todos os problemas... mas, caso você queira alterar alguma opção, segue as opções padrão mais utilizadas: 

# ./configure --prefix=/usr/local/nagios --with-cgiurl=/nagios/cgi-bin --with-htmurl=/nagios/ --with-nagios-user=nagios --with-nagios-grp=nagios --with-gd-lib=/usr/lib --with-gd-inc=/usr/lib 

Ao final, será exibido um resumo das opções selecionadas acima. 

Agora, compilamos o Nagios: 

# make all 

Se não ocorrer nenhum erro, seguimos agora com a instalação propriamente dita. 

# make install 

Este comando criará todas as subpastas necessárias e instalará o programa principal. 

Em seguida podemos instalar os scripts de inicialização de serviço (em /etc/init.d). 

# make install-init 

Crie também os arquivos de configuração padrão de exemplo (serão muito úteis): 

# make install-config 

E por fim, para realizar algumas configurações via web e hosts remotos, acionamos o modo de comando remoto: 

# make install-commandmode 

Pronto!!! Nosso Nagios já está instalado e pronto para ser configurado. 

Mas primeiro, vamos aos plugins... 

 

Instalação dos plugins e NRPE

Plugins são os scripts que o Nagios executa (também podem ser executados manualmente) para verificar o status de um host ou serviço. Existem vários plugins neste pacote, e podemos ainda criar plugins personalizados... mas essa é uma outra história. 

Os plugins ficam, por padrão, dentro de /usr/local/nagios/libexec. 

Primeiro, descompacte o arquivo baixado: 

# tar zxvf nagios-plugins-1.4.9.tar.gz 

Agora, vamos criar o Makefile: 

# cd nagios-plugins-1.4.9
# ./configure
# make all
# make install
 

Pronto, os plugins já estão instalados e prontos para serem acessados. 

O único problema dos plugins é que a maioria deles são para uso local no servidor, para monitoramento de uso de disco, partições, usuários logados, processos, cpu, memória, etc. 

Para realizar o monitoramento desses recursos em hosts remotos (outras máquinas linux ou Unix), utilizamos o NRPE (Nagios Remote Plugin Executor). 

Para isto, não é preciso instalar o Nagios nos hosts remotos, apenas os plugins e o NRPE. 

Para instalar o NRPE, primeiro descompacte o arquivo: 

# tar zxvf nrpe-2.8.1.tar.gz 

Vamos ao Makefile: 

# ./configure 

À compilação: 

# make all 

À instalação do plugin "check_nrpe" dentro de libexec: 

# make install-plugin 

O daemon do serviço: 

# make install-daemon 

O arquivo de configuração padrão: 

# make install-daemon-config 

E a criação do serviço dentro do xinetd: 

# make install-xinetd 

Pronto. Plugin e daemon instalados, arquivo de configuração e serviço xinetd criados. 

Vamos agora apontar o número da porta no arquivo /etc/services. 

# vi /etc/services 

Insira a linha: 

nrpe 5666/tcp # NRPE

Salve e saia. Reinicie o serviço XINETD. 

# /etc/init.d/xinetd restart 

Pronto, o NRPE já está, ou deveria estar rodando. 

Para testar, utilize: 

# nmap localhost -p 5666 

Se retornar o status 5666/tcp open, o NRPE está rodando. Se o status estiver como closed, verifique a configuração do serviço nrpe no xinetd está como disable = no. 

Nos clientes

Para fazer a instalação nos hosts remotos, altere também o serviço no xinetd, para permitir a conexão do Nagios Server ao NRPE: 

# vi /etc/xinetd.d/nrpe 

Altere a linha: 

only from = 127.0.0.1 

para 

only from = 127.0.0.1 <ip_nagios_server>

Salve e saia. Reinicie o serviço XINETD. 

# /etc/init.d/xinetd restart 

Para permitir que o servidor Nagios execute os plugins remotamente no cliente, o arquivo /usr/local/nagios/etc/nrpe.cfg nos clientes deve estar correto, e com todos os comandos a serem executados já definidos. 

Por exemplo: 

Se a linha de comando local do plugin "check_swap" é: 

# /usr/local/nagios/libexec/check_swap -w 20% -c 10% 

Então, a definição do comando no NRPE.CFG deverá ser: 

command[check_swap]=/usr/local/nagios/libexec/check_swap -w 20% -c 10%

E no servidor, esse comando deverá ser definido em services.cfg como: 

command[check_swap]=/usr/local/nagios/libexec/check_swap -w 20% -c 10%

No servidor, a verificação deste serviço, dentro de services.cfg será: 

define service{
use local-service
host_name proxy
service_description SWAP
check_command check_nrpe!check_swap
contact_groups <nome_do_grupo>
}

Vamos agora à parte mais demorada, as configurações do Nagios... 

# /usr/local/nagios/libexec/check_http -h 

No caso do plugin check_http, a opção "-H" define o IP do HTTP server a ser testado: 

# /usr/local/nagios/libexec/check_http -H <ip_httpserver> 

Com esta linha de comando, a definição do comando dentro de commands.cfg, será: 

define command{
command_name check_http
command_line check_http -H $HOSTADDRESS$
}

Na linha acima, a variável $HOSTADDRESS$ será informada pelo Nagios no momento da verificação desse serviço. 

O arquivo commands.cfg original já possui muitos comandos predefinidos, por isso não daremos tanta atenção a este arquivo agora. 

services.cfg

Definição dos serviços de monitoramento. Utilizando a definição do comando check_http em commands.cfg, podemos ativar o monitoramento de um servidor http, utilizando a seguinte configuração, dentro de services.cfg: 

Primeiro, definimos um template (padrão), afim de diminuir o número de linhas nesse arquivo, podendo aplicar esse template aos serviços desejados. 

define service{
name local-service
active_checks_enabled 1
passive_checks_enabled 1
parallelize_check 1
obsess_over_service 1
check_freshness 0
notifications_enabled 1
event_handler_enabled 1
flap_detection_enabled 1
failure_prediction_enabled 1
process_perf_data 1
retain_status_information 1
retain_nonstatus_information 1
is_volatile 0
check_period 24x7
max_check_attempts 2
normal_check_interval 5
retry_check_interval 1
contact_groups <nome_do_grupo>
notification_options w,u,c,r
notification_interval 60
notification_period 24x7
register 0
}

Agora, definimos o serviço HTTP a monitorar: 

define service{
use local-service # (nome do template)
host_name site
service_description Servidor HTTP
check_command check_http!<ip_http_server>
contact_groups <Grupo de Contato>
}

Repare que na linha "check_command", deverá ser colocado o nome do serviço plugin "check_http", seguido de (!) exclamação e o IP do servidor, que será o valor da variável $HOSTADDRESS$ declarada no arquivo commands.cfg. 

Adicione também no arquivo commands.cfg, a definição do plugin NRPE: 

define command{
command_name check_nrpe
command_line /usr/local/nagios/libexec/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
}

contacts.cfg

Definição dos contatos para envio de notificações e alertas. 

define contact{
contact_name <login>
alias <Nome_Completo>
service_notification_period <Periodos definidos em TIMEPERIODS.CFG>
host_notification_period <Periodos definidos em TIMEPERIODS.CFG>
service_notification_options w,u,c,r #( w=warning / u=unknown / c=critical / r=recoveries / n=none)
host_notification_options d,u,r #( d=down / u=notify / r=recoveries / n=none )
service_notification_commands notify-by-email
host_notification_commands host-notify-by-email
email email@seudominio.com.br
}

contactgroups.cfg

Definição dos grupos de contatos, facilitando a configuração para envio de notificações e alertas. 

define contactgroup{
contactgroup_name <grupo>
alias <nome do grupo>
members <Logins definidos no arquivo contacts.cfg>
}

hosts.cfg

Configuração dos hosts que serão monitorados. 

Pode ser definido um host padrão (template) e utilizado para todos os hosts, diminuindo muito o número de linhas no arquivo hosts.cfg. 

define host{
name generic-host
event_handler_enabled 1
flap_detection_enabled 1
max_check_attempts 5
notification_interval 20
notification_options d,u,r
notification_period 24x7
notifications_enabled 1
process_perf_data 1
retain_status_information 1
retain_nonstatus_information 1
register 0 # não deve ser registrado, pois não é um host, apenas um template
}

define host{
use generic-host # nome do template criado acima
address <ip_servidor>
alias <Nome do Servidor>
check_command <comando pre-definido em services.cfg>
host_name <Host_Name_do_servidor>
}

hostgroups.cfg

Definição dos grupos de hosts. 

define hostgroup{
hostgroup_name <nome_do_grupo>
alias <Descrição do Grupo>
contact_groups <grupos_que_fazem_parte>
members <hosts_que_fazem_parte>
}

timeperiods.cfg

Declaração dos horários para monitoramento. 

define timeperiod{
timeperiod_name 24x7
alias 24 Hours A Day, 7 Days A Week
sunday 00:00-24:00
monday 00:00-24:00
tuesday 00:00-24:00
wednesday 00:00-24:00
thursday 00:00-24:00
friday 00:00-24:00
saturday 00:00-24:00
}


define timeperiod{
timeperiod_name workhours
alias "Normal" Working Hours
monday 09:00-17:00
tuesday 09:00-17:00
wednesday 09:00-17:00
thursday 09:00-17:00
friday 09:00-17:00
}


define timeperiod{
timeperiod_name nonworkhours
alias Non-Work Hours
sunday 00:00-24:00
monday 00:00-09:00,17:00-24:00
tuesday 00:00-09:00,17:00-24:00
wednesday 00:00-09:00,17:00-24:00
thursday 00:00-09:00,17:00-24:00
friday 00:00-09:00,17:00-24:00
saturday 00:00-24:00
}
 

Iniciando pela primeira vez

Antes de iniciar o Nagios pela primeira vez, crie o diretório para envio de comandos internos do Nagios. 

# mkdir /usr/local/nagios/var/rw 

E defina suas permissões: 

# chown nagios. /usr/local/nagios/var/rw 

Verifique as configurações do Nagios, utilizando: 

# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg 

Se existirem erros de configuração, ele informará em quais linhas e arquivos estão os problemas a serem corrigidos. Tente corrigir todos estes erros, pois é possível que o Nagios não inicie devido a problemas de configurações. 

Depois de tudo acertado, basta iniciar o daemon do Nagios. 

# /usr/local/nagios/bin/nagios -d /usr/local/nagios/etc/nagios.cfg 

Ele pode também ser iniciado via serviço: 

# /etc/init.d/nagios restart 

# htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin 

Para criar novos usuários: 

# htpasswd /usr/local/nagios/etc/htpasswd.users <usuario> 

O arquivo /usr/local/nagios/etc/cgi.cfg contém as configurações de acesso e visualização via Web-CGI. 

Descomente as linhas de autorização, e defina os usuários que podem acessar as funções. 

authorized_for_system_information=nagiosadmin, usuario
authorized_for_configuration_information=nagiosadmin, usuario
authorized_for_system_commands= nagiosadmin, usuario
authorized_for_all_services=nagiosadmin, usuario
authorized_for_all_hosts=nagiosadmin, usuario
authorized_for_all_service_commands=nagiosadmin, usuario
authorized_for_all_host_commands=nagiosadmin, usuario

Reinicie o Nagios e tente acessar novamente as páginas do sistema. 

# /etc/init.d/nagios restart 

http://<ip_do_servidor>/nagios 

Coloque o usuários nagiosadmin, e a senha definida. 

Pronto, você está acessando as páginas de monitoramento do Nagios!!! 

 

Onde está a dificuldade?

O Nagios é uma poderosíssima ferramenta para monitoramento de hosts e serviços. 

Suporta envio de alertas e notificações por e-mail, permite visualização em tempo real do status dos hosts e serviços e os problemas apresentados, possui um excelente sistema de logs, históricos, gráficos de disponibilidade, mapas da rede em 2D e 3D (desde que configurado corretamente). 

Muitos administradores apanham muito para acertar sua configuração. 

Porém, o grande mistério do Nagios não está em seus arquivos de configuração, e sim em seus conceitos. 

A separação das configurações em diversos arquivos ajuda muito na visualização e alteração das configurações, mesmo que seja possível declarar todos os comandos, serviços, hosts e períodos dentro de um único arquivo (como pode ser visto no arquivo "localhost.cfg", criado por padrão). 

Depois que a lógica do Nagios é compreendida (criação de templates, grupos,etc.), sua configuração passa a ser muito simples. 

A única parte realmente demorada do trabalho, é a criação dos hosts... Como essa criação é feita de forma praticamente manual, host a host, serviço a serviço, acaba gerando uma certa frustração no administrador, principalmente se você está acostumado com o maravilhoso "apt-get" do Debian, onde qualquer coisa instalada já está funcionando sem grandes configurações. 

Mas como todos sabemos, o mundo Linux não é criado de forma rápida ou simples (pra isso existe o Windows...). Tudo dá trabalho e exige massa cinzenta. 

E pode ter certeza... o resultado final compensa as horas (ou dias) gastos. 

Conclusão

Todos os nomes de arquivos de configuração citados neste artigo são sugeridos pela documentação do Nagios. 

Porém, servem apenas como orientação. Nada te impede de criar um arquivo chamado FINANCEIRO.CFG e configurar os hosts e serviços do setor Financeiro de sua empresa nesse arquivo. 

O importante é que os arquivos utilizados estejam declarados dentro do arquivo de configuração NAGIOS.CFG, através da linha: 

cfg_file=/usr/local/nagios/etc/financeiro.cfg

Para maiores informações, links, documentação, downloads, fórum... Boa sorte!!! 

Ricardo Gavioli 

0 comentários :

Enviar um comentário