This commit is contained in:
tierce 2021-10-08 23:52:45 +02:00
parent a0107afb1d
commit a57a250441
2 changed files with 373 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

373
content/tutos/ssh.md Normal file
View File

@ -0,0 +1,373 @@
---
pagename: SSH
title: Secure Shell
subtitle: Accèder à un terminal au travers d'une connexion chiffrée
date: 2021-10-08
author: tierce
---
Ssh est à la fois un **logiciel** et un **protocole**, comme expliqué sur [la page Wikipédia](https://fr.wikipedia.org/wiki/Secure_Shell).
## Installer GNU/Linux Debian 11
Lors de l'installation de Debian 11, en plus du nom de machine, du domaine, du partitionnement, du choix de la langue, du choix des paquets, etc, nous noterons en particulier les points suivants;
- le mot de passe `root` qui peut-être changé plus tard,
- le premier utilisateur créé et son mot de passe, qui peut également être changé plus tard.
Nous choisirons `bestiole` comme premier nom d'utilisateur.
Dans les deux cas, nous utiliserons un mot de passe très simple pour faciliter l'installation et nous le changerons plus tard.
Les mots de passe seront donc les mêmes pour `root` et pour `bestiole` et nous utiliserons `trucmuche`.
Nous n'entrerons pas dans les détail du choix de la langue, de la configuration du clavier, du partitionnement ou de la configuration du réseau.
Pour ce qui est du choix des paquets, nous cocherons **uniquement** `[x] SSH server`.
<img src="/images/ssh/paquet-ssh.png" class="pure-img" alt="Installateur Debian 11 affichant le sélecteur de paquet où seul SSH Server est coché">
## Retrouver l'adresse IP du nouveau serveur
Avant de pouvoir se connecter en réseau sur la machine fraîchement installée, il faut retrouver son adresse IP.
### S'y connecter physiquement
Puisque le serveur vient d'être installé, vous devriez pouvoir vous y connecter en utilisant le clavier.
En tant que `root` ou `bestiole` avec le mot de passe `trucmuche`.
Et une fois votre session ouverte, la commande suivante vous affichera les adresses IPv4 de la machine.
```
# ip a s
```
Pour ip address show et dont le résultat devrait ressembler à ceci;
```
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 16:14:ed:f4:aa:33 brd ff:ff:ff:ff:ff:ff
altname enp0s18
inet 192.168.30.27/24 brd 192.168.30.255 scope global dynamic ens18
valid_lft 6271sec preferred_lft 6271sec
inet6 fe80::1414:f0ff:fea7:7b31/64 scope link
valid_lft forever preferred_lft forever
```
Et dans notre cas, c'est l'adresse `192.168.30.27` qui nous intéresse.
### Ou bien scanner le réseau
Depuis un autre ordinateur GNU/Linux la commande `arp-scan` peut être utile.
Si vous connaissez le *range ip* de votre réseau, elle vous affichera la liste des adresses découvertes dans la table *arp*.
```
$ sudo arp-scan 192.168.30.0/24
```
Ou, si vous ne connaissez pas le *range ip* de votre réseau, vous pourrez essayer avec ceci;
```
$ sudo arp-scan --localnet
```
## Première connexion ssh
Maintenant que l'adresse IPv4 du serveur est connue, il est possible de s'y connecter à distance depuis un autre ordinateur GNU/Linux.
Le mot de passe de l'utilisateur `bestiole` sera demandé pour vous connecter à la machine `192.168.30.27` sur le port `22`, le port par défaut de ssh.
```
$ ssh bestiole@192.168.30.27
bestiole@192.168.30.27's password:
Linux ssh 5.10.0-8-amd64 #1 SMP Debian 5.10.46-5 (2021-09-23) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Oct 8 20:03:16 2021 from 192.168.30.31
bestiole@ssh:~$
```
## Installer sudo
Par défaut `sudo` n'est pas installé sur Debian 11.
Le mot de pass `root` sera demandé et c'est, pour rappel, le même que celui de `bestiole`, à savoir `trucmuche`.
Notez le `-` dans la commande `su -` qui permet de démarrer un shell `root` avec ses propres variables d'envirronement et pas celles de l'utilisateur `bestiole`.
```
bestiole@ssh:~$ su -
Password:
root@ssh:~#
root@ssh:~# apt update
Hit:1 http://security.debian.org/debian-security bullseye-security InRelease
Hit:2 http://deb.debian.org/debian bullseye InRelease
Hit:3 http://deb.debian.org/debian bullseye-updates InRelease
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.
root@ssh:~# apt install sudo
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following NEW packages will be installed:
sudo
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 1,059 kB of archives.
After this operation, 4,699 kB of additional disk space will be used.
Get:1 http://deb.debian.org/debian bullseye/main amd64 sudo amd64 1.9.5p2-3 [1,059 kB]
Fetched 1,059 kB in 0s (4,589 kB/s)
Selecting previously unselected package sudo.
(Reading database ... 20861 files and directories currently installed.)
Preparing to unpack .../sudo_1.9.5p2-3_amd64.deb ...
Unpacking sudo (1.9.5p2-3) ...
Setting up sudo (1.9.5p2-3) ...
root@ssh:~#
```
## Ajouter bestiole au groupe sudo
```
root@ssh:~# adduser bestiole sudo
Adding user `bestiole' to group `sudo' ...
Adding user bestiole to group sudo
Done.
```
Si lors de la commande `adduser bestiole sudo` vous avez le message d'erreur `bash: adduser: command not found`, c'est que vous avez oubliez le `-` lors de l'utilisation de la commande `su -` en amont.
## Configurer sudo sans mot de passe pour bestiole
Lorsque vous êtes connecté en tant que `bestiole`, vous devez connaître le mot de passe `root` si vous souhaitez utiliser la commarde `su -` ou taper le mot de passe de `bestiole` si vous utilisez la commande `sudo`.
Pour y remédier, et pouvoir utiliser `sudo` sans mot de passe, il faut ajouter la ligne suivante au fichier de configuration de `sudo`.
Pour ce faire, c'est la commande `visudo` qui sera utilisée.
```
# visudo
```
Par défaut, c'est l'éditeur `nano` qui vous affichera le fichier de configuration de `sudo`.
À la fin du fichier, vous pourrez ajouter la ligne suivante;
```
bestiole ALL=(ALL) NOPASSWD: ALL
```
Et utiliser les touches `CTRL + x` pour quitter et répondre `y` ou bien `o` pour enregistrer votre changement.
## Tester le changement
Vous pouvez quitter le shell `root` avec la combinaison de touche `CTRL + d` ou en tapant `exit`.
```
root@ssh:~# exit
logout
bestiole@ssh:~$
```
Et pour vérifier que `bestiole` peut utiliser `sudo` sans mot de passe;
```
bestiole@ssh:~$ sudo su -
root@ssh:~#
```
Devrait vous ouvrir un shell `root` automatiquement.
## Création d'une paire de clé sur votre ordinateur personnel
Pour que vous *(en fait le compte utilisateur local de votre ordinateur personnel)* soit en mesure de se connecter à un serveur ssh **sans avoir à taper de mot de passe**, il faut que vous *(votre utilisateur local)* disposiez au moins d'une paire de clé publique / privée.
Cela se fait sur votre ordinateur, celui que vous utiliserez pour vous connecter au serveur ssh.
Votre utilisateur local disposera d'un dossier `~/.ssh/` qui contiendra votre ou vos clés privées et publiques.
Attention que ces fichiers parce que ce ne sont que des fichiers, surtout la ou les clé **privées**, sont des documents **très précieux** qu'il vous faudra sauvegarder et ne transmettre à personne.
Lors de la génération de votre paire de clé, vous pourrez choisir le type de chiffrement et éventuellement un mot de passe pour déverrouiller la clé privée. À chaque fois que vous souhaiterez utiliser la clé privée, et donc à chaque fois que vous souhaiterez vous connecter au serveur en utilisant `ssh` vous serez invité·e à taper le mot de passe de la clé. La plus part des distributions GNU/Linux disposent d'un logiciel, `ssh-agent` qui conserve l'accès à votre ou vos clé tant que vous ne fermez pas votre session ou que vous ne redémarrez pas votre ordinateur personnel.
Si votre ordinateur fonctionne sur un disque chiffré et que votre mot de passe de session personnel est suffisamment fort *(long)* vous pouvez éventuellement vous passer de mot de passe pour votre ou vos clé, mais ce n'est pas une bonne idée.
À vous de choisir entre un peu plus ou un peu moins de sécurité, mais prennez bien conscience que les clés publique et surtout les clés privées **peuvent donner accès aux serveurs ssh** que vous gérez sans vous demander de taper quoi que ce soit.
### Avec l'algo RSA
Voici la commande pour créer une paire de clé RSA avec l'algorithme RSA avec une taille de 2048 bit.
```
$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/vous/.ssh/id_rsa
Your public key has been saved in /home/vous/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:33Y240klIIrel19EncUx1w/zVeP80SszU+4X49N4 vous@votreordi
The key's randomart image is:
+---[RSA 2048]----+
| +o*|
| o.C*|
| =.*o@|
| .Oo%*|
| T =oOoO|
| . .==. +|
| . o *..|
| . = +E|
| O |
+----[SHA256]-----+
```
## Avec l'algo ed25519
Plus récent et plus performant, mais pas compatible avec des versions plus anciennes de `ssh`, il y a l'algorithme ED25519.
```
# ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/vous/.ssh/ed25519
Your public key has been saved in /home/vous/.ssh/ed25519.pub
The key fingerprint is:
SHA256:ZlHC9yLZL6Ijd86YXNPpGeeBkJ6DMQ43SYfMp3l49ti vous@votreordi
The key's randomart image is:
+--[ED25519 256]--+
| ..+o .|
| +.=.o + |
| ..B.B.*..|
| o o+*.B.o.|
| . SoB. +. |
| o..oo . oo|
| o + . .. =..|
| . o + o o . |
| E=. |
+----[SHA256]-----+
```
Le choix entre RSA ou ED25519 dépend de la vielliesse des serveurs `ssh` auxquels vous souhaiterez vous connecter, minimum Debian 8 pour ED25519.
## Copie de la clé vers votre serveur ssh
Pour que votre utilisateur local, celui de votre ordinateur personnel, puisse se connecter en utilisant sa clé **privée**, il faut que l'utilisateur `bestiole` du serveur dispose de la clé **publique** correspondante.
Pour ce faire, il existe au moins deux méthodes pour transmettre là clé **publique** sur le serveur ssh, dans la liste des clés authorizées pour l'utilisateur `bestiole`.
### Avec ssh-copy-id
Cette commande est à faire depuis votre ordinateur personnel.
```
$ ssh-copy-id bestiole@192.168.30.27
```
Il vous sera demandé te taper le mot de l'utilisateur `bestiole`, à savoir `trucmuche`.
### En éditant le fichier authorized_keys sur le serveur
Une autre méthode moins automatique, est d'éditer le fichier de clés publiques autorisées pour l'utilisateur `bestiole` sur le serveur ssh.
Cela se fait sur le serveur ssh en copiant / collant le contenu du fichier `~/.ssh/id_rsa.pub` de votre ordinateur personnel.
Sur votre ordinateur personnel;
```
$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC5daRSSVJD2xVXnqcB4pmjthAFr2u0/W+BP1OESo7lm60If9z7m80ztyFDmdfm82RDM/tpgaV050DDD9IZrfjmGjA3lTWFirA6CntWJsa0xYgtNrY9vop6ZRpRWx/+2AM5mLD+mqOdn++w+6/2ee6V0zIsaXr863XRApi81X0BlqPathNehv0/37sd2+JhtmhFHhBweGgjYllPIiAMmzzt23J2TSS8V0kNt6ZEjnTZKUUBmdTYwKZkLZDNxfCSptLFUf/pq7GgjxMK6x7g4roRCWwOl80RWs1mXodZ8FOGAHKlQ8mZoQCZ3uK4DpE74h8DOb3x5g7WWMf1IXtQhM8P vous@votreordi
```
Faites bien attention au `.pub` qui est bien la partie publique de votre paire de clé.
Vous pouvez sélectionner le texte depuis `ssh-rsa AAAA…` jusque `…vous@votreordi` et utiliser la combinaison de touche `CTRL+MAJ+C` pour copier la clé **publique**.
Sur le serveur;
```
$ ssh bestiole@192.168.30.27 # si vous n'y êtes plus connecté et tapez le mot de passe trucmuche
$ mkdir ~/.ssh
$ nano ~/.ssh/authorized_keys
```
L'éditeur `nano` vous affiche un fichier vide *(sauf si il contient déjà des clés autorisées)* et vous pouvez y coller votre clé publique avec les touche `CTRL+MAJ-v`.
Quittez l'éditeur avec `CTRL+x` et répondez `o` ou `y` pour enregistrer le fichier.
Nous allons ensuite modifier les droits d'accès à ce fichier pour autoriser uniquement le propriétaire du fichier, à savoir `bestiole` à l'écriture tout en laissant la lecture possible au groupe `bestiole` et au autres.
```
$ chmod 0644 ~/.ssh/authorized_keys
```
Voilà, votre clé publique est dans la liste des clés autorisées pour l'utilisateur `bestiole`, qui pour rappel, dispose de la possibilité de devenir `root` sans avoir de mot de passe à taper, comme nous l'avons fais bien avant dans ce tuto.
## Tester la connexion
Mis à part le mot de passe qui déverrouillerait votre clé privée, vous devriez pouvoir vous connecter au serveur sans avoir à taper le mot de passe de l'utilisateur `bestiole`. Et si votre clé privée n'est pas protégée par un mot de passe, vous n'aurez rien à taper de plus que la commande ssh suivante;
```
$ ssh bestiole@192.168.30.27
```
Et vous devriez arriver dans un shel de `bestiole` sur le serveur.
Et si vous tapez `sudo su -`, vous devriez être dans le shell de `root` sans avoir eu à taper de mot de passe.
## Configurer ssh sur le serveur
Actuellement, le serveur ssh autorise encore l'utilisation de mots de passe pour que les utilisateur·ice·s telque `bestiole` se connectent.
Dans la version 11 de Debian, l'utilisateur `root` ne peut déjà plus se connecter avec mot de passe mais il pourrait encore se connecter en utilisant des clés publiques / privées.
L'idée est d'interdire l'accès à `root` que ce soit avec mot de passe ou avec clés et aussi de désactiver l'authentification par mot de passe pour les autres utilisateur·ice·s du serveur, mais d'autoriser les connexions utilisant des clés publiques / privées.
Il faut décommenter, éditer ou modifier les variables suivantes dans le fichier `/etc/ssh/sshd_config`;
```
# nano /etc/ssh/sshd_config
#PermitRootLogin prohibit-password
PermitRootLogin no
#PubkeyAuthentication no
PubkeyAuthentication yes
#PasswordAuthentication yes
PasswordAuthentication no
```
Et utiliser `CTRL+x` pour quitter en répondant `o` ou `y` pour enregistrer les modifications.
Et puisque nous avons modifier la configuration du serveur `ssh`, il faut redémarrer le service;
```
# service ssh restart
```
Ou bien;
```
# systemctl restart ssh
```
## Conclusion
Si tout c'est bien passé, vous devriez pouvoir vous connecter à votre serveur ssh en tant que `bestiole` et pouvoir utiliser `sudo` sans avoir à taper de mot ou de phrase de passe.
Et `root` ne peux plus ouvrir directement de terminal sur votre serveur ssh, ce qui est un peu plus sécurisé puisque plein de bots tentent de se connecter en tant que root@machine avec des mots de passe aléatoires.