Config ssh : utilisation de AllowUsers ou AllowGroups?

Plop !

* yunohost version 11.0.10.2
* Serveur distant
    Accès SSH

J’étais en train de jouer avec des hooks pour modifier mon /etc/ssh/sshd_config et ce qui devait arriver arriva : je me suis mis dehors :smiley:

Jusqu’à présent j’utilisais AllowUsers user1 user2 pour n’autoriser que user1 et user2 à se connecter en SSH, l’un pour quand j’administre mon serveur, le second pour recevoir les backup d’un serveur tiers via restic.

Ces deux users n’existent pas dans yunohost et n’ont d’autre utilité que celles sus-citées.

Or, lorsque j’ai voulu MaJ le fichier de config ssh avec regen-conf, je me suis aperçu qu’il existe dorénavant cette ligne :

AllowGroups ssh.main sftp.main ssh.app sftp.app admins root

Mes deux users n’étant pas dans ces groupes, ça bloque.

tl;dr :

Ce qui m’amène à ces questions :

  • Quelle différence entre les .app et les .main ?
  • Le groupe root a-t-il vraiment besoin d’être présent ? Il me semble qu’on empêche justement la connexion SSH pour root.
  • Dans mon cas spécifique, j’ai commenté la ligne AllowGroups. Ne serait-il pas plus propre de plutôt ajouter mes deux users dans les groupe idoines et réactiver cette ligne ? Si oui, confer premier point : dans quel(s) groupe(s) faut-il les inscrire ?

Merci :slight_smile:

Conseil général pour les apprentis sorciers du SSH: toujours garder un terminal ouvert en secours quand on teste une nouvelle configuration. Les terminaux déjà ouverts lors d’un redémarrage de sshd persistent, et permettent de rattraper les couacs. :slight_smile:

Les groupes .app sont des groupes UNIX, tandis que les .main sont des groupes LDAP destinés aux utilisateurs humains.

On empêche la connexion SSH pour root uniquement pour les connexions provenant de l’Internet. Elles sont autorisées depuis un VPN ou le réseau local, cf. la fin du fichier:

PermitRootLogin no
...
Match Address 192.168.0.0/16,10.0.0.0/8,172.16.0.0/12,169.254.0.0/16,fe80::/10,fd00::/8
    PermitRootLogin yes

Simplifie-toi la vie et ajoute-les au groupe ssh.app.
Sache qu’avec YunoHost 11.1 ont introduira un groupe admins pour que les utilisateurs standards puissent administrer le serveur. Plus besoin de ton user1. :wink:

1 Like

Salut titus :slight_smile:

  • J’avais un SSH déjà ouvert… et fail2ban qui tournait, ce dernier étant très punitif chez moi D:

  • Ok pour les groupes (un peu contre-intuitif : j’aurais pensé que les .app concernait uniquement ce qui passe par les applications Yunohost et que le .main impactait l’ensemble du serveur).

  • Pour root : oui, bien vu. Étant sur des serveurs distants j’ai tendance à oublier cet aspect.

  • Partageant des ressources sur internet, je pense qu’il y a plus de risques d’avoir des tentatives de forcing via des utlisateurs “diffusés” sur diverses app (nextcloud, gitea, etc…) que pour des users “fantômes”.

=> Je vais modifier mon hook pour forcer l’inclusion de mon user dans le groupe ssh.app (pas hyper propre de relancer les commandes à chaque regen_conf, mais au moins pas de risque d’oublier en cas de restoration du système).

Pour le moment ça ressemble à ça :

#!/bin/bash

# A placer dans /etc/yunohost/hooks.d/conf_regen/

if ! grep AllowUsers /etc/ssh/sshd_config; then
    #Remplacer user1 par l'utilisateur pouvant se connecter en ssh
	#Si plusieurs utilisateurs, les separer par  un espace
    sed -i 's/LoginGraceTime 120/LoginGraceTime 120\nAllowUsers user1/g' /etc/ssh/sshd_config
fi

#Remplacer 12345 par le numéro de port SSH voulu (22 par defaut)
yunohost settings set security.ssh.port -v 12345

#Revocation de la possibilité de se connecter avec un password
yunohost settings set security.ssh.password_authentication -v no

#Utilisation de TLS v1.3
yunohost settings set security.ssh.compatibility -v modern

Donc remplacer le bloc if par un truc du genre :

if [[ $(getent group ssh.app | grep user1) == "" ]]; then #Si user1 n'est pas dans le groupe ssh.app
        usermod -a -G ssh.app user1 #on ajoute le user au groupe
fi
1 Like

Pour ceux que ça pourraient intéresser, j’ai refait le hook. Si vous voyez des corrections ou améliorations à apporter, n’hésitez pas :slight_smile:

#!/bin/bash

# A placer dans /etc/yunohost/hooks.d/conf_regen/

# Yunohost et SSH	: voir https://yunohost.org/en/ssh
# Yunohost et Sécurité	: voir https://yunohost.org/en/security

# Variables
USERS=(user1 user2) # liste des utilsateurs, à séparer par des espaces.
PORT=22 # Port SSH (22 par défaut)
PWD=False # (True|False) : True pour autoriser l'authentification par mot de passe, False pour forcer l'authentification par clef
COMPATIBILITY=modern # (intermediate|modern) # Gestion de TLS 1.2, voir https://wiki.mozilla.org/Security/Server_Side_TLS#Intermediate_compatibility_.28default.29


for i in "${USERS[@]}" # on boucle sur les différents utilisateurs de l'array USERS
do
	if [[ $(yunohost user list | grep "username: $i") != "" ]];then # si le user est un user yunohost
		if [[ $(getent group ssh.main | grep $i) == "" ]]; then #Si le user n'appartient pas au groupe LDAP ssh
			yunohost user permission add ssh $i #on ajoute le user au groupe ssh.main (groupe LDAP)
		fi
	elif [[ $(getent group ssh.app | grep $i) == "" ]]; then #Si l'utilisateur n'appartient pas au groupe UNIX ssh
		usermod -a -G ssh.app $i #on ajoute le user au groupe ssh.app (groupe UNIX)
	fi
done


# MaJ du port ssh
if [[ $(grep "Port $PORT" /etc/ssh/sshd_config) == "" ]]; then #test si le port ssh correspond à celui de la variable $PORT
	yunohost settings set security.ssh.port -v $PORT
fi

# Révocation de la possibilité de se connecter avec un password.
#****** /!\ si $PWD=False, assurez vous d'avoir au préalable ajouté une clef à vos users ! /!\ ******


if [[ $(yunohost settings get security.ssh.password_authentication) != "$PWD" ]]; then #test si la possibilité se connecter en SSH avec un mot de passe correspond à la variable $PWD
	if [[ $PWD == "False" ]]; then
		yunohost settings set security.ssh.password_authentication -v no #on force l'authentification par clef
	elif [[ $PWD == "True" ]]; then
		yunohost settings set security.ssh.password_authentication -v yes #on autorise l'authentification par mot de passe
	fi
fi


# Gestion TLS 1.2
if [[ $(yunohost settings get security.ssh.compatibility) != "$COMPATIBILITY" ]]; then #test si on est déjà dans le mode de compatibilité voulu
	yunohost settings set security.ssh.compatibility -v $COMPATIBILITY
fi
1 Like