L'option Match de sshd_config
Aujourd’hui je vais vous inviter à vous intéresser à une option méconnue de sshd_config et pourtant qu’elle est bien : Match.
Voici les explications en Anglais tiré du man sshd_config de Debian 8 (c’est la même chose que le man sshd_config de Ubuntu 15.10).
Match Introduces a conditional block. If all of the criteria on the Match line are satisfied, the keywords on the following lines override those set in the global section of the config file, until either another Match line or the end of the file. If a keyword appears in multiple Match blocks that are satisfied, only the first instance of the keyword is applied.
The arguments to Match are one or more criteria-pattern pairs or the single token All which matches all criteria. The available criteria are User, Group, Host, LocalAddress, LocalPort, and Address. The match patterns may consist of single entries or comma-separated lists and may use the wildcard and negation operators described in the PATTERNS section of ssh_config(5).
The patterns in an Address criteria may additionally contain addresses to match in CIDR address/masklen format, e.g. “192.0.2.0/24” or “3ffe:ffff::/32”. Note that the mask length provided must be consistent with the address – it is an error to specify a mask length that is too long for the address or one with bits set in this host portion of the address. For example, “192.0.2.0/33” and “192.0.2.0/8” respectively.
Only a subset of keywords may be used on the lines following a Match keyword. Available keywords are AcceptEnv, AllowAgentForwarding, AllowGroups, AllowStreamLocalForwarding, AllowTcpForwarding, AllowUsers, AuthenticationMethods, AuthorizedKeysCommand, AuthorizedKeysCommandUser, AuthorizedKeysFile, AuthorizedPrincipalsFile, Banner, ChrootDirectory, DenyGroups, DenyUsers, ForceCommand, GatewayPorts, GSSAPIAuthentication, HostbasedAcceptedKeyTypes, HostbasedAuthentication, HostbasedUsesNameFromPacketOnly, IPQoS, KbdInteractiveAuthentication, KerberosAuthentication, MaxAuthTries, MaxSessions, PasswordAuthentication, PermitEmptyPasswords, PermitOpen, PermitRootLogin, PermitTTY, PermitTunnel, PermitUserRC, PubkeyAcceptedKeyTypes, PubkeyAuthentication, RekeyLimit, RevokedKeys, RhostsRSAAuthentication, RSAAuthentication, StreamLocalBindMask, StreamLocalBindUnlink, TrustedUserCAKeys, X11DisplayOffset, X11Forwarding and X11UseLocalHost.
Ok je vous ai déjà perdu, restez encore un peu, je vais essayer de vous tirer une larme d’émerveillement. Voici le block que j’utilise chez moi. Concrètement ça fait quoi ? Concrètement je ne peux me connecter en root que si mon adresse IP est sur le réseau local (192.168.1.0/24) ou l’adresse IP fixe du boulot (134.22.128.63), aucune autre adresse ne pourra se connecter en root. Sympa non ?
Match Address 192.168.1.0/24,134.22.128.63 PermitRootLogin yes Match Address * PermitRootLogin no
Voici le block que j’utilise au boulot. Concrètement ça fait quoi ? La même chose, seules les adresses IP des membres du service Informatique peuvent se connecter en root sur les serveurs.
Match Address 191.168.1.2,192.168.1.3,192.168.1.4 PermitRootLogin yes Match Address * PermitRootLogin no
Arrivé là normalement je me fais caillasser « non mais t’as pas honte, t’es sysadmin, tu te connectes directement en root via SSH ! ». Non j’ai même pas honte… et j’aime ça ! Mais bon je vais prendre d’autres exemples pour calmer la foule déchainée.
Voici le block afin de permettre la connexion SSH de l’utilisateur rambo uniquement à partir du poste 192.168.1.22.
Match Address 192.168.1.22 AllowUsers rambo
Voici le block afin que l’utilisateur rambo ne puisse pas utiliser le X11Forwarding.
Match User rambo X11Forwarding no
On peut complexifier ou sécuriser un peu plus l’exemple précédent. Cette fois John rambo peut utiliser le X11Forwarding mais uniquement à partir d’un poste précis.
Match User rambo Address 192.168.1.22 X11Forwarding yes Match User rambo Address * X11Forwarding no
Voici le block afin de permettre à papanoel de travailler dans un environnement sécurisé.
Match User papanoel Host polenord Banner /home/augier/merciderespectermaviepriveesinonjemords.txt X11Forwarding no
Les possibilités sont multiples et peuvent répondre à bien des problématiques. Pour ceux qui ne savent pas lire ou qui n’ont pas pris soin de le faire (If all of the criteria on the Match line are satisfied, the keywords on the following lines override those set in the global section of the config file, until either another Match line or the end of the file) donc le block se met à la fin du fichier sshd_config. Avant Ansible j’utilisais ça dans un script à titre d’exemple.
echo -e "\nMatch Address 192.168.1.2,192.168.1.3,192.168.1.4\nPermitRootLogin yes\n\nMatch Address *\nPermitRootLogin no" >> /etc/ssh/sshd_config
Je vous rappelle que pour redémarrer le service SSH c’est systemctl restart sshd
et qu’il faut vérifier ensuite qu’il est bien démarré avec systemctl status sshd
afin de s’éviter de s’enfermer dehors à cause d’une erreur dans sshd_config.
Bon week-end les filles !
Déjà 4 avis pertinents dans L'option Match de sshd_config
Les commentaires sont fermés.
Par contre la ligne qui m’a fait sauter au plafond c’est « PermitRootLogin yes ». Pour ton serveur privé, je veux bien (et encore), mais pour un serveur d’entreprise, c’est non. Les bonnes pratiques veulent qu’on se connecte avec un compte non root et qu’on fasse une élévation privilèges.
Afin d’être clair :
– Les serveurs pros sont derrière un firewall qui protège tous les postes/serveurs de l’entreprise
– Il n’y a aucune règle pour taper les SSH des serveurs à partir de l’extérieur sur ce firewall
– Sur les serveurs le port SSH est modifié, il y a la config que j’ai présenté avec l’option Match, il y a un script qui gère les règles iptables, il y a fail2ban
A partir de là je veux bien que tu me dises que tu n’es toujours pas d’accord, je maintiens cependant mon PermitRootLogin sur quelques adresses IP. On sait tous que c’est une bonne pratique de ne pas se connecter en root via SSH après chacun gère comme il veut. D’ailleurs la bonne pratique c’est de ne jamais se mettre en root et tout faire avec sudo. En ce qui me concerne c’est inenvisageable, une perte de temps trop grande.
Est-ce que tu travailles uniquement avec sudo de ton côté ? Des options particulières ?
Merci, Tcho !
Ca évite de modifier la config quand on veut ajouter des droits à un utilisateur pour se connecter en ssh ou sft sur un serveur.
Oui c’est une bonne manière de faire effectivement.
Tcho !