[FUG-BR] Sistema de backup remoto

Joao Rocha Braga Filho goffredo em gmail.com
Seg Jan 16 18:43:11 BRST 2006


Eu faço remotamente por rsh, mas sei que no meio não tem ninguém
para "escutar" indevidamente o tráfego.

Na máquina que vai receber o backup eu crio o disco com poucos i-nodes
e blocagem de 64K. Assim eu uso pouco disco para meta-dados do sistema
de arquivos e sobra mais para os dados. Algo assim com o newfs:

newfs -O2 -b 65535 -m 6 -I 15000000 /dev/<label do disco>

Configuro o rsh no /etc/inetd e inicio o inetd.

Configuro o /etc/hosts.allow para aceitar somente conexões rsh da máquina
que vai enviar o backup:

shell : IP da máquina : allow
shell : IP da outra máquina: allow
shell : ALL : deny

Teve um lugar que eu ainda levantei o firewall, para permitir somente as
máquinas que interessavam acessarem a este serviço.

Crio uma conta e um grupo para cada máquina que vai depositar o backup,
isolando assim cada uma delas, e dou "chmod o-rwx" nos homes destas
contas, para garantir que uma não veja o conteúdo da outra. Este isolamento
é uma medida de segurança, para diminuir o que pode ser lido por um
atacante que tenha comprometido uma das máquinas.

No home de cada conta crio o .rhosts com o seguinte conteúdo:

IP da máquina         root

Assim somente o root da máquina em questão pode fazer qualquer coisa
no destino do bakcup.

No home de cada conta eu crio o diretório backup.

Se não me engano, aqui termina o que tem que ser feito na máquina que
vai receber o backup.

Agora na máquina que vai receber o backup tem que se fazer um ou dois
scripts, para rodar como root. Estes scripts devem rodar como root, para
que tenham acesso a tudo. Eu uso o crontab do root. Ainda crio o diretório
/var/log/backup.

O script para o backup full está abaixo:

--- corte aqui --- cut here --- 8x ---
#!/bin/sh

umask 077

agora=`date '+%Y-%m-%d %H:%M'`
hoje=`date '+%Y-%m-%d'`
dir=/var/log/backup

usuario="conta que representa esta máquina"
destino="endereço da máquina que recebe o backup"

rm      /tmp/fifo 2> /dev/null
mkfifo  /tmp/fifo

sleep 120

echo "$agora" > "$dir"/full.date
cp "$dir"/full.date "$dir"/mensal.date
cp "$dir"/full.date "$dir"/semanal.date
cp "$dir"/full.date "$dir"/diario.date

log="$dir"/bkp.log-"$hoje"

# Rotação do backup.
rsh -l "$usuario" "$destino" rm -r backup/ciclo-2
rsh -l "$usuario" "$destino" mv backup/ciclo-1 backup/ciclo-2
rsh -l "$usuario" "$destino" mv backup/ciclo-0 backup/ciclo-1
rsh -l "$usuario" "$destino" mkdir backup/ciclo-0


rsh -l "$usuario" "$destino" cat '>' backup/ciclo-0/bkp_f-"$hoje".tbz2
< /tmp/fifo

rm /tmp/fifo
) &

cd /
tar -clvSyf /tmp/fifo           \
--exclude $log                  \
--exclude /usr/src              \
--exclude /usr/ports            \
--exclude /usr/obj              \
--exclude /usr/share            \
--exclude /bin                  \
--exclude /sbin                 \
--exclude /etc/defaults         \
--exclude /usr/bin              \
--exclude /usr/sbin             \
/ /usr /var /home > $log

gzip $log &

--- corte aqui --- cut here --- 8x ---

Como pode ver acima, muita coisa é ignorada no backup, mas é proposital,
para poupar disco no destino e por que podem ser restauradas com facilidade.

Outra coisa a notar é que não está usando snapshots. É por que este script
é entigo, e roda em um FreeBSD 4.x.

Para o backup diário uso o seguinte script:

--- corte aqui --- cut here --- 8x ---
#!/bin/sh

umask 077

agora=`date '+%Y-%m-%d %H:%M'`
hoje=`date '+%Y-%m-%d'`
dir=/var/log/backup
partida=`cat "$dir"/semanal.date`

usuario="conta que representa esta máquina"
destino="endereço da máquina que recebe o backup"

rm      /tmp/fifo 2> /dev/null
mkfifo  /tmp/fifo

sleep 120

echo "$agora" > "$dir"/diario.date

log="$dir"/bkp.log-"$hoje"

(
rsh -l "$usuario" "$destino" cat '>' backup/ciclo-0/bkp_d-"$hoje".tbz2
< /tmp/fifo

rm      /tmp/fifo
) &

cd /
tar -clvSyf /tmp/fifo           \
--newer-mtime "$partida"        \
--newer "$partida"              \
--exclude $log                  \
--exclude /usr/src              \
--exclude /usr/ports            \
--exclude /usr/obj              \
--exclude /usr/share            \
--exclude /bin                  \
--exclude /sbin                 \
--exclude /etc/defaults         \
--exclude /usr/bin              \
--exclude /usr/sbin             \
/ /usr /var /home > $log

gzip $log &

--- corte aqui --- cut here --- 8x ---


Estes scripts podem ser melhorados, mas já funcionam bem.

Espero que sejam úteis. Desculpe-me tem enviado para a lista,
mas acho que podem ser úteis a mais de uma pessoa.


Abraços,
   João Rocha.

--
"Sempre se apanha mais com as menores besteiras. Experiência própria."

goffredo em goffredo.eti.br
goffredo em gmail.com
http://www.goffredo.eti.br

_______________________________________________
Freebsd mailing list
Freebsd em fug.com.br
http://mail.fug.com.br/mailman/listinfo/freebsd_fug.com.br




Mais detalhes sobre a lista de discussão freebsd