LINUX:SSH et RSYNC
→ retour à RSYNC-Rassemblement sur une autre machine
But
Dans les opérations suivantes nous allons utiliser le protocole SSH seul ou en conjonction avec RSYNC. Nous allons donc configurer celui-ci et l'utilisateur concerné par notre projet sur la machine distante.
Nous désignerons comme machine distante ou serveur, celle où on se connecte via le protocole SSH et où on fait les sauvegardes et la machine émettrice ou clienr, celle qui se connecte à celle machine serveur et qui sauvegarde ses données sur cette même machine distante.
En premier lieu, l'utilisateur concerné par le projet sera configuré sur la .
En second lieu, nous allons configurer le protocole SSH.
Enfin le paramétrage de SSH pour cet utilisateur sera effectué.
Utilisateur
Cette étape se fait sur la machine serveur.
Création de l'utilisateur
Nous avons nommé cet utilisateur "sauvegarde". Il ne pourra pas s'authentifier par mot de passe. Son répertoire racine est "/produc/sauvegarde/". Il appartient au nouveau groupe créé "sauvegarde". On pourrait les créer en ligne de commande mais nous avons choisit d'ajouter directement ces informations dans les fichiers concernés et de créer le répertoire dédié avec ses droits. Attention ces ajouts doivent être faits via un éditeur de texte. Cette opération est effectuée sur la machine distante.
Débutons par la création du groupe "sauvegarde".
On ajoute la ligne suivante dans le fichier "/etc/group":
sauvegarde:x:1001:
Attention: L'ID du groupe "1001" doit être unique, sinon adaptez-le.
On ajoute ensuite la ligne suivante dans le fichier "/etc/gshadow":
sauvegarde:!::
Ensuite vient la création de l'utilisateur.
On ajoute la ligne suivante dans le fichier "/etc/passwd":
sauvegarde:x:1001:1001:Sauvegarde:/produc/sauvegarde:/bin/bash
Attention: Nous faisons la même remarque que pour l'ID de groupe (le second "1001") concernant l'ID de l'utilisateur (le premier "1001").
On ajoute ensuite la ligne suivante dans le fichier "/etc/shadow":
sauvegarde:!!:18860:0:99999:7:::
On remarque que l'utilisation du mot de passe est désactivé.
Enfin il faut créer son répertoire racine et adapter les privilèges:
mkdir /produc/sauvegarde chmod -R 700 /produc/sauvegarde chown -R sauvegarde:sauvegarde /produc/sauvegarde
Droit ROOT
Dans le projet, l'utilisateur "sauvegarde" doit pouvoir pouvoir éteindre la machine (programme "init") or ce droit est réservé à l'utilisateur "root". De plus ceci doit pouvoir se faire sans l'aval du mot de passe. Pour ce faire, il faut ajouter ce droit dans le fichier "/etc/sudoers":
sauvegarde ALL= NOPASSWD: /usr/sbin/init
Cette opération est effectuée sur la machine distante. Le paramètre "ALL" doit être remplacé par le nom de la machine locale ou son adresse IP si ce fichier est partagé vers différentes machines.
SSH
Cette seconde étape se fait aussi sur cette machine serveur. Elle consiste a mettre en place un serveur SSH propre à notre projet.
Fichier de configuration
On commence par créer un fichier de configuration. Le fichier de configuration natif se situe sans le répertoire "/etc/ssh" et se nomme "sshd_config"; il utilise le port 22. Notre but est d'utiliser un autre port, le 6333 et nous désirons que seul l'utilisateur "sauvegarde" créé ci-dessus y accède seulement via une clé d'authentification. Seule la machine client ayant l'adresse IP 192.168.1.2 peut y accéder. Nous nommerons ce fichier "sshd6333_config".
L'option PidFile est ajouté. Elle définit le nom du fichier contenant le n° de ce processus SSHD. Il est conseillé de l'ajouter surtout dans le cas où vous lancez un autre service SSHD classique.
Voici sont contenu:
Include /etc/ssh/sshd_config.d/*.conf # port personnalisé Port 6333 # limiter à IPV4 ListenAddress 0.0.0.0 LogLevel VERBOSE # nom du fichier contenant le PID du service PidFile /var/run/sshd6333.pid # root ne sait pas se connecter PermitRootLogin no # maximum 3 essais de connexion MaxAuthTries 3 MaxSessions 2 # accepte les clés d'authentification PubkeyAuthentication yes # les clés publiques de l'utilisateur sont sur le serveur dans son profil dans ce fichier AuthorizedKeysFile .ssh/authorized_keys # login/password unix désactivé PasswordAuthentication no # password vide refusé PermitEmptyPasswords no ChallengeResponseAuthentication no # forwarding désactivé par défaut AllowTcpForwarding no # X11 forwarding désactivé X11Forwarding no AllowAgentForwarding no X11UseLocalhost no # sftp désactivé #Subsystem sftp /usr/libexec/openssh/sftp-server TCPKeepAlive no ClientAliveInterval 300 ClientAliveCountMax 1 PermitTTY no # limité à l'utilisateur sauvegarde à partir de la machine ayant l'adresse IP 192.168.1.2 AllowUsers sauvegarde@192.168.1.2
Service
Il faut ensuite créer ce service.
On crée dans le répertoire "/lib/systemd/system" le fichier "sshd6333.service" sur base du service natif SSH.
Voici son contenu:
[Unit] Description=OpenSSH server daemon (6333) Documentation=man:sshd(8) man:sshd_config(5) After=network.target sshd-keygen.target Wants=sshd-keygen.target [Service] Type=notify EnvironmentFile=-/etc/sysconfig/sshd ExecStart=/usr/sbin/sshd -D -f /etc/ssh/sshd6333_config $OPTIONS ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartSec=42s [Install] WantedBy=multi-user.target
La seule différence se situe au niveau de l'appel au fichier de configuration créé ci-dessus.
Maintenant il faut activer ce service.
On commence par recharger la configuration de "systemd" car on vient de la modifier avec la commande suivante:
systemctl daemon-reload
On active le nouveau service par son nom de fichier:
systemctl enable sshd6333.service
Enfin on le lance:
systemctl start sshd6333.service
On peut vérifier que ce port est actif par la commande:
netstat -natp | grep 6333
qui donne:
tcp 0 0 0.0.0.0:6333 0.0.0.0:* LISTEN 836/sshd: /usr/sbin
Si votre firewall est actif, n'oubliez pas d'ajouter l'accès dans la table FILTER d'IPTABLES:
-A INPUT -p tcp -m tcp --dport 6333 -s 192.168.1.2 -m conntrack --ctstate NEW -j ACCEPT
SSH et utilisateur
Création des clés privée et publique
Le serveur SSH demande une authentification par clé. Idéalement ce couple de clés devraient être générée sur la machine client pour des raisons de sécurité; une clé privée doit être protégée. Mais tout autre machine peut le faire.
Plaçons nous sur la machine client dans le répertoire "/manager/sauvegarde" et lançons la commande:
ssh-keygen -t rsa -b 2048 -f key/serveur-sauvegarde-rsync-key
Nous avions créé un sous-répertoire "key" où vont se placer nos deux clés:
- la clé privée "serveur-sauvegarde-rsync-key"
- la clé publique "serveur-sauvegarde-rsync-key.pub"
Le répertoire et les clés doivent être protégés:
chmod 700 key cd key chmod 600 *
La clé privée sera utilisée par le client SSH sur la machine client.
On doit transférer la clé publique sur la machine serveur dans le sous-répertoire ".ssh" du répertoire racine de l'utilisateur "sauvegarde", c'est à dire dans le répertoire "/produc/sauvegarde/.ssh". Ce fichier doit être renommé "authorized_keys" comme spécifié dans le fichier de configuration du serveur SSH. Si nécessaire, ce fichier peut contenir plusieurs clés, une par ligne mais toutes différentes.
Le répertoire et ce fichier doivent être protégés:
cd /produc/sauvegarde chmod 700 .ssh cd .ssh chmod 600 *
Contrôler l'accès
A ce stade, l'utilisateur "sauvegarde" via une session SSH (port 6333) peut exécuter n'importe quelle commande. Nous allons y remédier. Cette opération est à effectuer sur la machine serveur.
Dans le fichier "/produc/sauvegarde/.ssh/authorized_keys", devant la clé publique, on ajoute l'option "command=...":
command="/produc/sauvegarde/logssh.bat" ssh-rsa AAAAB3NzaC1yc...
A chaque ouverture de session qui utilise cette clé publique, cette commande sera exécutée.
Le projet a besoin d'utiliser la commande "rsync" pour la sauvegarde et la commande "sudo init 0" pour éteindre la machine serveur.
Voici le contenu du script "/produc/sauvegarde/logssh.bat":
#!/bin/bash if [ -n "$SSH_ORIGINAL_COMMAND" ] then IP=`echo $SSH_CLIENT | /usr/bin/awk '{print $1}' ` # on journalise les appels echo "Date: `/usr/bin/date` - Client: $IP - Comande: $SSH_ORIGINAL_COMMAND" >> $HOME/log/ssh-command.log # echo "`env`" >> $HOME/log/ssh-command.log # filtrage des commandes autorisées TEST1=`echo $SSH_ORIGINAL_COMMAND | grep "rsync --server" | grep "/produc/sauvegarde/courant/" ` TEST2=`echo $SSH_ORIGINAL_COMMAND | grep "sudo init 0" ` # éviter les chaînages de commandes TESTA=`echo $SSH_ORIGINAL_COMMAND | grep ";" ` TESTB=`echo $SSH_ORIGINAL_COMMAND | grep "|" ` # test if [ "$TESTA" = "" ] && [ "$TESTB" = "" ] then if [ "$TEST1" != "" ] || [ "$TEST2" != "" ] then TEST="OK" else TEST="BAD" fi else TEST="BAD" fi # traitement if [ "$TEST" = "OK" ] then # exécution exec $SSH_ORIGINAL_COMMAND else # sinon on avertit l'administrateur echo "!!!! commande non valide !!!!" >> $HOME/log/ssh-command.log # envoi de mail echo -n "Serveur: " > $HOME/log/dfmail.log /usr/bin/hostname >> $HOME/log/dfmail.log echo " " >> $HOME/log/dfmail.log echo "Client: $IP " >> $HOME/log/dfmail.log echo " " >> $HOME/log/dfmail.log /usr/bin/date >> $HOME/log/dfmail.log echo "Probleme de commande pour la sauvegarde" >> $HOME/log/dfmail.log /bin/mail -s "Piratage (sauvegarde)" root < $HOME/log/dfmail.log /usr/bin/rm -f $HOME/log/dfmail.log fi fi
Ce fichier peut être renommé selon vos désirs.
→ retour à RSYNC-Rassemblement sur une autre machine