LINUX:SSH et RSYNC

De WIKI sur Linux (ADB)
Aller à la navigation Aller à la recherche

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