Un prestataire avec la clé de tout
Pour qu’un prestataire corrige un fichier de configuration, un administrateur lui donne sudo pour un seul éditeur, sans mot de passe.
Un an plus tard, un audit révèle que ce prestataire pouvait devenir root à tout moment. L’éditeur était la porte.
À la fin de cette leçon
Remarque
Je peux expliquer comment une erreur permet de devenir root et comment la corriger.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Privilège | le pouvoir d’un compte sur la machine | |
| Moindre privilège | donner à chaque compte seulement le pouvoir que son travail demande | |
| Setuid | un réglage de fichier : il tourne avec son propriétaire, quel que soit celui qui le lance | -rwsr-xr-x |
| Règle sudo | une ligne qui dit qui peut lancer quoi en root | |
| Audit | vérifier un système avec une liste d’erreurs connues |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
La règle d’or
Attention
Regardez seulement la machine de ce labo. Elle est à vous seul et ne peut atteindre personne d’autre. Faire cela sur une machine qui n’est pas la vôtre, sans permission, est puni par la loi.
Setuid lance un fichier avec son propriétaire
La plupart des programmes tournent avec les droits de celui qui les lance. Un programme setuid tourne avec les droits de son propriétaire.
Certains en ont besoin. passwd doit modifier un fichier protégé. Mais un programme setuid appartenant à root, qui n’aurait jamais dû l’être, est un chemin vers root.
Trouver les programmes setuid
find /usr/local/bin /usr/bin -perm -4000 -type fAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Regarder le premier
ls -l /usr/local/bin/sysfindAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Exemple travaillé : lire le s
| Mode | Sens |
|---|---|
| -rwxr-xr-x | Un programme ordinaire |
| -rwsr-xr-x | Setuid : il tourne avec son propriétaire |
| -rwxr-sr-x | Setgid : il tourne avec son groupe |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une règle sudo peut être trop large
Une règle sudo nomme un utilisateur, ce qu’il peut devenir et quels programmes il peut lancer. NOPASSWD veut dire qu’aucun mot de passe n’est demandé.
Nommer un seul programme semble sûr. Ça ne l’est pas si ce programme peut en lancer un autre. Un éditeur, un afficheur de pages ou find peuvent ouvrir un shell. Un shell ouvert dans sudo est un shell root.
Que peut lancer le compte intern ?
sudo -l -U internAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
La règle elle-même
sudo cat /etc/sudoers.d/90-lab-internAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Exemple travaillé : règles étroites et larges
| Règle | Risque | Mieux |
|---|---|---|
| ops ALL=(ALL) NOPASSWD: ALL | Root pour tout, sans mot de passe | Nommer les quelques commandes utiles |
| presta ALL=(root) NOPASSWD: /usr/bin/vim | vim peut ouvrir un shell | Laisser sudoedit modifier un seul fichier |
| web ALL=(root) /usr/bin/systemctl restart boutique | Étroite : une seule commande exacte | La garder telle quelle |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Erreur fréquente
Attention
Beaucoup de gens pensent qu’une règle sudo pour un seul programme est étroite. Elle ne l’est que si ce programme ne peut pas en lancer d’autres. Avant d’en autoriser un, demandez-vous : peut-il ouvrir un shell, ou un autre fichier en root ?
Root fait confiance au script qu’il lance
Le cron de root lance un script chaque minute. Si n’importe qui peut modifier ce script, n’importe qui peut faire exécuter ses commandes par root.
La règle est simple. Un fichier que root lance appartient à root, et personne d’autre ne peut y écrire. Le dossier qui le contient compte aussi.
Trouver les fichiers que tous peuvent modifier
find /opt -perm -o+w -type fAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Le mode, le propriétaire et le nom
stat -c "%a %U %n" /opt/maintenance/cleanup.shAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Root le lance-t-il vraiment ?
sudo crontab -l -u rootAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Les trois erreurs et leur correction
| Erreur | Comment la repérer | Comment la fermer |
|---|---|---|
| Une copie setuid d’un outil | find avec -perm -4000 | chmod u-s, ou supprimer la copie |
| Une règle sudo trop large | sudo -l et /etc/sudoers.d | Nommer des commandes exactes, ou sudoedit |
| Un script de root que tous peuvent modifier | find avec -perm -o+w | chmod 755 et propriétaire root |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Faites le labo, puis fermez la faille
Astuce
Le labo vous demande d’utiliser une de ces erreurs sur votre propre machine et d’écrire ce que vous avez fait. Faites-le d’abord. Ensuite, notez dans votre compte rendu comment vous fermeriez la faille, avec le tableau ci-dessus.
Pour aller plus loin
Lancez find /opt /usr/local/bin /etc/cron.d -type f -perm /022. Le /022 veut dire « le groupe ou les autres peuvent écrire ».
Pour chaque ligne affichée, notez trois choses dans votre compte rendu. Qui peut modifier le fichier ? Qui le lance ? Quelle commande unique ferme la faille ?