Configuration d'un serveur SSH avec paire de clés ed25519

Environnement

L'environnement est fourni à titre indicatif afin d'identifier d'éventuelles divergences de résultats en cas d'utilisation du script dans un environnement proche mais néanmoins différent.

  • Hyperviseur Proxmox 5

  • Conteneur LXC Ubuntu 18.04 (serveur)

  • Ubuntu 18.04 (client)

  • Le paquet ssh est installé sur les machines client et serveur

  • Les machines client et serveur possèdent un compte utilisateur

Description

La configuration de la connexion SSH avec paire de clés ed25519 est composée des 3 scripts suivants :

  • 01_ssh_config_server_ubuntu_18.04.sh - durcit la configuration du serveur SSH (à lancer sur le serveur)

  • 02_ssh_config_client_ubuntu_18.04.sh - génère la paire de clés et envoie la clé publique sur le serveur (à lancer sur le client)

  • 03_ssh_config_server_ubuntu_18.04.sh - désactive l'accès par mot de passe (à lancer sur le serveur)

Scripts

01_ssh_config_server_ubuntu_18.04.sh (à lancer sur le serveur en sudo/root)

#! /bin/bash
# 01_ssh_config_server_ubuntu_18.04.sh

echo "###############################################################################"
echo "Sauvegarde du fichier de configuration"
echo "###############################################################################"
cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

echo "Saisir le nouveau numéro du port SSH ?"
read port

sed -i "s/#Port 22/Port $port/" /etc/ssh/sshd_config
sed -i 's,#HostKey /etc/ssh/ssh_host_ed25519_key,HostKey /etc/ssh/ssh_host_ed25519_key,' /etc/ssh/sshd_config
sed -i 's/#LogLevel INFO/LogLevel VERBOSE/' /etc/ssh/sshd_config
sed -i 's/#LoginGraceTime 2m/LoginGraceTime 1m/' /etc/ssh/sshd_config
sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config
sed -i 's/#MaxStartups 10:30:100/MaxStartups 10:30:60/' /etc/ssh/sshd_config
sed -i 's/#MaxAuthTries 6/MaxAuthTries 3/' /etc/ssh/sshd_config
sed -i 's/#IgnoreRhosts yes/IgnoreRhosts yes/' /etc/ssh/sshd_config
sed -i 's/#UseDNS no/UseDNS yes/' /etc/ssh/sshd_config
sed -i 's/X11Forwarding yes/X11Forwarding no/' /etc/ssh/sshd_config
sed -i 's,/usr/lib/openssh/sftp-server,/usr/lib/openssh/sftp-server -f AUTHPRIV -l INFO,' /etc/ssh/sshd_config

echo "" >> /etc/ssh/sshd_config
echo "# Ciphers" >> /etc/ssh/sshd_config
echo "KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group14-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512" >> /etc/ssh/sshd_config
echo "Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr" >> /etc/ssh/sshd_config
echo "MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com" >> /etc/ssh/sshd_config
echo "" >> /etc/ssh/sshd_config
echo "# Remove OS version" >> /etc/ssh/sshd_config
echo "DebianBanner no" >> /etc/ssh/sshd_config

systemctl restart ssh

echo "###############################################################################"
echo "Configuration du serveur SSH (partie 01) terminée"
echo "###############################################################################"

02_ssh_config_client_ubuntu_18.04.sh (à lancer sur le client avec le compte utilisateur)

#! /bin/bash
# 02_ssh_config_client_ubuntu_18.04.sh

echo "###############################################################################"
echo "Génération des clés publique et privée"
echo "###############################################################################"

echo "Saisir le nom de la machine distante ?"
read server_name

if [ -d ~/.ssh ]; then
    mkdir ~/.ssh
fi

cd ~/.ssh
ssh-keygen -t ed25519 -f $server_name

echo "La paire de clés a été créée sous les noms \"$server_name\" et \"$server_name.pub\" "

echo "###############################################################################"
echo "Envoi de la clé publique sur le serveur distant"
echo "###############################################################################"

echo "Saisir l'adresse IP de la machine distante ?"
read ip_address

echo "Saisir le nom de l'utilisateur sur la machine distante ?"
read user

echo "Saisir le numéro du port SSH de la machine distante  ?"
read port

ssh-copy-id -i ~/.ssh/"$server_name".pub -p "$port" $user@$ip_address

rm -f ~/.ssh/"$server_name".pub
chmod 400 ~/.ssh/*

03_ssh_config_server_ubuntu_18.04.sh (à lancer sur le serveur en sudo/root)

#! /bin/bash
# 03_ssh_config_server_ubuntu_18.04.sh

echo "###############################################################################"
echo "Sauvegarde du fichier de configuration"
echo "###############################################################################"
cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config.bak2

sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
sed -i 's/#PermitEmptyPasswords no/PermitEmptyPasswords no/' /etc/ssh/sshd_config
sed -i 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/' /etc/ssh/sshd_config
sed -i 's,#AuthorizedKeysFile,AuthorizedKeysFile,' /etc/ssh/sshd_config

systemctl restart ssh

echo "###############################################################################"
echo "Configuration du serveur SSH (partie 02) terminée"
echo "###############################################################################"