Automatizando backups
Gostaria de implementar uma solução de backup com dados de cópias de vários diretórios de um servidor Web (WebServer) para um servidor de backup local (BackupServer). O backup deve ser executado sem supervisão e, portanto, eu gostaria de usar uma autenticação baseada em chave com uma chave privada sem senha.
Rsync Privilegiado
Os diretórios que eu quero fazer backup são legíveis apenas por um usuário privilegiado. Eu gostaria de usar o rsync para copiar os arquivos. Criei um usuário de backup dedicado e permiti que o usuário execute o rsync com o sudo sem ser solicitada uma senha com a regra de visudo:
backup-user ALL = NOPASSWD: /usr/bin/rsync
Considerações de segurança
Gostaria de melhorar a segurança restringindo os comandos que o usuário de backup pode executar, adicionando uma lista de comandos ao arquivo allowed_keys do WebServer. Eu instalei o rrsync conforme mencionado neste post .
command="/usr/bin/rrsync",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-rsa AAAA134143NzaC1yc...
O Rrsync espera um subdiretório
Ao contrário do rsync normal, o rrsync espera que um subdiretório seja fornecido no arquivo de chave autorizado, conforme descrito nesta postagem do blog
command="/usr/share/rsync/rrsync /var/backup/client1/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-rsa
Essa restrição funciona, mas só me permite fazer backup de um diretório específico, a saber / var / backup / client1 /
Gostaria de fornecer os diretórios que quero fazer backup do BackupServer no comando rsync. Existe a possibilidade de usar o rrsync exatamente como o rsync, por exemplo:
rsync -avze ssh --rsync-path='sudo rrsync' backupuser@111.222.33.44:/media/data /backups/Server/
Esclarecimentos adicionais
Estou ciente de que a parte command = "..." no autorizado_hosts limita os comandos executáveis desse usuário exatamente aos fornecidos, mas com o rsync normal, posso fazer algo assim para fornecer o caminho que eu quero fazer backup como um parâmetro:
command="/usr/bin/rsync --server --sender -vlogDtpre.is . ${SSH_ORIGINAL_COMMAND//* \//\/}"
Isso não funciona com o rrsync.
Solução Aceita
Embora tecnicamente não seja a resposta definitiva para a pergunta, acho que a solução postada por Gilles é uma abordagem muito agradável. Criei uma pasta raiz para todas as visualizações do diretório real que eu quero fazer backup. Por esse motivo, posso restringir com segurança a autenticação apenas ao rrsync.
One time todo
sudo mkdir /mnt/Backups-Rsync-Readonly
sudo chown -R rsync-backup /mnt/Backups-Rsync-Readonly
sudo mkdir /mnt/Backups-Rsync-Readonly/VAR-WWW
sudo mkdir /mnt/Backups-Rsync-Readonly/MySQL-Backups
sudo setfacl -m u:rsync-backup:rx /mnt/Backups-Rsync-Readonly/
sudo setfacl -m u:rsync-backup:rx /mnt/Backups-Rsync-Readonly/MySQL-Backups
sudo setfacl -m u:rsync-backup:rx /mnt/Backups-Rsync-Readonly/VAR-WWW
Criar visualizações (removidas após a reinicialização)
sudo bindfs -o perms=0000:u=rD,force-user=rsync-backup /var/www /mnt/Backups-Rsync-Readonly/VAR-WWW
sudo bindfs -o perms=0000:u=rD,force-user=rsync-backup /MySQL-Dumps /mnt/Backups-Rsync-Readonly/MySQL-Backups
Versão Fstab
/home/stefan/Scans /mnt/Backups-Rsync-Readonly/VAR-WWW fuse.bindfs perms=0000:u=rD,force-user=rsync-backup 0 0
Teclas autorizadas
command="/usr/bin/rrsync -ro /mnt/Backups-Rsync-Readonly",from="192.168.0.10",no-pty,no-agent-forwarding,no-port-forwarding,no-X11-forwarding ssh-rsa AAAAB
command=
A opção inauthorized_keys
aceita apenas um comando que é executado. É isso.