Assine a Lista Dicas-L
Receba diariamente por email as dicas
de informática publicadas neste site
Para se descadastrar, clique aqui.
Sistema simples de Backup via Scp(secure copy)
Colaboração: Aldemari Borges
Data de Publicação: 02 de Julho de 2009
Esta proposta visa criar um sistema de backup baseado em Shell Script, além dos comandos nativos do Linux.
Objetivos desta solução
- ser simples de configurar
- utilizar o protocolo scp(cópia remota criptografada)
- utilizar o empacotador TAR e o compressor GZIP
- haver mascaramento da data e hora que o backup foi gerado no arquivo gerado(.tar.gz)
- Os Backups serão gerados em disco rígido inicialmente, mas podem ser gravados em outra mídia
Objetivos futuros(help)
- enviar relatório de erros e acertos de backup's via email
- haver alguma interface web(php, python, ruby ou perl) que faça a interação de definições das variáveis
- Haver interface web(php, python, ruby ou perl) que gere relatórios dos arquivos gerados de acertos e erros
- Haver algum recurso de reconhecimento de não crescimento de tamanho de determinado arquivo de backup
- Enviar email quando o servidor de backup atingir 90% de utilização de seu espaço em disco
- Haver possibilidade de gravação em Fitas DAT
ARQUITETURA
- Cada cliente deverá possuir o shell script que deverá rodar agendado via cron
- Cada cliente será encarregado de enviar o arquivo 'backupeado' para o serividor principal(repositório)
- O servidor deverá adicionar em sua lista de autorização de chaves públicas, cada servidor cliente
Vamos ao passos:
1. Criação do usuário que fará a tarefa dos backups:
No servidor cliente(aquele que enviará seu próprio backup para o repositório remoto):
root@clienthost:~# adduser backscp
Obs: Colocar senha bastante difícil, já que este usuário existirá em todas as máquinas.
Obs: Há a possibilidade de restringir o acesso via ssh por hosts e users(ver manual do openssh server)
2. Criação das chaves assimétricas:
Afim de criarmos uma solução independente das chaves do host criadas em
/etc/ssh, iremos criar uma chave específica para o usuário em questão.
Estas chaves se localizarão no ~.ssh (diretório local do usuário backscp,
na pasta oculta .ssh).
Digite o comando abaixo:
backscp@clienthost:~$ ssh-keygen
Tecle 'Enter' até a finalização do processo de criação como abaixo:
Generating public/private rsa key pair. Enter file in which to save the key (/home/backscp/.ssh/id_rsa): Created directory '/home/backscp/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/backscp/.ssh/id_rsa. Your public key has been saved in /home/backscp/.ssh/id_rsa.pub. The key fingerprint is: fc:d5:81:59:96:cb:a7:e7:81:19:93:39:30:41:01:b3 backscp@borges The key's randomart image is: +--[ RSA 2048]----+ | oo+o o. | | oo =. | | E =.+. | | . Bo..| | S . Bo | | . . o...| | . o.| | .| | | +-----------------+
O comando acima gerou uma chave criptográfica de 2048 bits, utilizando o algoritmo RSA.
Temos então:
- Chave privada(nesta não se mexe): ~.ssh/id_rsa
- Chave pública: ~.ssh/id_rsa.pub
3. Enviar a chave pública para o servidor que será o repositório
backscp@clienthost:~$ scp .ssh/id_rsa.pub backscp@repositoriohost:~
No servidor remoto(REPOSITÓRIO):
com o usuário backscp (como sugestão apenas):
backscp@repositoriohost:~$ mkdir ~.ssh backscp@repositoriohost:~$ cat id_rsa.pub »» .ssh/authorized_keys
PRONTO!!! Estabelecemos a relação de confiança entre as máquinas via ssh
Para testar:
No servidor remoto(repositoriohost) apague o ~/id_rsa.pub
No servidor cliente(clienthost) re-envie o arquivo do id_rsa.pub:
scp .ssh/id_rsa.pub backscp@repositoriohost:~
Não deverá ser solicitada a senha, o arquivo deverá ser copiado de forma transparente.
OBSERVAÇÃO
Para cada clienthost (máquina que pretende-se backapear), deverá ser
adicionado ao arquivo autorized_keys do servidor repositório
(cat id_rsa.pub >> .ssh/authorized_keys)
Vantagens até o momento:
Poderíamos fazer mapeamentos NFS ou CIFS, no entanto, haveria sempre sessões
abertas no cliente/servidor. O que de certa forma, para redes maiores, poderá
afetar em alguns milisegundos. Com a solução de envio via scp (secure copy),
apenas será aberta a sessão durante a sua real utilização.
Há a outra vantagem em relação a segurança, pois os dados trafegam criptografados.
Continuando.....
Criemos estes diretórios conforme abaixo em todas as máquinas clientes:
root@clienthost:~# mkdir -p /backup/log root@clienthost:~# chown -R backscp /backup
Abaixo o shell script sugerido para fazer as cópias de segurança nos servidores clientes:
#!/bin/sh # Script para realização de backup's completos # Por Aldemari Borges(aldemari@gmail.com» export PATH=$PATH:/bin:/usr/bin:/usr/local/bin # Definicao de data e horario DATA=`date +%a%d%m%y` HORA=`date +%Hh%Mm%Ss` # Máscara para o arquivo a ser gerado NOMESERVIDOR=portal # Diretório ou arquivo para ser 'backapeado' BACKORIGEM=/home/backscp/examples.desktop # Local remoto aonde os arquivos serão enviados(Lembre-se de criar o diretório de destino) BACKDESTINO=/home/backscp/$NOMESERVIDOR # Criação do pacote tar -zcf $NOMESERVIDOR.tar.gz $BACKORIGEM date » /home/backscp/log/$NOMESERVIDOR\-$DATA\-$HORA.log # Esta linha abaixo evita erros de manipulacao de horario no momento do backup mv $NOMESERVIDOR.tar.gz $NOMESERVIDOR\-$DATA\-$HORA.tar.gz # Copiando para o repositorio remoto scp $NOMESERVIDOR\-$DATA\-$HORA.tar.gz backscp@10.90.1.33:$BACKDESTINO # Remover arquivo local rm $NOMESERVIDOR\-$DATA\-$HORA.tar.gz
4. Visualizando os arquivos pela WEB
Para tanto, sugerimos a utilização do QuiXplorer:
4.1. Procedimentos:
backscp@repositoriohost:~# apt-get install apache2-php5 backscp@repositoriohost:~# cd /var/www backscp@repositoriohost:~# wget http://ufpr.dl.sourceforge.net/sourceforge/quixplorer/quixplorer_2_3_1.tar.bz2 backscp@repositoriohost:~# tar -zxvf tar -jxvf quixplorer_2_3_1.tar.bz2 backscp@repositoriohost:~# mv quixplorer_2_3_1 phpexplorer
4.2. Configuração do quiXplorer
Vamos criar um virtual host no apache para facilitar sua visualização:
backscp@repositoriohost:~# cd /etc/apache2/sites-available
Edite um arquivo e salve com o nome de phpexplorer, com o conteúdo abaixo(e suas respectivas alterações):
<VirtualHost *:80>
ServerAdmin sysadm@seudomain.com.br
DocumentRoot /var/www/phpexplorer
ServerName phpexplorer.seudomain.com.br
ServerAlias phpexplorer.seudomain.com.br
ErrorLog /var/log/apache2/phpexplorer-error_log
CustomLog /var/log/apache2/phpexplorer-access_log combined
</VirtualHost>
Após isto, vamos inserir o novo subdomínio em nosso sistema, como abaixo:
backscp@repositoriohost:~# a2ensite phpexplorer backscp@repositoriohost:~# /etc/init.d/apache2 reload
OBS: Não equecer de fazer as modificações necessárias no servidor dns interno da sua rede.
Veja a relação completa dos artigos de Aldemari Borges
Referências Adicionais
Referências adicionais sobre os assuntos abordados neste site podem ser encontradas em nossa Bibliografia.
Avalie esta dica
Opinião dos Leitores
31 Jul 2009, 10:49
Achei um serviço que tem um pouco a ver com backup, mas esse é para usuários domésticos...
http://www.pcseguro.com.br/backup/backup_online_ilimitado.html
Acho que em breve eles devem lançar algo para empresas...
Iria ajudar muito...
Abraços,
Marcus
09 Jul 2009, 16:11
- depois de copiar via scp testar o código de retorno se está ok ($? = 0) caso contrário poderia tentar mais duas vezes caso persista o erro enviar uma e-mail de erro e abortar o processo (exit 1).
[]s
Claudio
09 Jul 2009, 09:55
utilize o comando 'time' antes do comando de compactação. Depois utilize algum comando que trabalhe com strings para pegar a informação desejada como o cut ou xargs.
04 Jul 2009, 12:29
[]'s
19 Jun 2009, 17:23
19 Jun 2009, 10:25
Tenho uma rotina de backup aqui na empresa que funciona perfeitamente. Faz o a copia dos aquivos, e ao termino da copia me envia um email "BACKUP CONCLUIDO", Só que esse email que eu recebo apos o termino do backup me envia uma pagina em HTML que eu mesmo fiz. O que eu gostaria é de enviar um arquivo.log do meu backup contendo: data hora tempo gasto etc... para enviar esse arquivo eu ja tenho a solução pois vol usar o mesmo procedimento que uso para enviar a pagina html. Só que a minha duvida é com relação a como colocar DATA HORA e TEMPO GASTO NO BACKUP.
Vou descrever parte do meu script (só a parte de copia e compactacao):
###########################################################
#!/bin/bash
### BACKUP SERVER REDE LINUX SCRIPTS ###
### ADMINISTRADOR REDE ANDRE G. MOSOLI ###
### MSN COMERCIAL "MOSOLI.COMERCIAL@HOTMAIL.COM ###
### ROTINA BACKUP PARA ANALISE ###
# MONTA UNIDADE DE REDE
mount -t cifs //192.168.100.200/bkp /usr/local/backup -o username=backup,password=backup
##### DEFINE VARIAVEIS 5 SCRIPTS ####
DIR_ORIG5=/home/scripts/
DIR_DEST5=/usr/local/backup/scripts/
BKP_NAME5=scripts-`date +%d-%m-%Y-%H%M`
tar -cjf ${DIR_DEST5}${BKP_NAME5}"tar.bz2" ${DIR_ORIG5}
# DESMONTA UNIDADE DE REDE
umount -t cifs //192.168.100.200/bkp /usr/local/backup/
###########################################################
Veja bem na linhda: BKP_NAME5=scripts-`date +%d-%m-%Y-%H%M`
estou definindo o nome do arquivo de backup e da data para o nome do arquivo tar.
O que eu gostaria é de definir outra variavel que use o #time para dizer quanto tempo foi gasto com a rotina de backup.
Por exemplo1 #time ./backup.sh
Só que nesse exemplo acima a saida do time sai na tela, então eu teria que fazer o seguinte:
exemplo2 #time ./backup.sh >> backup.log
Como demonstrei no exemplo2 eu direcionei (se eu estiver errado me corrijam) a saida do comando time para o backup.log só que ainda sim a saida do comando time aparece na tela e nao é direcionada para o backup.log. Entao gostaria de saber como posso fazer essa saida e se é possivel isso.
msn a disposicao
mosoli.comercial@hotmail.com
Obrigado!




