Configuration SSH sur Debian/Ubuntu

Ce billet sert de notice pour la configuration rapide du SSH d’un serveur Ubuntu. Il s’agit d’un condensé de divers billets provenant d’autres blogs que j’utilisais régulièrement pour mettre en place un serveur. L’ensemble de la configuration convient à une distribution Ubuntu (testé et réalisé sous Ubuntu 16.04).

1. Utilisateurs du système

La connexion de base fournie par les fournisseurs de serveurs s’effectue souvent en SSH sur le compte root ce qui est un bon point de départ que l’on peut améliorer.
On se connecte au serveur pour commencer les manipulations:

local# ssh root@ip_server

1.1 Nouvel utilisateur

Nous commençons par créer un nouvel utilisateur dénommé “frenchkiss”.
# adduser frenchkiss

En lançant cette commande un certains nombre de questions vont être posées à commencer par le mot de passe du nouvel utilisateur. Nous saisissons un mot de passe suffisamment sécurisé en ayant recours à pwgen qui va nous proposer un ensemble de mots de passe de la longueur souhaitée:

local# pwgen 18
oodeiNoof0Eesh3qui eig8oeLochoh9ya4Wu ti0ChoN1raedah1Tay phaiBaiceingaiC7le
Zasahw2eith7uChie5 deu5Eighaidiu8ohch moob1ceitoSeet6iez Eiphoor2joosh5idai
Ui8sheinah8ah5zizi keVohKah6youthooBi yom8RahTh9oozeeR5a saizooWie5sec7ugel
...

Une fois l’utilisateur créé, on lui passe les droits de sudoers afin qu’il puisse effectuer les taches de maintenance sur le système. Pour cela nous avons recours à la commande usermod

La commande usermod est à manipuler avec précautions. Certaines options se différencient par la casse et apportent un résultat qui peut aboutir à une situation non désirée si la casse n’est pas respectée.

# usermod -aG sudo frenchkiss

Rappel des options:
-a Add the user to the supplementary group(s). Use only with the -G option.
-g GROUPE affecte GROUPE en tant que groupe par défaut pour l’utilisateur
-G GRP1,GRP2 qui ajoute l’utilisateur aux groupes secondaires. Pour cela il faut utiliser l’option -a (append).

Accessoirement on peut aussi lui permettre de pouvoir sudoer sans saisir son mot de passe. Attention toutefois à vos règles de sécurité sur le serveur. Nous éditons donc le fichier sudoers:
# sudo visudo

Puis ajoutons une règle spécifique pour notre nouvel utilisateur:
frenchkiss ALL=(ALL) NOPASSWD: ALL

1.2 Clef SSH

Si on ne dispose pas déjà d’une clef SSH, on peut en générer une en local:

local# ssh-keygen

Si une ou plusieurs clefs sont déjà en place et que l’on désire générer une nouvelle clef dans un fichier spécifique:

local# ssh-keygen -t rsa -b 4096 -C "me@example.com" -f $HOME/.ssh/id_rsa_other

Puis rapatrier facilement la clef vers le serveur en utilisant ssh-copy-id

local# ssh-copy-id frenchkiss@ip_server

1.3 Droits sur les fichiers des clefs

Simple rappel ici pour le bon fonctionnement des clefs SSH. Cela est automatisé en utilisant ssh-copy-id.
Sinon il faut s’assurer que les droits suivants soient appliqués:

mkdir ~/.ssh
chmod 700 ~/.ssh
vim ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

A noter: Lorsque l’on dispose de plusieurs clefs SSH, l’ensemble des commandes de la famille ssh acceptent le paramètre -i qui permet de spécifier le nom d’une clef particulière

2. Configuration du daemon SSH

Maintenant que nous disposons d’une clef SSH valide en local et sur le serveur, nous pouvons fine-tuner les réglages du daemon SSH. On édite le fichier de configuration:

# sudo vim/etc/ssh/sshd_config

On s’assure d’avoir les valeurs suivantes dans le fichier:

PasswordAuthentication no
PermitRootLogin no
PubkeyAuthentication yes
ChallengeResponseAuthentication no
Banner /etc/issue.net

Optionnel ici, le black et/ou whitelisting de certains utilisateurs au sein de secure shell, exemple:

AllowUsers Fred Wilma
DenyUsers Dino Pebbles

On pourra également éditer le fichier /etc/issue.net afin qu’il affiche un joli message de malvenue à tout intrus.
Exemple:

***************************************************************************
NOTICE TO USERS

This computer system is the private property of its owner, whether
individual, corporate or government. It is for authorized use only.
Users (authorized or unauthorized) have no explicit or implicit
expectation of privacy.

Any or all uses of this system and all files on this system may be
intercepted, monitored, recorded, copied, audited, inspected, and
disclosed to your employer, to authorized site, government, and law
enforcement personnel, as well as authorized officials of government
agencies, both domestic and foreign.

By using this system, the user consents to such interception, monitoring,
recording, copying, auditing, inspection, and disclosure at the
discretion of such personnel or officials. Unauthorized or improper use
of this system may result in civil and criminal penalties and
administrative or disciplinary action, as appropriate. By continuing to
use this system you indicate your awareness of and consent to these terms
and conditions of use. LOG OFF IMMEDIATELY if you do not agree to the
conditions stated in this warning.

****************************************************************************

Après changement de la configuration il faudra redémarrer le daemon SSH:
# sudo systemctl reload sshd

3. Firewall

Nous utilisons ufw.

Lister les applications registrées:
# sudo ufw app list

Limiter le nombre de requêtes de connexions SSH en ajoutant un simple filtre sur le firewall:
# sudo ufw limit ssh
Cela va limiter à 10 tentatives de connexion maximum en 30 secondes. Au dela les requêtes seront droppées.

Authoriser le SSH si ce n’est pas déjà le cas:
# sudo ufw allow OpenSSH

Activation du firewall:
# sudo ufw enable

Vérifier le status du firewall:
# sudo ufw status

kosmo