Automatización de copias de seguridad
Me gustaría implementar una solución de respaldo con copias de datos de varios directorios desde un servidor web (WebServer) a un servidor de respaldo local (BackupServer). La copia de seguridad debe ejecutarse desatendida y, por lo tanto, me gustaría utilizar una autenticación basada en clave con una clave privada sin contraseña.
Rsync privilegiado
Los directorios que quiero respaldar solo pueden ser leídos por un usuario privilegiado. Me gustaría usar rsync para copiar los archivos. Creé un usuario de respaldo dedicado y permití que el usuario ejecute rsync con sudo sin que se le solicite una contraseña con la regla visudo:
backup-user ALL = NOPASSWD: /usr/bin/rsync
Consideraciones de Seguridad
Me gustaría mejorar la seguridad al restringir los comandos que el usuario de respaldo puede ejecutar agregando una lista de comandos al archivo autorizado_keys del servidor web. Instalé rrsync como se menciona en esta publicación .
command="/usr/bin/rrsync",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-rsa AAAA134143NzaC1yc...
Rrsync espera un subdirectorio
A diferencia de rsync normal, rrsync espera que se proporcione un subdirectorio en el archivo de clave autorizado, como se describe en esta publicación de 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
Esta restricción funciona pero solo me permite hacer una copia de seguridad de un directorio específico, a saber, / var / backup / client1 /
Me gustaría proporcionar los directorios que quiero respaldar desde BackupServer en el comando rsync. ¿Existe la posibilidad de usar rrsync exactamente como rsync, por ejemplo:
rsync -avze ssh --rsync-path='sudo rrsync' [email protected]:/media/data /backups/Server/
Aclaracion adicional
Soy consciente de que la parte command = "..." en Authorized_hosts limita los comandos ejecutables para este usuario exactamente a los proporcionados, pero con el rsync normal, puedo hacer algo como esto para proporcionar la ruta que quiero respaldar como un parámetro:
command="/usr/bin/rsync --server --sender -vlogDtpre.is . ${SSH_ORIGINAL_COMMAND//* \//\/}"
Esto no funciona con rrsync.
Solución aceptada
Aunque técnicamente no es la respuesta definitiva a la pregunta, creo que la solución publicada por Gilles es un enfoque muy agradable. Creé una carpeta raíz para todas las vistas del directorio real que quiero respaldar. Por esta razón, puedo restringir de forma segura la autenticación solo a 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
Crear vistas (desaparecidas después del reinicio)
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
Versión Fstab
/home/stefan/Scans /mnt/Backups-Rsync-Readonly/VAR-WWW fuse.bindfs perms=0000:u=rD,force-user=rsync-backup 0 0
Authorized_keys
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=
La opción enauthorized_keys
acepta solo un comando que se ejecuta. Eso es.Respuestas:
Una posibilidad sería crear una vista de solo lectura de los directorios que desea que ese usuario dedicado pueda realizar copias de seguridad, con bindfs . No uses sudo en absoluto; crea
rrsync
el único comando que está permitido para este usuario. Configuración de una sola vez:Configuración después de cada arranque:
O líneas correspondientes en
/etc/fstab
:A continuación, configurar el usuario de copia de seguridad para funcionar
rsync
en/somewhere/backup-views
.fuente