Un bastion SSH, qu'est-ce que c'est que ce truc là ?
Dans le cadre d'une grappe de serveurs devant être administrés à distance, un bastion SSH est un serveur sur lequel un serveur SSH (openssh-server par exemple) est installé et par lequel on peut accèder en SSH aux autres serveurs.
Le but est d'utiliser ce serveur comme serveur de rebond afin d'accéder aux différents serveurs.
Dans un premier temps, il est nécessaire de créer un nouveau serveur sur lequel nous installerons un serveur SSH.
Pour l'exemple, je vais créer un nouveau serveur avec OpensSUSE 15.5 et installer openssh-server.
Une machine virtuelle sous Proxmox équipée d'un CPU, de 8 Go de disque et 512 Mo de mémoire vive suffira amplement.
Faire en sorte que ce serveur et seulement ce serveur soit accessible, de l'extérieur, via le port SSH 22 (ou autre si vous souhaitez sécuriser encore plus l'accès au bastion SSH).
# zypper in openssh-server
Pour la configuration du serveur SSH, quelques lignes suffisent.
# cat /etc/ssh/sshd_config
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
AuthorizedKeysFile .ssh/authorized_keys
PrintMotd no
Subsystem sftp /usr/lib/ssh/sftp-server
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL
AllowUsers toto
Quelques petites explications:
Ligne 1, on interdit la connexion avec le compte "root"
Ligne 2, on autorise la connexion à l'aide d'une clé SSH
Ligne 3, 4 et 5, on interdit l'authentification par mot de passe
Ligne 6, permet d'indiquer le fichier contenant les clés autorisées à se connecter
Ligne 7, on désactive l'affichage du contenu du fichier /etc/motd
Ligne 8 à 11, divers paramètres
Ligne 12, permet d'indiquer le ou les utilisateurs autorisés à se connecter
Ensuite, il est nécessaire de créer l'utilisateur avec lequel on se connectera au serveur SSH.
L'important est de créer un utiilisateur n'ayant aucun droit de se connecter au serveur SSH servant de bastion.
# useradd -m -s /bin/false toto
Sur le serveur client, ou n'importe quel autre serveur, créer un clé ssh qui sera utilisée pour se connecter au bastion SSH.
Voir un exemple ici https://isbeta.fr/LsUB2 (créer une clé SSH avec ou sans protection par mot de passe, à vous de choisir)
Pour la suite des opérations, je vais partir du principe que la clé ssh permettant de se connecter au bastion SSH se nommera id_rsa.toto et la clé publique id_rsa.toto.pub
Ensuite, il est nécessaire de copier la clé publique (celle créée ci-dessus id_rsa.toto.pub) dans le fichier authorized_keys du bastion SSH.
Créer le dossier .ssh dans le dossier de l'utilisateur toto du bastion SSH.
# mkdir /home/toto/.ssh
# chown toto /home/toto/.ssh
# chmod 0700 /home/toto/.ssh
Créer ensuite le fichier authorized_keys et y copier la clé publique
# touch /home/toto/.ssh/authorized_keys
# vim /home/toto/.ssh/authorized_keys
# cat /home/toto/.ssh/authorized_keys
ssh-rsa xxxx...lgjgdlkffgjdlkg=
# chown toto /home/toto/.ssh/authorized_keys
# chmod 0600 /home/toto/.ssh/authorized_keys
En théorie, la configuration du bastion SSH est terminée.
Le serveur SSH a été paramétré, le user "toto" autorisé à se connecter a été créé et la clé SSH a été renseignée dans le fichier .ssh/authorized_keys du user "toto".
Maintenant, coté client, il est nécessaire de configurer l'accès au bastion SSH.
Modifier le fichier .ssh/config du client.
# cat .ssh/config
Host monbastion.loc
Hostname monbastion.loc
User toto
Port 22
TCPKeepAlive yes
IdentityFile ~/.ssh/id_rsa.toto
Host mon_serveur_nginx
Hostname 192.168.1.50
User root
Port 22
TCPKeepAlive yes
ProxyJump monbastion.loc
IdentityFile ~/.ssh/id_rsa
Host mon_serveur_mariadb
Hostname 192.168.1.60
User root
Port 22
TCPKeepAlive yes
ProxyJump monbastion.loc
IdentityFile ~/.ssh/id_rsa
Quelques explications:
Le premier host correspond au bastion SSH accessible via internet, rien de bien compliqué, excepté peut-être le paramètre IdentityFile faisant référence à la clé SSH id_rsa.toto, l'unique clé autorisée à se connecter au bastion SSH avec le user toto.
Le second host, est celui qui correspond, pour l'exemple, à mon serveur nginx, inaccessible via internet en SSH, seulement en HTTP et HTTPS.
Pour pouvoir y acccéder, j'indique via le paramètre ProxyJump, d'utiliser le host monbastion.loc pour pouvoir y accéder en SSH. Le paramètre IdentityFile permet d'indiquer une autre clé SSH autorisée à se connecter au serveur nginx.
Idem pour le troisième host.
Les adresses IP indiquées pour les hosts 2 et 3 doivent être accessible via le bastion SSH.
Il est possible de renseigner différents serveurs utilisant le bastion SSH commme serveur de rebond.
Et voilà, la configuration est enfin terminée.
Pour se connecter au serveur nginx, par exemple:
# ssh mon_serveur_nginx
C'est tout simple, la connexion via monbastion.loc est complètement transparente.