Autoriser le script rsync restreint (rrsync) pour les répertoires arbitraires avec des clés autorisées

10

Automatisation des sauvegardes

Je souhaite implémenter une solution de sauvegarde avec copie des données de divers répertoires d'un serveur Web (WebServer) vers un serveur de sauvegarde local (BackupServer). La sauvegarde doit fonctionner sans surveillance et je voudrais donc utiliser une authentification basée sur une clé avec une clé privée sans mot de passe.

Rsync privilégié

Les répertoires que je souhaite sauvegarder ne sont lisibles que par un utilisateur privilégié. Je voudrais utiliser rsync pour copier les fichiers. J'ai créé un utilisateur de sauvegarde dédié et autorise l'utilisateur à exécuter rsync avec sudo sans être invité à entrer un mot de passe avec la règle visudo:

backup-user ALL = NOPASSWD: /usr/bin/rsync

Considérations de sécurité

Je voudrais améliorer la sécurité en restreignant les commandes que l'utilisateur de sauvegarde peut exécuter en ajoutant une liste de commandes au fichier authorized_keys du WebServer. J'ai installé rrsync comme mentionné dans cet article .

command="/usr/bin/rrsync",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-rsa AAAA134143NzaC1yc...

Rrsync attend un sous-répertoire

Contrairement au rsync normal, le rrsync s'attend à ce qu'un sous-répertoire soit fourni dans le fichier de clé autorisé, comme décrit dans ce billet 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 

Cette restriction fonctionne mais elle ne me permet de sauvegarder qu'un répertoire spécifique à savoir le / var / backup / client1 /

Je voudrais fournir les répertoires que je veux sauvegarder à partir du BackupServer dans la commande rsync. Existe-t-il une possibilité d'utiliser rrsync exactement comme rsync, par exemple:

rsync -avze ssh --rsync-path='sudo rrsync' [email protected]:/media/data  /backups/Server/

Clarification supplémentaire

Je suis conscient que la partie command = "..." dans authorized_hosts limite les commandes exécutables pour cet utilisateur à exactement celles fournies, mais avec le rsync normal, je peux faire quelque chose comme ça pour fournir le chemin que je veux sauvegarder comme un paramètre:

command="/usr/bin/rsync --server --sender -vlogDtpre.is . ${SSH_ORIGINAL_COMMAND//* \//\/}"

Cela ne fonctionne pas avec rrsync.

Solution acceptée

Bien que techniquement pas la réponse définitive à la question, je pense que la solution proposée par Gilles est une très belle approche. J'ai créé un dossier racine pour toutes les vues du répertoire réel que je veux sauvegarder. Pour cette raison, je peux restreindre en toute sécurité l'authentification à rrsync uniquement.

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

Créer des vues (disparues après le redémarrage)

    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

Version Fstab

    /home/stefan/Scans    /mnt/Backups-Rsync-Readonly/VAR-WWW fuse.bindfs perms=0000:u=rD,force-user=rsync-backup 0   0

Clés_autorisées

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
Stefan
la source
Et la question est? command=L'option in authorized_keysaccepte une seule commande qui est exécutée. C'est ça.
Jakuje
J'ai essayé de clarifier la question
Stefan

Réponses:

6

Une possibilité serait de créer une vue en lecture seule des répertoires que vous souhaitez que cet utilisateur dédié puisse sauvegarder, avec bindfs . N'utilisez pas du tout sudo; créer rrsyncla seule commande autorisée à cet utilisateur. Configuration unique:

mkdir /somewhere/backup-views /somewhere/backup-views/dir1 /somewhere/backup-views/dir2
chmod 700 /somewhere/backup-views
setfacl -m u:rx:backup-user /somewhere/backup-views

Configuration après chaque démarrage:

bindfs -o perms=a+r-w /actual/dir1 /somewhere/backup-views/dir1
bindfs -o perms=a+r-w /actual/dir2 /somewhere/backup-views/dir2

Ou des lignes correspondantes dans /etc/fstab:

/actual/dir1 /somewhere/backup-views/dir1 bindfs perms=a+r-w
/actual/dir2 /somewhere/backup-views/dir2 bindfs perms=a+r-w

Ensuite , mettre en place l'utilisateur sauvegarde pour exécuter rsyncsur /somewhere/backup-views.

Gilles 'SO- arrête d'être méchant'
la source