Recherche de site Web

5 nouvelles fonctionnalités sudo que les administrateurs système doivent connaître en 2022


Les versions récentes de Sudo ont ajouté de nouvelles fonctionnalités qui vous permettent de surveiller et de contrôler les zones à problèmes auparavant cachées.

Lorsque vous souhaitez accorder un accès administratif à certains de vos utilisateurs tout en contrôlant et vérifiant ce qu'ils font sur vos systèmes, vous utilisez sudo. Cependant, même avec sudo, il existe de nombreux problèmes invisibles : pensez simplement à accorder un accès au shell. Les versions récentes de sudo ont ajouté des fonctionnalités qui vous permettent de voir ces problèmes et même de les contrôler. Par exemple, vous pouvez activer des messages de journal plus détaillés et plus faciles à traiter et enregistrer chaque commande exécutée dans une session shell.

Certaines de ces fonctionnalités sont toutes nouvelles. Certains d'entre eux s'appuient sur des fonctionnalités introduites dans la version 1.9.0 ou même antérieure. Par exemple, sudo pouvait enregistrer tout ce qui se passait sur un terminal, même en version 1.8. Cependant, le système stockait ces enregistrements localement, et ils étaient faciles à supprimer, notamment ceux où les enregistrements étaient les plus utiles : les sessions Shell. La version 1.9.0 a ajouté une collection centrale d'enregistrements de session, de sorte que les enregistrements ne peuvent pas être supprimés par l'utilisateur local, et les versions récentes ont ajouté des relais, rendant la collection encore plus robuste.

Si vous ne connaissez que les bases de sudo ou si vous n'avez utilisé que la version 1.8 auparavant, je vous recommande de lire mon article précédent.

1. Journalisation au format JSON

La première nouvelle fonctionnalité que je souhaite introduire est la journalisation au format JSON. Je suis un fanatique de la journalisation (j'ai commencé à travailler sur le projet syslog-ng il y a douze ans), et cette fonctionnalité est la première introduite depuis mon article sur Opensource.com. Lorsqu'il est activé, sudo enregistre beaucoup plus d'informations et le fait de manière plus simple à analyser.

Les messages syslog traditionnels de sudo sont courts et ne contiennent que le minimum d'informations nécessaires. Cela est dû aux contraintes des anciennes implémentations de syslog : les messages de plus de 1 Ko étaient ignorés ou tronqués :

Jan 28 13:56:27 localhost.localdomain sudo[10419]: czanik : TTY=pts/0 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/bash

Les implémentations plus récentes de syslog peuvent gérer des tailles de messages beaucoup plus grandes. syslog-ng accepte par défaut les messages de journal d'une taille allant jusqu'à 64 Ko (mais bien sûr, ils peuvent être plus petits ou plus grands, selon la configuration réelle).

Le même événement contient beaucoup plus d'informations s'il est connecté au format JSON. Plus ne signifie pas plus difficile à gérer : les messages au format JSON sont plus faciles à analyser par de nombreux logiciels de gestion de journaux. Voici un exemple:

Jan 28 13:58:20 localhost.localdomain sudo[10518]: @cee:{"sudo":{"accept":{"uuid":"616bc9efcf-b239-469d-60ee-deb5af8ce6","server_time":{"seconds":1643374700,"nanoseconds":222446715,"iso8601":"20220128125820Z","localtime":"Jan 28 13:58:20"},"submit_time":{"seconds":1643374700,"nanoseconds":209935349,"iso8601":"20220128125820Z","localtime":"Jan 28 13:58:20"},"submituser":"czanik","command":"/bin/bash","runuser":"root","runcwd":"/home/czanik","ttyname":"/dev/pts/0","submithost":"localhost.localdomain","submitcwd":"/home/czanik","runuid":0,"columns":118,"lines":60,"runargv":["/bin/bash"],"runenv":["LANG=en_US.UTF-8","HOSTNAME=localhost.localdomain","SHELL=/bin/bash","TERM=xterm-256color","PATH=/home/czanik/.local/bin:/home/czanik/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin","MAIL=/var/mail/root","LOGNAME=root","USER=root","HOME=/root","SUDO_COMMAND=/bin/bash","SUDO_USER=czanik","SUDO_UID=1000","SUDO_GID=1000"]}}}

Vous pouvez activer les messages de journal au format JSON dans le fichier sudoers :

Defaults log_format=json

Vous pouvez en savoir plus sur l'utilisation des messages de journal au format JSON à partir de sudo sur mon blog syslog-ng.

2. Collecte centralisée des journaux à l'aide de sudo_logsrvd

Une autre fonctionnalité liée à la journalisation dans la version 1.9.4 consiste à collecter tous les messages de journal sudo (y compris les échecs) à l'aide de sudo_logsrvd. Auparavant, le système enregistrait les sessions réussies uniquement lorsque sudo_logsrvd effectuait réellement un enregistrement. La journalisation se fait toujours via syslog par défaut en fin de compte.

Pourquoi est-ce important? Tout d'abord, vous pouvez collecter tout ce qui concerne sudo en un seul endroit : à la fois les enregistrements de session et tous les messages de journal correspondants. Deuxièmement, il peut également garantir une journalisation appropriée de tous les événements liés à sudo, car sudo peut refuser d'exécuter des commandes si sudo_logsrvd est inaccessible.

Vous pouvez activer la journalisation sur sudo_logsrvd avec le paramètre suivant dans le fichier sudoers (bien sûr, remplacez l'adresse IP) :

Defaults log_servers=172.16.167.150

Si vous souhaitez des messages de journal au format JSON, vous avez besoin du paramètre suivant dans la section [eventlog] de la configuration sudo_logsrvd :

log_format = json

Sinon, sudo_logsrvd utilise le format de journal sudo traditionnel avec une simple modification : il inclut également des informations sur l'hôte d'où provient le journal :

Nov 18 12:40:16 centos8splunk.localdomain sudo[21028]:   czanik : 3 incorrect password attempts ; HOST=centos7sudo.localdomain ; TTY=pts/0 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/bash
Nov 18 12:40:23 centos8splunk.localdomain sudo[21028]:   czanik : HOST=centos7sudo.localdomain ; TTY=pts/0 ; PWD=/home/czanik ; USER=root ; TSID=00000A ; COMMAND=/bin/bash
Nov 18 12:40:30 centos8splunk.localdomain sudo[21028]:   czanik : command rejected by I/O plugin ; HOST=centos7sudo.localdomain ; TTY=pts/0 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/bash

3. Relais

Lorsqu'ils ont initialement introduit sudo_logsrvd (version 1.9.0) pour la collecte centrale des enregistrements de session, les clients ne pouvaient envoyer que des enregistrements directement. La version 1.9.7 a introduit le concept de relais. Avec les relais, au lieu d'envoyer directement des enregistrements, vous pouvez envoyer des enregistrements à plusieurs niveaux d'hôtes intermédiaires, qui structurent votre réseau.

Pourquoi est-ce important? Tout d'abord, les relais permettent de collecter des enregistrements de sessions même si l'hôte central est indisponible en raison de problèmes de réseau ou de maintenance. Par défaut, sudo refuse de s'exécuter lorsqu'il ne peut pas envoyer d'enregistrements, afin que les relais puissent garantir que vous pouvez utiliser sudo 24 heures sur 24.

Deuxièmement, cela vous permet également d'avoir des contrôles plus stricts sur votre réseau : au lieu d'ouvrir le pare-feu pour tous les hôtes vers le sudo_logsrvd central, il vous suffit d'autoriser le passage de votre relais.

Enfin, il permet de collecter des enregistrements de sessions depuis des réseaux sans accès direct à Internet, comme les réseaux privés AWS, sur lesquels vous pouvez installer sudo_logsrvd en mode relais sur l'hôte passerelle.

Lorsque vous utilisez des relais, la configuration des clients sudo et du sudo_logsrvd central reste la même. Sur l'hôte relais, ajoutez la ligne suivante à la section [relay] de sudo_logsrvd.conf :

relay_host = 172.16.167.161

Si la connexion réseau vers le serveur central est problématique, vous pouvez configurer le relais pour stocker les enregistrements avant de les transférer :

store_first = true

4. Sous-commandes de journalisation

Avez-vous déjà voulu savoir ce qui se passe lors d'une session shell démarrée via sudo ? Oui, les enregistrements de session sont là, mais regarder des heures d'enregistrement juste pour voir quelques commandes exécutées est ennuyeux et une énorme perte de temps. Heureusement, la version 1.9.8 a introduit les sous-commandes de journalisation. Il suffit désormais de vérifier régulièrement vos messages de journal et de regarder les enregistrements uniquement lorsque quelque chose de suspect se produit.

Vous n'avez même pas besoin d'une règle pour autoriser l'accès au shell, il suffit d'accéder à un éditeur. La plupart des éditeurs peuvent exécuter des commandes externes. Mon éditeur préféré est JOE, et voici ce que vous pouvez voir lorsque je le démarre via sudo :

Aug 30 13:03:00 czplaptop sudo[10150]:   czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/joe

Rien d'intéressant, juste un éditeur, même si je génère un shell et supprime quelques fichiers et partitions de ce shell. Voyons maintenant ce qui se passe lorsque vous activez les sous-commandes de journalisation :

Aug 30 13:13:14 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/joe
Aug 30 13:13:37 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/sh -c /bin/bash
Aug 30 13:13:37 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/bash
Aug 30 13:13:37 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/readlink /proc/10889/exe
[...]
Aug 30 13:13:37 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/sed -r s@/*:|([^\\]):@\1\n@g;H;x;s@/\n@\n@
Aug 30 13:13:37 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/tty
Aug 30 13:13:42 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/id
Aug 30 13:13:56 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/ls -A -N --color=none -T 0 /usr/share/syslog-ng/include/scl/

J'ai omis des dizaines de lignes pour gagner de la place, mais vous pouvez toujours voir que j'ai démarré un shell, et les commandes exécutées par bash_profile sont également disponibles dans les logs.

Vous pouvez activer les sous-commandes de journalisation dans le fichier sudoers en utilisant le paramètre suivant :

Defaults log_subcmds

Dans les journaux sudo traditionnels, vous pouvez voir à partir de l'identifiant du processus sudo que ces journaux proviennent de la même session sudo. Si vous activez la journalisation au format JSON, comme indiqué précédemment, sudo enregistre beaucoup plus d'informations dans les journaux, ce qui facilite leur analyse.

5. Interception des sous-commandes

Les sous-commandes de journalisation suppriment la plupart des problèmes cachés de sudo, mais il existe des situations dans lesquelles vous ne souhaitez pas simplement regarder ce qui se passe, mais également contrôler le flux des événements. Par exemple, vous devez accorder l'accès au shell à un utilisateur tout en souhaitant l'empêcher d'exécuter une commande spécifique. L'interception est idéale dans de tels cas. Il existe bien sûr certaines limitations, comme par exemple que vous ne pouvez pas limiter les commandes intégrées des shells.

Disons que la commande who est dangereuse. Vous pouvez activer l'interception en deux étapes : la première l'active, la seconde la configure. Dans ce cas, mon utilisateur n'est pas autorisé à exécuter who :

Defaults intercept
czanik ALL = (ALL) ALL, !/usr/bin/who

Voici ce qui se passe lorsque je démarre une session root shell via sudo et que j'essaie d'exécuter who :

$ sudo -s
# who
Sorry, user czanik is not allowed to execute '/usr/bin/who' as root on czplaptop.
bash: /usr/bin/who: Permission denied

Vous pouvez facilement désactiver complètement les shells en cours d’exécution :

Defaults intercept
Cmnd_Alias SHELLS=/usr/bin/bash, /usr/bin/sh, /usr/bin/csh
czanik ALL = (ALL) ALL, !SHELLS

Cependant, cela signifie également que vous ne pouvez pas démarrer de sessions shell via sudo. Non seulement cela, mais vous ne pouvez pas non plus exécuter de commandes externes à partir d’éditeurs. Voici ce qui se passe lorsque j'essaie de démarrer la commande ls depuis vi :

$ sudo vi /etc/issue
Sorry, user czanik is not allowed to execute '/bin/bash -c /bin/ls' as root on czplaptop.
Cannot execute shell /bin/bash
Press ENTER or type command to continue

Quelle est la prochaine?

J'espère que la lecture de mon article vous donnera envie d'essayer vous-même ces nouvelles fonctionnalités. Vous pouvez installer la dernière version de sudo sur de nombreuses distributions Linux et variantes UNIX à partir de votre gestionnaire de packages, ou utiliser un programme d'installation binaire disponible sur le site Web Sudo.

Cet article ne vous donne qu’un aperçu des nouvelles possibilités. Si vous souhaitez en savoir plus sur ces fonctionnalités, visitez le site Web, qui héberge des pages de manuel, ainsi que le blog Sudo.

Articles connexes: