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.