você está aqui: Home  → Arquivo de Mensagens Curso Gratuito sobre Expressões Regulares, com o Prof.  Julio Neves

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