Mercredi 24 juillet 2019

Grenode peut fournir à ses membres un espace de stockage à des fin de sauvegarde. Ces espaces se trouvent sur la machine gaffe à Toulouse, chez Tetaneutral et sont accessibles en ssh.

Espace de sauvegarde https://www.grenode.net/Services/Espaces_de_sauvegarde/

Le nom DNS à utiliser pour faire des backups est backup.grenode.net.

Caratéristiques

Le principe est de fournir deux comptes un pour réaliser les backups <user> l’autre pour les administrer <user>-admin. Le premier ayant des droits restreints.
Les comptes n’ont pas de mot de passe
Avec le compte <user>-admin, il est possible d’éxécuter n’importe quelle commande sous l’identité <user> via la commande :

sudo -u <user> ma_commande

Ainsi le compte <user>-admin peut changer les clés ssh du compte (et manipuler les fichiers à souhait).
Les connections ssh au compte <user> sont chrootées, et seul sftp est activé (pas de shell).

Le répertoire de données est /srv/backup/<user>/backups/ un lien symbolique pointe dessus dans le compte <user>-admin.

Ajouter un compte de backup

  • créer l’utilisateur et son home
export BKP_USER=<user>
sudo adduser $BKP_USER --gecos $BKP_USER \
                       --home /srv/backup/$BKP_USER \
                       --no-create-home \
                       --disabled-password \
                       --shell /bin/false
sudo addgroup $BKP_USER backup-user
sudo mkdir /srv/backup/$BKP_USER/
sudo chown root:$BKP_USER /srv/backup/$BKP_USER/
sudo chmod 750  /srv/backup/$BKP_USER/
  • configurer ssh avec les clés nécessaires
sudo mkdir /srv/backup/$BKP_USER/.ssh
sudo chown $BKP_USER: /srv/backup/$BKP_USER/.ssh
sudo chmod 550 /srv/backup/$BKP_USER/.ssh
echo "<CLE_SSH_PUBLIQUE>" | sudo tee -a /srv/backup/$BKP_USER/.ssh/authorized_keys
sudo chown $BKP_USER: /srv/backup/$BKP_USER/.ssh/authorized_keys
sudo chmod 440 /srv/backup/$BKP_USER/.ssh/authorized_keys
  • créer un utilisateur <user>-admin pour l’administration de ses backups (installation de cron, etc.).
sudo adduser ${BKP_USER}-admin --gecos $BKP_USER \
                               --home /srv/backup/${BKP_USER}-admin \
                               --disabled-password
sudo adduser ${BKP_USER}-admin ${BKP_USER}
sudo adduser ${BKP_USER}-admin backup-admin


sudo chmod 770 /srv/backup/${BKP_USER}-admin
  • configurer ssh avec les clés nécessaires
sudo mkdir /srv/backup/${BKP_USER}-admin/.ssh
sudo chown ${BKP_USER}-admin: /srv/backup/${BKP_USER}-admin/.ssh
sudo chmod 700 /srv/backup/${BKP_USER}-admin/.ssh
sudo su ${BKP_USER}-admin -c \
    "echo <CLE_SSH_PUBLIQUE> >> /srv/backup/${BKP_USER}-admin/.ssh/authorized_keys"
  • permettre au compte ${BKP_USER}-admin de modifier les clés ssh de ${BKP_USER}
    On utilise sudo en permetant à ${BKP_USER}-admin qui est membre du groupe ${BKP_USER} d’exécuter n’importe quelle commande en tant que ${BKP_USER} sans mot de passe. Pour cela il est possible de rajouter la ligne suivante :
%${BKP_USER} ALL=($BKP_USER) NOPASSWD: ALL
  • créer le répertoire de données
    Le répertoire qui contient les données de sauvegarde, a le bit sticky activé : cela force a ce ce soit le prorpiétaire du fichier ou du répertoire qui puisse le supprimer ou de le renommer. Son propriétaire est ${BKP_USER}-admin et son groupe est ${BKP_USER}.
sudo mkdir /srv/backup/$BKP_USER/backups
sudo chown ${BKP_USER}-admin:$BKP_USER /srv/backup/$BKP_USER/backups
sudo chmod 1770 /srv/backup/$BKP_USER/backups
sudo ln -s ../${BKP_USER}/backups /srv/backup/${BKP_USER}-admin/backups

Cela permet par exemple, par un simple changement de propriétaire et de droit, d’interdire toute modification des sauvegardes par le compte ${BKP_USER} tout en lui permetant de les lire.

Détails de configuration

Les backups consistent à fournir un espace de stockage accessible en sftp. La partition stockant les données se trouve sur /srv/backup/<user>/. Chaque utilisateur dispose d’un compte unix dont le shell est /bin/false. OpenSSH permet de chrooter un utilisateur dans un environnement propre à un compte unix.

Les opérations faites :

  • ajout/modification dans le fichier /etc/ssh/sshd_config :
Subsystem sftp internal-sftp


Match Group backup-user
    ChrootDirectory /srv/backup/%u
    ForceCommand internal-sftp
    AllowTCPForwarding no
    X11Forwarding no
    PubkeyAuthentication yes
    PasswordAuthentication no


Match Group backup-admin
    AllowTCPForwarding no
    X11Forwarding no
    PubkeyAuthentication yes
    PasswordAuthentication no


Match Group borgbackup-user
    AllowTCPForwarding no
    X11Forwarding no
    PubkeyAuthentication yes
    PasswordAuthentication no

Le subsystem internal-sftp est nécessaire pour chrooté les environnements des utilisateurs.

  • créer le groupe backup-user et le group backup-admin
sudo addgroup backup-user
sudo addgroup backup-admin
sudo addgroup borgbackup-user

Backups avec borg

Borg est une solution de sauvegarde permettant le chiffrement, la dé-duplication.

  • Pour quelques statistiques, Tetaneutral.net a fait quelques tests sur attic (la version avant le fork).

Configuration initiale

La configuration est la même que le début de cette documentation, à la seule différence que le $BKP_USER n’est pas dans le groupe backup-user mais borgbackup-user.

Sur le serveur de sauvegardes

Afin d’avoir une version homogène de borg sur les serveur à sauvegarder et sur le serveur de sauvegarde, on utilise une version binaire de borg, celle-ci est placé dans le répertoire bin de l’utilisateur $BKP_USER.

export MACHINE=<machine.fqdn>
sudo mkdir /srv/backup/$BKP_USER/bin
sudo chown ${BKP_USER}-admin:$BKP_USER /srv/backup/$BKP_USER/bin
sudo wget -nv https://github.com/borgbackup/borg/releases/download/1.0.9/borg-linux64 -O /srv/backup/$BKP_USER/bin/borg
sudo echo 'PATH=$HOME/bin:$PATH' > /srv/backup/$BKP_USER/.bashrc

Borg dispose de signatures GPG (asc) qui permettent de vérifier les binaires de borg.

On pré-crée enfin le répertoire où seront stockés les sauvegardes de la machine source.

sudo chown ${BKP_USER}: /srv/backup/$BKP_USER/backups/$MACHINE
sudo chown 700 /srv/backup/$BKP_USER/backups/$MACHINE

Sur le serveur à sauvegarder

Pour la partie transport, nous utilisons SSH, il faut donc créer une clé sur la machine à sauvegarder, et ajouter cette clé sur le serveur de sauvegardes, on limite les commandes à effectuer via la directive command du authorized_keys.

apt install borgbackup
ssh-keygen -t rsa -b 4096 -C "Borgbackup $MACHINE"

Édition du fichier /srv/backup/$BKP_USER/.ssh/authorized_keys

# $MACHINE
command="borg serve --restrict-to-path $HOME/backups/$MACHINE" ssh-rsa AAAA…9Q== $MACHINE

Initialisation et mise en place des sauvegardes (sur la machine à sauvegarder)

Lors de cette phase, les fichiers nécessaires au fonctionnement de borg sont crées sur la machine de sauvegarde, il est aussi demandé une phrase de passe (pour chiffrer les sauvegardes)

borg init $BKP_USER@backup.grenode.net:/srv/backup/$BKP_USER/backups/$MACHINE

Nous allons ensuite lancer manuellement la première sauvegarde, dans cet exemple nous sauvegardons uniquement les répertoires /etc, /srv et /var/backups, il est cependant tout à fait possible de sauvegarder toute la machine et d’exclure certaines fichiers (/dev et autres) via l’argument –exclude-from .

borg create -x $BKP_USER@backup.grenode.net:/srv/backup/$BKP_USER/backups/$MACHINE::{now:%Y-%m-%d} /etc /srv /var/backups

Enfin, pour automatiser les sauvegardes, nous pouvons mettre en place un cron tout bête, ou alors utiliser un système plus perfectionné comme backupninja, pour par exemple lancer des dump de bases de données avant de lancer la sauvegarde…

Les infos du point de sauvegarde ainsi que le mot de passe de celui-ci sont enregistré dans /etc/.borg afin de les partager avec checkmk (voir Supervision-checkmk)

# /etc/.borg
export BORG_PASSPHRASE='<phrase de passe>'
export BORG_REPO='$BKP_USER@backup.grenode.net:/srv/backup/$BKP_USER/backups/$MACHINE'

On n’oublie pas de restreindre les droits sur ce fichier.

chmod 640 /etc/.borg
chown root:check_mk_agent /etc/.borg

Dans la partie suivante, nous allons juste faire un cron simple dans /etc/cron.daily/borg, nous éditons donc le fichier.

#!/bin/bash
# /etc/cron.daily/borg
source /etc/.borg
borg create -x ::{now:%Y-%m-%d} /etc /srv /var/backups
borg prune -d 7 -w 4 -m 6 -y 1

Enfin, on modifie les permissions sur le fichier cron.

chmod 750 /etc/cron.daily/borg