Dead Packets

30/11/2009

Script de backup de configuração – Cisco PIX/ASA

Filed under: cisco — drak @ 7:18 AM

Em complemento ao post anterior, segue abaixo o script para backup de firewalls Cisco. Os pré-reqs de funcionamento são ligeiramente diferentes:

  1. USUARIO_BACKUP deve ser usuário local do firewall e ter senha conhecida (SENHA_USUARIO_BACKUP) e deve existir no servidor Linux onde vai rodar o script
  2. O firewall deve estar no arquivo /firewall/script/firewall.cisco no formato: IP,HOSTNAME

Um dos problemas desse script é a existência da senha do usuário de backup em texto claro no meio do arquivo, para minimizar este problema podemos compilar o arquivo de script com o comando “shc -rf arquivo”, mais detalhes sobre este programa nos links de referência.

Existe um problema não resolvido neste script, o status de retorno não é preciso (ou seja, a falha no backup não é avisada corretamente), porém é possível perceber que o script está falhando no primeiro diff após o erro, que avisará sobre uma alteração no firewall mostrando que tudo foi alterado, devido a inexistência de novo arquivo de configuração.

Update 10/12: Alterei a maneira como o script puxa a configuração, agora utilizando wget, dessa forma solucionei o problema relacionado ao código de retorno do script, e agora consigo definir precisamente se o comando executou com sucesso ou não.

Update 16/12: Reparei que o diff estava reportando configurações diferentes mesmo quando o firewall não havia sido alterado, isso estava ocorrendo porque no início de cada arquivo de configuração existe uma linha similar a esta “: Written by USUARIO_BACKUP at 02:00:02.525 BRST Tue Dec 15 2009”. Para que o diff seja efetivo basta incluir um argumento para que ele ignore esta linha.

#!/bin/bash
# Script para realizar o backup dos firewalls Cisco

data=$(date +%d-%m-%Y)
dataOntem=$(date +%d-%m-%Y -d "-1 day")
hora=$(date +%d-%m-%Y-%H:%M:%S)
email=seuemail@seudominio.com
log=/firewall/log/bkpCisco.$data.log
logConsolidado=/firewall/log/bkpConsolidado.$data.log
user=USUARIO_BACKUP
pass=SENHA_USUARIO_BACKUP

echo >> $log
echo $hora": Inicio do Backup - Cisco" >> $log

cat /firewall/script/firewall.cisco | while read linha; do
firewall=`echo $linha | cut -d',' -f1`
hn=`echo $linha | cut -d'=' -f2`

# Puxa o arquivo de configuracao
wget -q --tries 1 --timeout 4 --read-timeout=4 --connect-timeout=4 --no-check-certificate --http-user=$user --http-password=$pass https://$firewall/config -O /firewall/backup/$firewall.$data.cfg
if [ $? == 0 ]; then
        md5=`md5sum /firewall/backup/$firewall.$data.cfg | cut -d ' ' -f1`
        echo $hora": Firewall: $firewall ($hn) - BACKUP OK - $md5" >> $log
        diff /firewall/backup/$firewall.$data.cfg /firewall/backup/$firewall.$dataOntem.cfg --brief --ignore-matching-lines='Written by'
        if [ $? != 0 ]; then
                echo $hora": Detectada alteracao no firewall $firewall ($hn)" >> $log
                diffOut=$(sdiff /firewall/backup/$firewall.$data.cfg /firewall/backup/$firewall.$dataOntem.cfg -s)
                echo >> $log
                echo "$diffOut" >> $log
        fi
else
        echo $hora": Firewall: $firewall ($hn) - ERRO NO BACKUP" >> $log
fi
done

echo $hora": Fim do Backup - Cisco" >> $log
echo >> $log

# Remove arquivos mais antigos que 30 dias
echo $hora": Inicio da limpeza" >> $log
echo $hora": Lista de arquivos deletados:" >> $log
find /firewall/log/*.log -mtime +30 -daystart >> $log
find /firewall/log/*.log -mtime +30 -daystart -delete
find /firewall/backup/*.cfg -mtime +30 -daystart >> $log
find /firewall/backup/*.cfg -mtime +30 -daystart -delete
echo $hora": Fim da limpeza" >> $log

cat $log >> $logConsolidado
cat $logConsolidado | mail -s "Firewall Backup Status" $email

Referências
Encrypting Shell Scripts

Limitations of shc, a Shell Encryption Utility

ash

# Script para realizar o backup dos firewalls Cisco

data=$(date +%d-%m-%Y)

dataOntem=$(date +%d-%m-%Y -d “-1 day”)

hora=$(date +%d-%m-%Y-%H:%M:%S)

email=bradcsoc@globalcrossing.com

log=/firewall/log/bkpCisco.$data.log

logConsolidado=/firewall/log/bkpConsolidado.$data.log

user=USUARIO_BACKUP

pass=SENHA_USUARIO_BACKUP

echo >> $log

echo $hora”: Inicio do Backup – Cisco” >> $log

cat /firewall/script/firewall.cisco | while read linha; do

firewall=`echo $linha | cut -d’,’ -f1`

hn=`echo $linha | cut -d’=’ -f2`

# Loga em cada uma das maquinas e executa o comando “sh run”

VAR=$(expect -c “

spawn ssh $user@$firewall

expect \”assword:\”

send \”$pass\r\”

expect \”>\”

send \”ena\r\”

expect \”assword:\”

send \”$pass\r\”

expect \”#\”

send \”conf t\r\”

expect \”conf\”

send \”no pager\r\”

send \”sh run\r\”

log_file -noappend /firewall/backup/$firewall.$data.cfg.tmp

expect \”end\”

expect \”#\”

log_file

send \”pager 24\r\”

send \”exit\r\”

send \”exit\r\”

“)

sed ‘1,/sh/ d’ /firewall/backup/$firewall.$data.cfg.tmp >> /firewall/backup/$firewall.$data.cfg.tmp1

sed ‘$d’ /firewall/backup/$firewall.$data.cfg.tmp1 >> /firewall/backup/$firewall.$data.cfg

rm /firewall/backup/$firewall.$data.cfg.tmp*

if [ $? == 0 ]; then

echo $hora”: Firewall: $firewall ($hn) – BACKUP OK” >> $log

diff /firewall/backup/$firewall.$data.cfg /firewall/backup/$firewall.$dataOntem.cfg –brief

if [ $? != 0 ]; then

echo $hora”: Detectada alteracao no firewall $firewall ($hn)” >> $log

diffOut=$(sdiff /firewall/backup/$firewall.$data.cfg /firewall/backup/$firewall.$dataOntem.cfg -s)

echo >> $log

echo “$diffOut” >> $log

fi

else

echo $hora”: Firewall: $firewall ($hn) – ERRO NO BACKUP” >> $log

fi

echo “$VAR”

done

echo $hora”: Fim do Backup – Cisco” >> $log

echo >> $log

# Remove arquivos mais antigos que 30 dias

echo $hora”: Inicio da limpeza” >> $log

echo $hora”: Lista de arquivos deletados:” >> $log

find /firewall/log/*.log -atime +30 >> $log

find /firewall/log/*.log -atime +30 -delete

find /firewall/backup/*.cfg -atime +30 >> $log

find /firewall/backup/*.cfg -atime +30 -delete

echo $hora”: Fim da limpeza” >> $log

cat $log >> $logConsolidado

cat $logConsolidado | mail -s “Firewall Backup Status” $email

Anúncios

22/11/2009

Script de Backup para firewalls Juniper – ScreenOS

Filed under: ScreenOs — drak @ 12:18 PM

O script abaixo realiza o backup do arquivo de configuração de qualquer firewall Juniper com o sistema operacional ScreenOS utilizando SCP (Secure Copy) e realiza a limpeza de arquivos mais antigos que 30 dias, evitando o estouro do disco caso você se esqueça de limpar regularmente os arquivos gerados. Além disso ele também gera um status report com as diferenças do backup em relação ao dia anterior e o hostname para fácil identificação, esse relatório é enviado por email toda vez que é executado.

Para que o script funcione são necessários os seguintes pré-reqs:

  1. USUARIO_BACKUP deve ser usuário local do firewall e deve existir no servidor Linux onde vai rodar o script
  2. USUARIO_BACKUP deve possuir um par de chaves DSA e e ter sua chave pública associada ao seu usuário no firewall
  3. O firewall deve estar no arquivo /firewall/script/firewall.juniper no formato: IP,HOSTNAME

Existem algumas melhorias que eu planejo implementar algum dia, como a inclusão do hostname do lado do IP do firewall no status report assim como a inclusão do checksum do arquivo de backup, para que seja possível identificar uma alteração no backup no momento do recovery, garantindo que você não está confiando em um arquivo modificado em relação ao dia em que foi gerado.

Update 23/11: Um colega do trabalho implementou a inclusão do hostname ao lado do IP, facilitando a identificação do firewall no relatório.

Update 30/11: Tomei vergonha na cara e implementei o cálculo do checksum.

Update 16/12: Inclui a opção de timeout, para que caso o servidor esteja fora do ar não impacte no tempo do backup.

Update: 21/04: Alterei o output do relatório, agora apresenta uma tabela muito mais fácil de ser analisada, removi o diff do relatório que é enviado para o email.

#!/bin/sh
# Script para realizar o backup dos firewalls Juniper
data=$(date +%d-%m-%Y)
dataOntem=$(date +%d-%m-%Y -d "-1 day")
hora=$(date +%d-%m-%Y-%H:%M:%S)
email=email@dominio.com
log=/firewall/log/bkpJuniper.$data.log
logConsolidado=/firewall/log/bkpConsolidado.$data.log
logDiff=/firewall/log/bkpJuniper.$data.diff.log
user=USR_BACKUP

echo  >> $log
echo $hora":Inicio" >> $log

cat /firewall/script/firewall.juniper | while read linha; do
firewall=`echo -e $linha | cut -d"," -f1`
hn=`echo -e $linha | cut -d"," -f2`
hora=$(date +%d-%m-%Y-%H:%M:%S)
# Puxa o arquivo de configuracao
scp -o ConnectTimeout=5 $user@$firewall:ns_sys_config /firewall/backup/$firewall.$data.cfg
if [ $? == 0 ]; then
        md5=`md5sum /firewall/backup/$firewall.$data.cfg | cut -d ' ' -f1`
        echo $hora"     $firewall       $hn     SUCESSO $md5" >> $log
        diff /firewall/backup/$firewall.$data.cfg /firewall/backup/$firewall.$dataOntem.cfg --brief
        if [ $? != 0 ]; then
                echo $hora": Detectada alteracao no firewall $firewall ($hn)" >> $logDiff
                diffOut=$(sdiff /firewall/backup/$firewall.$data.cfg /firewall/backup/$firewall.$dataOntem.cfg -s)
                echo >> $logDiff
                echo "$diffOut" >> $logDiff
        fi
else
        echo $hora"     $firewall       $hn     FALHA" >> $log
fi
done
hora=$(date +%d-%m-%Y-%H:%M:%S)
echo >> $log
echo $hora":Fim" >> $log

# Remove arquivos mais antigos que 30 dias
find /firewall/log/*.log -mtime +30 -daystart -delete
find /firewall/backup/*.cfg -mtime +30 -daystart -delete

showtable -ti=Horario,IP,Firewall,Status,Checksum $log >> $logConsolidado
cat $logConsolidado | mail -s "Firewall Backup Status" $email

cat /firewall/script/firewall.juniper | while read linha; do

firewall=`echo $linha | cut -d’=’ -f1`

hn=`echo $linha | cut -d’=’ -f2`

12/11/2009

Let’s try again

Filed under: news — drak @ 7:40 PM

Qual não foi a minha surpresa ao ver no Google Reader que eu tinha 3 subscribers (ok, 1 deles sou eu). Bom, isso me animou a postar novamente.

Semana que vem volto a colocar coisas interessantes e úteis por aqui.

Crie um website ou blog gratuito no WordPress.com.