segunda-feira, julho 04, 2011

Script de Backup de OpenLDAP - ldapsearch


Introdução


Para realizar backups de bases LDAP existem muitas ferramentas que podem ser utilizadas. Uma maneira de realizar um backup simples e remoto é utilizando o comando ldapsearch.

Neste post será apresentado o script bkp-ldap.sh e de todas as configurações necessárias para seu funcionamento.

Pacotes Necessários


Para utilizar o comando ldapsearch é necessário ter instalado o seguinte pacote:


[root@horus ~]# yum info openldap-clients
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: centos.pop.com.br
* extras: centos.pop.com.br
* updates: centos.pop.com.br
Installed Packages
Name       : openldap-clients
Arch       : i386
Version    : 2.3.43
Release    : 12.el5_6.7
Size       : 367 k
Repo       : installed
Summary    : Client programs for OpenLDAP.
URL        : http://www.openldap.org/
License    : OpenLDAP
Description: OpenLDAP is an open-source suite of LDAP (Lightweight Directory Access
          : Protocol) applications and development tools. LDAP is a set of
          : protocols for accessing directory services (usually phone book style
          : information, but other information is possible) over the Internet,
          : similar to the way DNS (Domain Name System) information is propagated
          : over the Internet. The openldap-clients package contains the client
          : programs needed for accessing and modifying OpenLDAP directories.


Verificando quais binários e manuais foram instalados pelo pacote openldap-clients:


[root@horus base-ldap-neptuno]# rpm -ql openldap-clients
/usr/bin/ldapadd
/usr/bin/ldapcompare
/usr/bin/ldapdelete
/usr/bin/ldapmodify
/usr/bin/ldapmodrdn
/usr/bin/ldappasswd
/usr/bin/ldapsearch
/usr/bin/ldapwhoami
/usr/share/man/man1/ldapadd.1.gz
/usr/share/man/man1/ldapcompare.1.gz
/usr/share/man/man1/ldapdelete.1.gz
/usr/share/man/man1/ldapmodify.1.gz
/usr/share/man/man1/ldapmodrdn.1.gz
/usr/share/man/man1/ldappasswd.1.gz
/usr/share/man/man1/ldapsearch.1.gz
/usr/share/man/man1/ldapwhoami.1.gz


O cliente ldap também precisa estar instalado no sistema operacional LINUX (distribuição CENTOS 5.6).


Verificando a instalação do pacote openldap:


[root@horus base-ldap-neptuno]# yum info openldap
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: centos.pop.com.br
* extras: centos.pop.com.br
* updates: centos.pop.com.br
Installed Packages
Name       : openldap
Arch       : i386
Version    : 2.3.43
Release    : 12.el5_6.7
Size       : 593 k
Repo       : installed
Summary    : The configuration files, libraries, and documentation for OpenLDAP.
URL        : http://www.openldap.org/
License    : OpenLDAP
Description: OpenLDAP is an open source suite of LDAP (Lightweight Directory Access
          : Protocol) applications and development tools. LDAP is a set of
          : protocols for accessing directory services (usually phone book style
          : information, but other information is possible) over the Internet,
          : similar to the way DNS (Domain Name System) information is propagated
          : over the Internet. The openldap package contains configuration files,
          : libraries, and documentation for OpenLDAP.


Verificando quais arquivos e bibliotecas foram instaladas pelo pacote openldap:


[root@horus base-ldap-neptuno]# rpm -ql openldap
/etc/openldap
/etc/openldap/cacerts
/etc/openldap/ldap.conf
/usr/lib/liblber-2.3.so.0
/usr/lib/liblber-2.3.so.0.2.31
/usr/lib/libldap-2.3.so.0
/usr/lib/libldap-2.3.so.0.2.31
/usr/lib/libldap_r-2.3.so.0
/usr/lib/libldap_r-2.3.so.0.2.31
/usr/share/doc/openldap-2.3.43
/usr/share/doc/openldap-2.3.43/ANNOUNCEMENT
/usr/share/doc/openldap-2.3.43/CHANGES
/usr/share/doc/openldap-2.3.43/COPYRIGHT
/usr/share/doc/openldap-2.3.43/LICENSE
/usr/share/doc/openldap-2.3.43/README
/usr/share/man/man5/ldap.conf.5.gz
/usr/share/man/man5/ldif.5.gz
/usr/share/openldap



Configurações do Sistema


A configuração do cliente ldap será feita no arquivo /etc/openldap/ldap.conf.



[root@horus ~]# vim /etc/openldap/ldap.conf

#####################################
#                                                             #
#  Configurações do Cliente LDAP            #
#                                                             #
#####################################
#
# LDAP Defaults
#
# See ldap.conf(5) for details
# This file should be world readable but not world writable.
#
# Specifies the default base DN to use when performing ldap operations.
BASE dc=ufcspa,dc=edu,dc=br
#
# Specifies the default bind DN to use when performing ldap operations.
BINDDN  cn=qualquer,dc=ufcspa,dc=edu,dc=br
#
# Specifies the URI(s) of an LDAP server(s) to which the LDAP library should connect.
# The URI scheme may be either ldap or ldaps which refer to LDAP over TCP and LDAP over SSL (TLS)
# respectively.
URI ldap://192.168.1.1/
#
# Specifies the name(s) of an LDAP server(s) to which the LDAP library should connect.
HOST qualquer.ufcspa.edu.br
#
# Specifies if the client should automatically follow referrals returned by LDAP servers.
REFERRALS off
#
# Specifies a size limite to use when performing searches. A zero (0) means unlimited.
SIZELIMIT   0
#
# Specifies a time limit to use when performing searches. A zero (0) means unlimited.
TIMELIMIT   0
#
# Specifies how alias dereferencing is done when performing a search.
# If it is configured never then aliases are never dereferenced. This is the default.
DEREF           never
#
# TLS
#TLS_CACERT /etc/openldap/cacerts/myca-key-cert.pem
#
#  Specifies what checks to perform on server certificates in a TLS session
#  The value "never" means that the client will not request or check any server certificate.
TLS_REQCERT never
#
#TLS_CACERTDIR /etc/openldap/cacerts



Implementação do Script bkp-ldap.sh



#!/bin/bash
#
#
#################################
#                                                      #
# Script de Backup da Base LDAP     #
#                                                      #
#################################
#
#
# ============
# Dependências
# ============
#
# O comando ldapsearch utiliza configurações do cliente ldap do sistema
# operacional configurado em /etc/openldap/ldap.conf
#
#
# =================
# Variáveis Globais
# =================
#
# Senha para se conectar no Servidor LDAP
SENHA='segredo”'
#
#
# Servidor LDAP
HOST='qualquer.ufcspa.edu.br'
#
#
# Repositorio para deixar os arquivos de backup
REPOSITORIO='/backup/base-ldap-neptuno'
#
#
# Registra o momento em que o arquivo foi criado. Formato: ano-mes-dia-hora-minuto-segundo
HORARIO=$( date +%F-%H-%M-%S )
#
#
# ==================
# Execução do backup
# ==================
#
# Os seguintes parâmetros são utilizados:
#     -w    (solicita senha)
#     -D    (indica qual será o binddn a ser utilizado na conexão com a base)
#     -x    (indica auteticação simples e não por SASL)
#     -LLL  (indica que o OUTPUT do comando será no formato LDIF)
#
ldapsearch -w "$SENHA" -D"cn=qualquer,dc=ufcspa,dc=edu,dc=br" -x -LLL >> "$REPOSITORIO"/baseLDAP-"$HORARIO".ldif
#
#
#
# =================
# Validação de erro
# =================
#
if [ $? -ne 0 ]; then
{
  echo -ne "Erro - Nao foi realizado o Backup da base LDAP em $HOST" | mail -s"Erro - Backup Base LDAP $HOST" qualquer@ufcspa.edu.br
  exit 1
}
fi
#
#
#
# ========================================
# Geração de relatório de status do backup
# ========================================

RELATORIO=$( /usr/bin/find "$REPOSITORIO" -atime +5 )

/usr/bin/find "$REPOSITORIO" -atime +5 -exec rm -f {} \;

echo -ne "Foram removidos os seguintes arquivos antigos:\n\n$RELATORIO\n" | mail -s"Backup Base LDAP $HOST" qualquer@ufcspa.edu.br

exit 0        



Configuração da CRON


Para poder agendar a realização periódica do script é necessário fazer as seguintes configurações na CRON.



[root@horus ~]# crontab -e
0 3 * * * /root/bin/bkp-ldap.sh 2>&1 > /dev/null

quinta-feira, maio 12, 2011

Projeto 1 - Geração de Logs e Debugging



A geração de logs e debugging é o primeiro projeto necessário na implantação de uma Firewall. Saber monitorar quais pacotes estão sendo aceitos ou negados é quase tão importante como conhecer as funcionalidades e/ou recursos da Firewall.

Para configurar os logs / debugging da Firewall H3C SECPATH F1000-S foi escolhido o redirecionamento de todos os registros para um Syslog Server em Linux. As vantagens dessa abordagem devem-se às seguintes razões:

  • O elevado volume de registros ao ativar o monitoramento de pacotes negados nas ACLs torna inviável sua análise em uma console.
  • Os registros devem ser guardados com fins de auditoria e controle.
  • Possibilidade de gerar filtros com expressões regulares e linguagem BASH.
  • Possibilidade de redirecionar vários tipos de fluxos de logs / debugging em diferentes arquivos de armazenamento.

A configuração básica para a geração e controle de logs na Firewall H3C SECPATH F1000-S é através do info-center. É importante não confundir a geração de logs com a geração de debug. A geração de debugs é muito mais diversificada do que a geração de logs e utiliza exclusivamente o comando debugging. Porém, ao gerar um debug, por exemplo das diversas regras de uma ACL, é possível direcionar a saído do debug para o info-center, que por sua vez direcionará os registros para um Syslog Server.

As configurações abaixo redirecionam o debugging de pacotes negados pela firewall para o Syslog Server. Perceba que é necessário ativar no debugging o tipo de informação buscada. A segunda linha de configuração direciona o channel 1 (monitor terminal - corresponte ao terminal telnet/ssh) para o loghost.
[SecPath] info-center loghost source GigabitEthernet0/0
[SecPath] info-center loghost 192.168.1.1 channel 1 facility local2
[SecPath] info-center synchronous                  
[SecPath] info-center enable    

[SecPath] debugging firewall packet-filter denied
 Firewall's packet denied debugging switch is on
[SecPath] undo debugging all                      
 All possible debugging has been turned off

Os logs gerados com a configuração abaixo podem ser identificados do seguinte tipo:

1) Logs gerados pelo controle de ataques. Gerados com o nível 4 (warning level) do Syslog

May  4 13:46:22 200.18.67.241 2011 arsenio.ufcspa.edu.br %%10SEC/4/ATCKDF(l):-DEV_TYPE=SECPATH atckType(1016)=(21)ARP-spoofing;rcvIfName(1023)=GigabitEthernet1/1;srcIPAddr(1017)=200.18.67.22;srcMacAddr(1021)=00-26-54-0f-e8-25;destIPAddr(1019)=200.18.67.1;destMacAddr(1022)=00-23-89-35-41-57;atckSpeed(1047)=0;atckTime_cn(1048)=20110504134620
May  4 13:46:22 200.18.67.241 2011 arsenio.ufcspa.edu.br %%10SEC/4/ATCKDF(l):-DEV_TYPE=SECPATH atckType(1016)=(21)ARP-spoofing;rcvIfName(1023)=GigabitEthernet1/1;srcIPAddr(1017)=200.18.67.22;srcMacAddr(1021)=00-26-54-0f-e8-25;destIPAddr(1019)=200.18.67.1;destMacAddr(1022)=00-23-89-35-41-57;atckSpeed(1047)=0;atckTime_cn(1048)=20110504134621

2) Logs gerados pela execução de comandos. Gerados com o nível 4 (warning level) do Syslog

May  4 13:22:33 200.18.67.241 2011 arsenio.ufcspa.edu.br %%10SHELL/4/CMD(l):-DEV_TYPE=SECPATH task:vt0 ip:200.18.71.31 user:** command:info-center logbuffer
May  4 13:22:36 200.18.67.241 2011 arsenio.ufcspa.edu.br %%10SHELL/4/CMD(l):-DEV_TYPE=SECPATH task:vt0 ip:200.18.71.31 user:** command:dis cur

3) Logs gerados ao ativar o debugging. O debugging pode ser ativado para diversos tipos de funcionalidadades. Estão gerados com o nível 7 (debug level) do Syslog

May  6 11:21:57 200.18.67.241 2011 arsenio.ufcspa.edu.br %%10FILTER/7/FLTDBG(d):-DevIP=200.18.67.241-DEV_TYPE=SECPATH GigabitEthernet0/0 InBound List 3030  deny tcp (200.18.64.66 3338)->(50.16.235.93 843) 48 bytes from interface GigabitEthernet0/0
May  6 11:21:57 200.18.67.241 2011 arsenio.ufcspa.edu.br %%10FILTER/7/FLTDBG(d):-DevIP=200.18.67.241-DEV_TYPE=SECPATH GigabitEthernet1/0 InBound List 3031  deny icmp 192.168.114.39->200.18.70.27 (8 0) 64 bytes from interface GigabitEthernet1/0


As configurações de um Syslog Server em Linux (CentOS 5.5) para armazenar separadamente cada tipo de log são:

[root@horus log]# rpm -qi sysklogd-1.4.1-46.el5
Name        : sysklogd                     Relocations: (not relocatable)
Version     : 1.4.1                             Vendor: Oracle USA
Release     : 46.el5                        Build Date: Thu 11 Feb 2010 11:31:19 PM BRST
Install Date: Fri 04 Mar 2011 02:13:34 PM BRT      Build Host: ca-build10.us.oracle.com
Group       : System Environment/Daemons    Source RPM: sysklogd-1.4.1-46.el5.src.rpm
Size        : 127866                           License: GPL
Signature   : DSA/SHA1, Wed 17 Feb 2010 07:02:40 PM BRST, Key ID 66ced3de1e5e0159
Summary     : System logging and kernel message trapping daemons.
Description :
The sysklogd package contains two system utilities (syslogd and klogd)
which provide support for system logging.  Syslogd and klogd run as
daemons (background processes) and log system messages to different
places, like sendmail logs, security logs, error logs, etc.

[root@horus log]# vim /etc/sysconfig/syslog
# Options to syslogd
# -m 0 disables 'MARK' messages.
# -r enables logging from remote machines
# -x disables DNS lookups on messages recieved with -r
# See syslogd(8) for more details
SYSLOGD_OPTIONS="-m 0 -r -x"
# Options to klogd
# -2 prints all kernel oops messages twice; once for klogd to decode, and
#    once for processing with 'ksymoops'
# -x disables all klogd processing of oops messages entirely
# See klogd(8) for more details
KLOGD_OPTIONS="-x"
#
SYSLOG_UMASK=077
# set this to a umask value to use for all log files as in umask(1).
# By default, all permissions are removed for "group" and "other".


[root@horus firewall]# vim /etc/syslog.conf
# Configurações de Log da Firewall SECPATH
local2.=debug                        -/var/log/firewall/debug.log
local2.=warn                        -/var/log/firewall/warning.log


Para filtar os logs em tempo real e ter uma visualização mais clara utilizar os seguinte programa desenvolvido em BASH:

[root@horus ~]# cat /root/bin/filtrar-acl
#!/bin/bash

#
# Nome      :  filtrar-acl
#
# Função    :  Programa para filtar em tempo real os logs enviados pela Firewall SECPATH
#
# Versão    :  1.0 - Maio 2011

# Funções do Programa
# ===================

function MENSAGEM_ERRO()
{
  echo -ne "\nErro !!! Favor passar apenas um único parâmetro: tcp, udp ou icmp\n\n"
  exit 1
}

function FILTRAR()
{
  tail -f /var/log/firewall/debug.log | grep $1 | awk 'BEGIN { FS = " "; OFS = " "; ORS = "\n" } { print $10,$11,$12,$13,$14,$15,$16 }'
}

if [ $# -gt 1 ]; then
{
  MENSAGEM_ERRO
}
elif [ "$1" = "tcp" ]; then
{
  FILTRAR tcp
}
elif [ "$1" = "udp" ]; then
{
  FILTRAR udp
}
elif [ "$1" = "icmp" ]; then
{
  FILTRAR icmp
}
else
{
  MENSAGEM_ERRO
}
fi

exit 0