Colaboração: Alexandro Silva

Data de Publicação: 29 de março de 2010

De acordo com a norma NBR ISO/IEC 17799:2005:

12.1.3 Salvaguarda de registros organizacionais
Convém que registros importantes de uma organização sejam protegidos contra perda, destruição e falsificação. Alguns registros podem precisar ser retidos de forma segura para atender a requisitos estatutários ou regulamentações, assim como para apoiar as atividades essenciais do negócio…

Para atender este controle da norma torna-se imprescindível a implantação de um sistema de backup. Existem vários sistemas pontos para realizar está tarefa dentre vários posso citar algumas estrelas do mundo proprietário:

Porém posso destacar dentro da vasta lista de ferramentas livres o Bacula. Ele anda lado a lado com os softwares citados anteriormente sem dever nada ( veja Current State). As poucas “limitações” encontradas são:

  • Não possuir agentes para banco de dados. Porém antecipo que isso não venha a ser uma grande limitação como mostrarei mais tarde.
  • Sua configuração é um pouco complicada para quem não tem muita experiência.

Porém depois de configurado o Bacula mostra que não deve nada a ninguém, ele da conta do recado e sobra em funcionalidades.

Veja um comparativo entre os diversos softwares de backup

Antes de apresentar um completo how-to sobre o Bacula preciso falar sobre alguns conceitos importantes para o bom entendimento não só da ferramenta, mas de todo o conceito por trás da arte de manter cópias de segurança do seus dados.

Estratégias

O básico de tudo é entender as possíveis estratégias de backup, a melhor estratégia é aquela que atende suas necessidades. Alguns itens que ajudarão na escolha são:

  • O que irei guardar?
  • Qual o tamanho dos dados que serão guardados?
  • Qual tipo de mídia utilizar? Fita, CD, DVD, HD?
  • Os dados serão mantidos por quanto tempo?
  • De acordo com o valor da informação qual o tempo de recuperação ideal?

Após responder estes e outros questionamentos você estará habilitado a definir a melhor estratégia

Backup Completo ( Full )

Faz um backup completo dos dados. Uso recomendado na inexistência de uma política de backup. A grande desvantagem é a quantidade de espaço ocupado, consequentemente os dados não serão mantidos por muito tempo. Dependendo do volume de dados a rotatividade máxima será semanal.

Backup Diferencial

Este tipo de estratégia é bastante interessante para quem ainda não confia em suas estrutura de backup. Aqui é gerado um backup full e vários backups diferenciais. O backup diferencial é o somatório do que foi alterado após o full, isto significa que para recuperar os dados somente são necessários o full e o último backup diferencial. A grande vantagem é a diminuição da quantidade de volumes e o restore não necessita de todos os diferenciais gerados.

Backup Incremental

Nesta estratégia após o backup full serão gerados backups incrementais. Para fazer o restore serão necessários os volumes full e todos os volumes incrementais. Ela se aplica a uma estrutura totalmente confiável de backup pois se qualquer volume estiver danificado o restore não será realizado.

Seus backups poderão seguir as rotações diárias ( full ), semanais e mensais. Para reduzir os custos com mídia o ideal é fazer a reciclagem dos volumes.

Exemplo de rotação semanal

Dom Backup Full
Seg a sexta-feira Backups Diferenciais
Reciclagem Semanal ou Quinzenal

Como informei anteriormente a melhor estratégia é aquela que une eficiência e menor custo. Na conclusão do segundo post apresentarei a minha experiência com o Bacula na Colivre

Termos

Existe uma vasta terminologia usada no Bacula para maiores informações acesse Terminology

Ele é um sistema totalmente distribuido sendo formado por 3 daemons ( Director, Storage e FileDaemon ). Os 2 primeiros não necessariamente precisam estar em máquinas separadas, enquanto que o FD precisa ser instalado em todas as máquinas clientes.

Bacula Director

Responsável por supervisionar todas as operações de backup, restauração, verificação e as operações dos arquivos.

Bacula Storage

Responsável pelo armazenamento, leitura e escrita em fita ou outros meios de armazenamento, por exemplo arquivos.

Bacula File Daemon

Este é o cliente do Bacula.

Instalação e Configuração Básica

Agora apresentarei de uma forma bem simples a instalação e configuração do Bacula, recomendo uma profunda leitura da documentação. O bom entendimento de sua infra-estrutura e da política adotada facilitará muito na configuração e manutenção da rotina de backup.

No Debian a instalação desta ferramenta é bastante simples. Execute o comando abaixo para instalar todos os daemons:

aptitude install bacula-director bacula-sd bacula-fd

Configurando o Bacula Director

Edite o arquivo /etc/bacula/bacula-dir.conf

Director { # define myself
Name = backup-dir
DIRport = 9101 # where we listen for UA connections
QueryFile = “/etc/bacula/scripts/query.sql”
WorkingDirectory = “/var/lib/bacula”
PidDirectory = “/var/run/bacula”
Password = “Console/iA6pwbPuT2zUt/hbyE2123123132123″ # Console password
Messages = Daemon
DirAddress = 123.123.123.123
}

## Clients

Job {
Name = “Job-server-01″
Client = server-01-fd
Type = Backup
FileSet = “Server 01 Set”
Schedule = “PeriodicidadeSemanal”
Messages = Standard
Pool = Default
Full Backup Pool = “Full_server-01″
Differential Backup Pool = “Diff_server-01″
Write Bootstrap = “/var/lib/bacula/server-01_new.bsr”
}

## Backup Catalog

Job {
Name = “BackupCatalog”
Client = server-2-fd
Type = Backup
FileSet=”Catalog”
Schedule = “PeriodicidadeSemanalCatalog”
Messages = Standard
Storage = Storage-Server2
Pool = “Catalog_Backup”
RunBeforeJob = “/etc/bacula/scripts/make_catalog_backup bacula”
RunAfterJob = “/etc/bacula/scripts/delete_catalog_backup”
Write Bootstrap = “/var/lib/bacula/BackupCatalog_new.bsr”
}

## Restore Job

Job {
Name = “Server-01_Restore”
Type = Restore
Client = server-01-fd
FileSet = “Server 01 Set”
Pool = Default
Messages = Standard
Where = “/var/bacula/restore/b_server-01″
Bootstrap = “/var/lib/bacula/server-01_new.bsr”
}

# Backup Files

FileSet {
Name = “Server 01 Set”
Include {
Options {
signature = MD5
compression = GZIP
}
File = /etc
File = /var/bkpdb
}
Exclude {
File = /tmp
}
}

#Schedules

Schedule {
Name = “PeriodicidadeSemanal”
Run = Level=Full on sun at 23:00
Run = Level=Differential on mon-sat at 23:00
}

Schedule {
Name = “PeriodicidadeSemanalCatalog”
Run = Level=Full on sun at 07:00
Run = Level=Differential on mon-sat at 07:00
}

# Clients FD

Client {
Name = Server-1-fd
Address = 123.123.123.123
FDPort = 9102
Catalog = MyCatalog
Password = “Nlw2vp555z4vepasdasdasddasdda”
File Retention = 30 days
Job Retention = 30 days
Autoprune = yes
}

#Storage

Storage {
Name = Storage-Server2
Address = 123.13.12.3123 # N.B. Use a fully qualified name here
SDPort = 9103
Password = “Nlw2vp555z4veqweqweqweqwY”
Device = FileStorage
Media Type = File
}

#Pool Server 01

Pool {
Name = Full_Server-01
Pool Type = Backup
Storage = FullStorage
Maximum Volume Jobs = 1
Maximum Volume Bytes = 6g
Recycle = yes
AutoPrune = yes
Volume Retention = 2 weeks
Maximum Volumes = 5
LabelFormat = “F_server-01_${Year}-${Month}-${Day}_${Hour}.${Minute}.${Second}”
}

Pool {
Name = Diff_server-01
Pool Type = Backup
Storage = DiffStorage
Maximum Volume Jobs = 1
Maximum Volume Bytes = 6g
Recycle = yes
AutoPrune = yes
Volume Retention = 2 weeks
Maximum Volumes = 7
LabelFormat = “D_server-01_${Month}-${Day}”
}

Agora iremos configurar o Bacula Storage e o File Daemon

Edite o arquivo /etc/bacula/bacula-sd.conf

Storage { # definition of myself
Name = backup-sd
SDPort = 9103 # Director’s port
WorkingDirectory = “/var/lib/bacula”
Pid Directory = “/var/run/bacula”
SDAddress = 123.122.123.123
}

# List Directors who are permitted to contact Storage daemon

Director {
Name = backup-dir
Password = “Nlw2vp555z4vep0dasdads”
}

# Restricted Director, used by tray-monitor to get the
# status of the storage daemon

Director {
Name = backup-mon
Password = “Mon/GxVW6dfndasdasdsadasd”
Monitor = yes
}

# Devices supported by this Storage daemon
# To connect, the Director’s bacula-dir.conf must have the
# same Name and MediaType.

Device {
Name = FileStorage
Device Type = File
Media Type = File
Archive Device = /backup2/storage
}

Edite o arquivo /etc/bacula/bacula-fd

# List Directors who are permitted to contact this File daemon

Director {
Name = “backup-dir”
Password = “Nlw2vp555z4vep0viaBpeAsdads”
}

# Restricted Director, used by tray-monitor to get the
# status of the file daemon

Director {
Name = “backup-mon”
Password = “Mon/GxVW6dfnO+EVBPpkdasdsaP”
Monitor = yes
}

# “Global” File daemon configuration specifications

FileDaemon { # this is me
Name = Server-2-fd
FDport = 9102 # where we listen for the director
WorkingDirectory = /var/lib/bacula
Pid Directory = /var/run/bacula
Maximum Concurrent Jobs = 20
FDAddress = 123.123.123.123
Heartbeat Interval = 15 seconds
}

# Send all messages except skipped files back to Director
Messages {
Name = Standard
director = backup-dir = all, !skipped, !restored

Com todos os arquivos devidamente configurados inicie os serviços

invoke-rc.d bacula-director restart

invoke-rc.d bacula-sd restart

invoke-rc.d bacula-fd restart

E conecte-se ao Bacula Console

bconsole

Connecting to Director 123.123.123.123:9101
1000 OK: backup-dir Version: 2.4.4 (28 December 2008)
Enter a period to cancel a command.
*

Aparecendo a tela acima tudo está funcionando perfeitamente. Para obter informações sobre os comandos digite help.

Existe uma gama de ferramentas gráficas para gestão do bacula, posso citar o bacula-console-qt. Para ser sincero eu não utilizo ferramentas gráficas. O Bacula Console me atende muito bem nas tarefas diárias.

Backup dos SGBDs

Como informei anteriormente existe uma limitação do Bacula para fazer cópias de segurança de SGBDs porém não recomendo o backup “a quente” das bases. Todos os SGBDs do mercado possuem ferramentas que geram o dump do banco sem afetar a integridade dos dados. Seguem 02 scripts que utilizo para gerar as cópias tanto do Postgresql quanto do MySQL:

MySQL

Este script é de autoria do meu colega Marcelo Dultra, analista de segurança da FTC.

O arquivo de configuração /etc/bkpmysql.cfg contém as infomações necessárias para a realização do backup

Nome do Job:Nome do dump:Diretório destino:Usuário do banco:senha:Arquivo log:email envio alerta

Esse é o script

#!/bin/bash

##########################################################################
# Definicao de Variaveis #################################################
##########################################################################

arqcontrole=’/etc/bkpmysql.cfg’

if [ -z “${arqcontrole}” ]
then
echo “${0} – Erro Fatal: Arquivo de Configuracao nao existe!”
exit 1
fi

titbkp=`cat ${arqcontrole}|cut -d: -f1`
arqbkp=`cat ${arqcontrole}|cut -d: -f2`
adibkp=`cat ${arqcontrole}|cut -d: -f3`
usebkp=`cat ${arqcontrole}|cut -d: -f4`
senbkp=`cat ${arqcontrole}|cut -d: -f5`
logbkp=`cat ${arqcontrole}|cut -d: -f6`
usrbkp=`cat ${arqcontrole}|cut -d: -f7`
dia=`date ‘+%u’`

msg_erro()
{
echo “ATENCAO ADMINISTRADOR! ” > /tmp/bkpmysql.msg
echo “Erro no Backup da Base de Dados Horde – ${serbkp}!” >> /tmp/bkpmysql.msg
echo ${msg} >> /tmp/bkpmysql.msg
mail ${usrbkp} -s “${serbkp} – Erro Backup DB Horde” < /tmp/bkpmysql.msg
}

echo “`date ‘+%d/%m/%y – %H:%M:%S -‘` INICIO DA ROTINA” > ${logbkp}

case ${dia} in
1) sem=”Segunda”;;
2) sem=”Terca”;;
3) sem=”Quarta”;;
4) sem=”Quinta”;;
5) sem=”Sexta”;;
6) sem=”Sabado”;;
7) sem=”Domingo”;;
*) msg=”Dia da Semana nao definido”
msg_erro
echo “`date ‘+%d/%m/%y – %H:%M:%S -’` Erro! Dia da Semana Invalido!” >> ${logbkp}
exit 1
esac

if [ -z “${titbkp}” -o -z “${arqbkp}” -o -z “${adibkp}” -o -z “${usebkp}” -o -z “${senbkp}” -o -z “${logbkp}” -o -z “${usrbkp}” -o -z “${sem}” ]
then
echo “`date ‘+%d/%m/%y – %H:%M:%S -’` Parametros Invalidos!” >> ${logbkp}
msg=”`date ‘+%d/%m/%y – %H:%M:%S -’` Parametros Invalidos!”
msg_erro
exit 1
fi

cd ${adibkp}

echo “`date ‘+%d/%m/%y – %H:%M:%S -’` Gerando dump do banco …” >> ${logbkp}

mysqldump -u ${usebkp} -p${senbkp} –add-locks –add-drop-table –all-databases –flush-logs –disable-keys –result-file=${arqbkp}.${sem} 2>> ${logbkp}

if [ ${?} -eq 0 ]
then
echo “`date ‘+%d/%m/%y – %H:%M:%S -’` Dump Gerado!” >> ${logbkp}
else
echo “`date ‘+%d/%m/%y – %H:%M:%S -’` Erro na realizacao do Backup!” >> ${logbkp}
msg=”`date ‘+%d/%m/%y – %H:%M:%S -’` Erro na realizacao do Backup!”
msg_erro
exit 1
fi

echo “`date ‘+%d/%m/%y – %H:%M:%S -’` Compactando arquivo do dump …” >> ${logbkp}

gzip -f ${arqbkp}.${sem}

if [ ${?} -eq 0 ]
then
echo “`date ‘+%d/%m/%y – %H:%M:%S -’` Arquivo Compactado!” >> ${logbkp}
else
echo “`date ‘+%d/%m/%y – %H:%M:%S -’` Erro na compactacao!” >> ${logbkp}
msg=”`date ‘+%d/%m/%y – %H:%M:%S -’` Erro na compactacao!!”
msg_erro
exit 1
fi

echo “`date ‘+%d/%m/%y – %H:%M:%S -’` FIM DA ROTINA DE BACKUP …” >> ${logbkp}

exit

Postgresql

#!/bin/bash
DATE=`date +”%Y-%m-%d”`
HOSTNAME=`hostname`
DIR=/var/bkpdb
d=rtdb
su postgres -c “pg_dump $d | gzip -c > $DIR/$d.$HOSTNAME.$DATE.out.gz”

Disponível em: pt-brPortuguês

Deixe uma resposta