Wednesday, June 27, 2018

CentOS (FR) - 07 - SSH

English summary: I use SSH to establish secure connections to a remote Linux (CentOS) server, first from a Windows client (with PuTTY) and then from another CentOS machine.

***

Cet article reprend le sujet de la mise en réseau déjà abordé mais se concentre en particulier sur les communications sécurisées entre serveurs grâce au protocole SSH.

Je vais entrer d'emblée dans le vif du sujet.

Le service (sshd) est installé et activé par défaut :



SSH est compatible avec Linux et Windows (et Macintosh). Pour ma première expérience avec SSH, je vais ouvrir une session à distance à partir d'une machine Windows utilisant PuTTY. Il faut indiquer les données suivantes :

  • hostname ou adresse IP (10.2.2.1 dans l'exemple plus bas).
  • port (22 pour SSH par défaut).
  • type de connexion (SSH bien entendu).



A notre première connexion au serveur, nous sommes invités à installer une clé, si nous faisons confiance à cet hôte. Nous verrons le sujet des clés plus bas. Pour le moment, je n'installe pas la clé et je clique sur "Annuler" :




Ensuite, il s'agit de fournir, assis à la machine locale, les informations de connexion d'un compte utilisateur de la machine distante, c'est-à-dire le nom d'utilisateur et le mot de passe :



C'est le moyen de connexion le plus simple : il suffit d'authentifier l'utilisateur. Observons qu'il y a deux sessions ouvertes sur LX1 (notre serveur dans cette expérience) :

  • root - connecté localement au terminal tty2
  • athos - connecté via SSH



A la différence de Telnet, nous pouvons bien ouvrir une session à distance en tant que root :





Authentification machine

Nous pouvons utiliser la cryptographie asymétrique (paire de clé publique / clé privée) pour authentifier la machine à laquelle nous tentons d'ouvrir une session.

A ma première tentative d'ouverture de session plus haut (en tant qu'athos), j'ai choisi de ne pas tenir compte de l'alerte de sécurité concernant la clé de l'hôte (LX1), qui n'était pas mise en cache dans le registre de la machine à laquelle je tentais d'ouvrir la session.

Mais si je suis certain que le serveur auquel je tente de me connecter est le bon, je peux choisir de stocker sa clé publique dans le registre de mon client Windows.

Au départ, cette clé et la clé privée correspondante se trouvent à l'emplacement suivant au serveur LX1 :

/etc/ssh



Du côté client, les clés publiques pour les connexions SSH sont stockées dans cette ruche du registre :



Dans la capture d'écran ci-dessus, la clé publique de l'hôte LX1 avec l'adresse IP 10.2.2.1 n'a pas encore été ajoutée. Si je clique "OK" à l'alerte de sécurité de PuTTY, cela a pour effet de l'y mettre :



Désormais, le client PuTTY fait confiance au serveur LX1 à cause de la correspondance entre la clé privée qui existe sur ce serveur à /etc/ssh et la clé publique mise en cache sur le client Windows où j'ai ouvert la session SSH. L'alerte de sécurité ne s'affichera plus.

Il nous revient de vérifier nous-même l'identité du serveur avant d'installer la clé. Nous pouvons savoir que le serveur est digne de confiance parce que nous venons de le mettre sur pied nous-mêmes ou en comparant l'empreinte de la clé qui nous est présentée et l'empreinte de la clé stockée à /etc/ssh.


***


Sous Linux, nous n'avons pas besoin de PuTTY. Il suffit de taper...

ssh porthos@10.2.2.2

ou

ssh porthos@LX2

Ainsi, après "ssh", je saisis un nom d'utilisateur (qui existe sur la machine cible) puis l'adresse IP ou le nom d'hôte de cette machine.

Dans cet exemple (qui vaut ce qu'il vaut) je suis connecté comme athos au serveur LX1 mais veux me connecter en tant que porthos au serveur LX2 avec ssh :



Et c'est le fichier /home/athos/.ssh/known_hosts qui contient la clé publique du serveur LX2 :


Remarque : le répertoire .ssh (et son contenu) se crée quand nous utilisons la commande ssh ou ssh-keygen pour la première fois.


***


Authentification utilisateur

Maintenant, nous allons recourir à authentification de l'utilisateur avec la cryptographie asymétrique.

Dans ce cas, en tant qu'utilisateur athos sur LX1, nous générons une paire clé publique / clé privée à la machine locale (LX1) et nous copions la clé publique vers la machine distante (la machine cible), c'est-à-dire LX2.

Je crois qu'il faut bien se connecter d'abord (comme athos) sur la machine distante. En effet, nous allons copier la clé publique vers le répertoire home d'athos sur la machine distante (LX2). Si athos n'ouvrait pas une session sur LX2, son répertoire home ne s'y créerait jamais.

Voici le chemin complet :

/home/athos/.ssh/authorized_keys

Nous commençons donc par générer la paire de clés sur LX1 avec cette commande :

ssh-keygen -b 2048 -t rsa



Nous pouvons choisir le nombre de bits que nous voulons (1024, 2048, etc.) mais 2048 semble être le minimum recommandé aujourd'hui du point de vue de la sécurité. Quant au type de clé, nous avons le choix entre rsa, rsa1, dsa, ecdsa et ed25519.

Vous pouvez obtenir de plus amples informations sur ces options dans les "manpages" :

man ssh-keygen

Pour les considérations de sécurité (rsa versus dsa), j'ai consulté des articles en ligne résultant d'une recherche sur les termes "ssh rsa dsa".

Mais reprenons...

La paire de clés se trouve bien dans le répertoire (caché) .ssh :



Maintenant nous avons à copier la clé publique vers le serveur distant. Plusieurs méthodes existent. La méthode que je montre ci-dessous a le mérite de créer le répertoire .ssh dans le répertoire personnel de l'utilisateur à la machine distante (si ce répertoire n'existe pas déjà) :



Tout cela accompli, nous pouvons tenter une connexion. Nous remarquons tout de suite (si nous faisons attention) que l'invite nous demande une "phrase de passe" au lieu d'un mot de passe :



Comparons cela à une tentative de connexion effectuée plus tôt (faites attention à l'heure indiquée) :



Quelque chose a changé. Au lieu d'envoyer un mot de passe (sous une forme ou une autre) vers l'autre machine, nous autorisons l'accès à la clé privée protégée par la phrase de passe. S'il y a correspondance entre les deux clés, la connexion, autorisée, s'établit.


Note de la fin :

Nous devrions garder à l'esprit que nous pouvons toujours nous rabattre sur une simple connexion avec mot de passe si l'authentification avec la phrase de passe échoue :



Nous pouvons bloquer l'authentification par mot de passe en éditant le fichier de configuration de SSH :

/etc/ssh/sshd_config


Il faudrait changer la valeur du paramètre PasswordAuthentication à "no".

Monday, June 18, 2018

CentOS (FR) - 06 - commandes pour la gestion des répertoires et fichiers

English summary: I present some new aspects (for me) about the management of folders and files at the Linux command line, in particular the commands listed just below.

***

Dans cet article, je vais traiter la gestion des répertoires et des fichiers et en particulier les commandes suivantes :


  • ls
  • mkdir / rmdir / rm
  • find
  • grep


J'ai étudié cet aspect de CentOS dans un article de 2016 et je veux éviter de répéter ce qui a déjà été écrit :

CentOS - à la ligne de commande - 02 : gérer répertoires et fichiers

Ma présentation ne sera donc pas exhaustive mais simplement axée sur de nouvelles découvertes ou des choses non-incluses dans l'article précédent.


***


ls  - afficher le contenu d'un répertoire

Parfois, la sortie à l'écran est telle que nous ne pouvons pas tout voir, selon les dimensions de notre écran. Ces commandes seraient susceptibles de produire une telle sortie :

  • ls /etc
  • ls -1 /etc

D'abord, nous pouvons remonter vers le haut (ou descendre vers le bas) avec ces combinaisons de touches...

Shift+PgUp
Shift+PgDn

Remarque : selon le clavier, cela pourrait être un peu différent : Maj. ou une flèche vers le haut.


Nous pouvons limiter la sortie avec les commandes more ou less :

ls -1 /etc | more

Remarque : nous ne pouvons nous déplacer que vers le bas avec la touche Retour / Entrée. Nous pouvons revenir à l'invite avec la combinaison de touches Ctrl+C.


ls -1 /etc | less

Remarque : nous pouvons nous déplacer vers le haut ou le bas avec les touches PgUp et PgDn (sur le clavier que j'utilise en tout cas). Nous revenons à l'invite comme si nous utilisions l'éditeur de texte vi (taper ":q" - sans les parenthèses). 


Toujours concernant la commande ls, nous avons plusieurs options conçues pour donner un affichage plus ou moins détaillé :

  • -a (--all) affiche tous les fichiers y compris les fichiers précédés d'un ".", les fichiers cachés.
  • -d (--directory) affiche les détails du répertoire. A utiliser avec "l".
  • -h (--human-readable) affiche la taille du fichier en Ko, Mo, Go (etc.) au lieu de laisser la taille en octets.
  • -t (time) affiche les objets (fichiers et répertoires) triés selon la date de modification. Note : ce n'est pas en raccourci pour --time qui est une option distincte.
  • -r (reverse) affiche les objets en ordre inverse.


Parfois un répertoire contient tellement d'objets que nous avons intérêt à restreindre la sortie en mettant un astérisque avant, après ou autour du terme recherché.  Par exemple, supposons que je me trouve dans le répertoire /etc et que je ne m'intéresse qu'aux répertoires et aux fichiers relatifs à yum. Il suffit de mettre un astérisque comme suit pour n'afficher que ces éléments :

ls *yum*



Remarque : ls semble faire un affichage récursif, dressant la liste des répertoires et fichiers dans /etc mais aussi le contenu des répertoires.

Quelques autres astuces méritent une simple mention.

Si nous voulons limiter l'affichage aux documents contenant deux termes possibles, deux dates par exemple, nous mettons des crochets autour des nombres qui nous intéressent, comme ceci :

ls *199[12]*

Cela affiche tout objet avec la date 1991 ou 1992 dans le nom.

Autres variations :

ls [Nord,Sud]*

Cela affiche tout objet dont le nom commence par "Nord" ou "Sud". Nous mettrions un astérisque avant le premier crochet pour trouver tout objet avec "Nord" ou "Sud" quelle que soit sa position dans le nom (au début, au milieu, à la fin).


ls *{1990..92}

Avec des accolades au lieu des crochets, et deux points, nous pouvons afficher tout fichier dont le nom finit par 1990, 1991 ou 1992.


ls [AB][0-9][0-9]??

Voilà un exemple encore plus complexe : ls affiche tout fichier avec A ou B pour le premier caractère, tout nombre entre 0 et 9 pour les deuxième et troisième caractères et n'importe quel caractère pour les quatrième et cinquième.



mkdir / rmdir /rm / cp / mv

Nous avons vu (dans mon article de 2016, cité en introduction) les commandes pour créer et supprimer un répertoire, respectivement :

  • mkdir
  • rmdir

Dans l'article précédent, j'ai écrit qu'il existe une option -R (récursif) pour supprimer le fichier et son contenu. En fait, ni rmdir -r ni rmdir -R ne nous permet de supprimer un répertoire contenant d'autres objets. Il faut plutôt utiliser une de ces commandes :

  • rm -r
  • rm -R
  • rm --recursive

Toutes ont le même résultat :




Je vois des exemples où l'on ajoute aussi l'option -f ou --force.

Selon man (man rm), cette option fait que rm ne tient pas compte des fichiers non-existants (?) et ne demande jamais une confirmation.

Il n'y a pas d'option -F dans ce cas.

Autre chose apprise, nous pouvons même supprimer des répertoires vides avec cette commande :

rm -d 


En ce qui concerne les commandes cp et mv, si nous voulons retenir les propriétés (propriétaire, permissions) des objets copiés, nous devrions mettre l'option -p :

cp -p

En revanche, il n'est pas nécessaire d'ajouter l'option -p pour les déplacements avec mv. Bien entendu, il n'est pas nécessaire non plus pour renommer un objet. Enfin, nous pouvons tout à fait déplacer et renommer un objet en même temps.



find

Ou la "recherche des fichiers avec la commande find".

Nous effectuons la recherche dans le répertoire courant sauf à indiquer le chemin.

La recherche se fonde sur des termes de recherche qu'on appelle "motifs", parmi lesquels :

  • -name (sensible à la casse)
  • -iname (insensible à la casse)
  • -type
  • -user (recherche selon le propriétaire du fichier)
  • -size

Par exemple, je viens d'installer le navigateur Firefox (sur une machine avec une interface graphique) et je suis curieux de voir les répertoires créés et les fichiers installés :

find / -iname firefox


Certes, il pourrait y avoir des répertoires ajoutés dont le nom ne comprend pas le motif  "firefox".



grep

J'ai découvert grep en étudiant Network Manager dans un article précédent. Les paramètres de réseau se trouvent dans des fichiers de configuration que nous pouvons ouvrir et lire avec cat mais il s'agit de l'ensemble du fichier avec, peut-être, des dizaines ou des centaines de lignes. Avec grep, nous pouvons choisir un terme de recherche - ou un "motif" - et grep n'affiche que les lignes contenant le motif en question. En cela, grep est plus précis que cat.

cat versus grep :


Dans l'exemple ci-dessus, nous cherchons les services disponibles dans la zone de pare-feu "public". L'affichage avec cat n'est pas excessif mais dans un fichier avec plus de lignes il pourrait l'être. J'ai ajouté l'option "-i " pour que la recherche soit insensible à la casse. Cette option n'est pas obligatoire. La recherche réussirait aussi bien sans cette option mais ne relèverait que les mots avec la casse présente dans la commande (minuscule ou majuscule).