J'ai résolu ce problème : « Impossible d'exécuter /bin/bash : Permission non accordée. »

Gazette Linux n°52 — Avril 2000

Xavier Serpaggi

Adaptation française 

Frédéric Marchal

Correction du DocBook 

Article paru dans le n°52 de la Gazette Linux d'avril 2000.

Cet article est publié selon les termes de la Open Publication License. La Linux Gazette n'est ni produite, ni sponsorisée, ni avalisée par notre hébergeur principal, SSC, Inc.


Peu de temps avant de commencer à écrire cet article j'ai réussi à résoudre un problème qui a été ma bête noire pendant ces deux dernières semaines. Étant donné que c'est un problème que j'ai vu souvent réapparaître dans la Linux Gazette, en général rédigé d'une manière laissant penser que l'auteur l'a écrit avec les doigts de pieds parceque debout sur une chaise et la corde au coup, j'ai décidé de partager mon expérience avec les autres lecteurs, leur évitant ainsi le gaspillage d'une bonne corde. Ca peut être également vu comme un bon guide pour se debrouiller des problèmes logiciels en général. Mais soyez cependant prévenu qu'un problème de login peut mêtre en jeu n'importe lequel des domaines couverts ici — ce qui a servi à résoudre mon problème n'est peut-être pas une solution pour vous.

Il y a quelques semaines de ça j'ai pris la décision d'installer un MUA (Mail User Agent — un logiciel pour lire mon courrier) sur ma machine. C'est quelque chose d'étonnant quand on sait que je vis sur un bateau ancré bien loin de toute ligne téléphonique ou même électrique, mais j'ai mes raisons. J'avais fait ça à terre avant ; je voulais juste essayer quelques trucs.

Un MUA n'est rien sans un logiciel qui distribue le courrier (un MTA : Mail Transfert Agent). Il faut donc faire une installation conjointe MTA/MUA. Pas de problème, j'ai toujours la distribution Debian complète sur une partition Linux de mon disque dur. Ça accélère les installation et ça rend les recherches de paquetages triviales.

Pour vous dire la vérité je n'aime pas la commande su ou tout du moins pour tout ce qui touche à des opérations majeures. Le fait que cette commande conserve l'environnement de l'utilisateur original plutôt que de prendre celui de la personne qui est su-dé m'a rendu certains moments « intéressants ». C'est bon pour faire des petites modifs de permissions ou des changements dans les fichiers de /etc, mais dès qu'il sagit de travail sérieux comme l'installation ou la désinstallation de plusieurs paquetages majeurs (je n'était pas sur du MTA que je voulais), je me loge en tant que root.

Au travail. Midnight Commander permet, en quelques frappes de touches, de parcourir et d'explorer des répertoires mais également de regarder le contenu (et d'installer) des paquetages Debian ou RedHat. Voyons voir... sendmail (lire la page de manuel à l'intérieur du paquetage, regarder les docs, installer...) Non, trop gros et trop compliqué. J'ai besoin de quelque chose de plus simple. (Je désinstalle sendmail). exim ?... exmh ?... mh ?... nmh ? Tous ont eu droit au même sort d'installation et de désinstallation. Ceci à l'exception des bibliothèques : si j'installe une bibliothèque, elle reste installée. En faisant ça sur un nouveau système on arrive rapidement au moment où ne se voit plus importuné par des requettes de bibliothèques non trouvées. Si certaines bibliothèques n'étaient pas mutuellement exclusives sur certaines distributions, je les installerais toutes pour ne plus jamais avoir à m'en soucier !

Cependant, il me restait toujours à trouver un MTA. Ah, smail ! Facile à installer, se configure sans peine, voilà, c'est fait. Le choix du MUA a été facile vu que j'aime beaucoup les possibilités de configuration de Mutt. Et c'est terminé ! (des mots prophétiques...)

SAUF QUE : je ne pouvais plus me loger en tant qu'utilisateur non-root. Le message que j'avais était :

Impossible d'exécuter /bin/bash : permission non accordée.

Qu'est-ce que diable c'était que cela ?

Était-ce là quelque illusion occulte ?

Quelque intrusion démente ?

C'etait là des choix que Salomon

Lui même n'avait encore jamais eu à faire..

Je savais que je n'avais rien touché dans /etc/password et pour cause, je n'avais rien touché à ce qu'il y a dans /etc. Mais je n'étais pas 100% sûr de ce que ces paquetages, sécurisés comme ils sont sensés l'être, avaient fait avec mes privilèges root. J'ai tout de suite fait une vérification. Oui l'utisateur ben existe encore dans /etc/password ; idem pour le groupe ben dans /etc/group et le fait d'entrer un mauvais mot de passe me donnait bien le message « Login incorrect » au lieu du « Impossible d'exécuter ». Mouais !

Autre vérification : je crée un nouvel utilisateur (joe) avec un mot de passe (joe) :)) et je tente de me loger sous ce nom. Rien à faire, même erreur. Quelque chose était foutu dans la séquence de login, pour je ne sais quelle raison. (À Dieu joe...)

A ce moment là j'ai eu un peu peur ; j'ai sauté sur un autre terminal et j'ai essayé de me loger en tant que root. OUF ! Pas de problème de ce côté. J'aurai au moins encore accès à la machine la prochaine fois que je la remétrai en route... J'aurai détesté avoir eu à faire une sauvegarde à la volée et avoir tout à réinstaller !

Voyons voir dans /bin>. À quoi ressemblent les permissions des fichiers ? Ha, tout est à 755 (-rwxr-xr-x) ; en plus login, mount, umount, ping et su sont tous SETUID (-rwsr-xr-x). Jusque là tout va bien. Qu'en est-il des permissions de /etc ? Elles ont toutes l'air OK. 644 pour la plupart (-rw-r--r--), avec de temps en temps un 600 (-rw-------) ici et là pour les fichiers interdits à tous sauf à root. Bien, essayons quelque chose de stupide ; j'écrase login et bash avec de toutes nouvelles version à peine sorties de leur paquetage, juste pour être sûr qu'ils n'étaient pas corrompus. Ben non ; toujours pas de chance.

Attendez, et /home ? Si les permissions de ce répertoire étaient fausses et que l'utilisateur ne pouvait y accéder... Zut, c'était bon aussi : 6775 (drwxrwsr-s). Je n'ai rien trouvé de plus en vérifiant les fichiers .bashrc et .bash_profile ; de plus leurs permissions étaient correctes. Juste pour voir j'ai vérifié tous les répertoires de / ; tous sauf root étaient lisibles par tout le monde, c'est ce qu'il faut.

Dans /var il y a des fichiers qui conservent une trace des personnes qui se sont connectées, du moment où elles se sont déconnectées et du reste. Si ces fichiers sont corrompus, toutes sortes de choses étranges et imprévisibles arrivent. Donc, mesure d'urgence, je tape :

cat >/var/log/wtmp
cat >/var/run/utmp

Ceci a pour effet de détruire le contenu de ces fichiers et de les laisser vide avec une taille nulle.

Je me suis déloggé de tous les terminaux (comme ça, utmp et wtmp vont recevoir quelques infos), et... argh, le résultat habituel.

Qu'en est-il des permissions de /dev/ttyX et de /dev/vcsX (terminaux et consoles virtuelles) ? Elles étaient également toutes bonnes. Je commençais à perdre espoir.

Bon, et si je faisais une approche systématique ? Essayons d'avoir une idée de ce qui se passe exactement avant de faire tout et n'importe quoi. Je jette un œil, pour me raffraichir la mémoire, au Guide de l'Administrateur Système et, ah, voilà, le processus de login :

Tiré du « Guide de l'Administrateur Système » de Lars Wirzenius :

Tout d'abord init s'assure qu'il existe un programme getty pour se loger au terminal (ou à la console). getty surveille le terminal et attend que l'utilisateur signale qu'il est prêt à se loger (cela signifie en général que l'utilisateur doit taper quelque chose). Quand un utilisateur est détecté, getty affiche un message de bienvenue (stocké dans /etc/issue), demande le nom d'utilisateur et enfin le mot de passe. Si tout correspond, login lance le shell configuré pour l'utilisateur ; sinon, il sort tout simplement et met fin au processus (après peut-être avoir donné à l'utilisateur une autre chance pour entrer sont nom d'utilisateur et son mot de passe). init se rend compte que le processus est terminé et lance un nouveau getty pour le terminal.


                                                        ' ' ' ' ' ' ' ' '
                       ------------                    '    GIF2ASCII    '
                      |   Début    |                   '  conversion par '
                       ------------                    '  "fastfingers"  '
                   -------------------                 '  Copyleft 2000  '
       ___________| init: fork + exec |_______         '                 '
      |           | "/sbin/getty"     |       |        '     Revu par    '
      |            -------------------        |        ' Xavier Serpaggi '
      ^                     V                 ^         ' ' ' ' ' ' ' ' '
      |   ---------------------------------   |
      |  | getty: en attente d'utilisateur |  |
      |   ---------------------------------   |
      ^                     V                 ^
      |   ----------------------------------  |
      |  |     getty: lecture du nom        | |
      |  | d'utilisateur, exec "/bin/login" | |
      |   ----------------------------------  |
      ^                     V                 ^
      |   --------------------------------    |
      |  | login: lecture du mot de passe |   |
      |   --------------------------------    |
      ^                     V                 ^
      |                    / \                |
      |                   /   \               |
 -------------           / est-\              |
| Login: fin  |--<-Non- /  ce   \             |
 -------------          \ bon ? /             ^
                         \     /              |
                          \   /               |
                           \ /                |
                            | Oui             ^
                            V                 |
                ------------------------      |
               | login: exec("/bin/sh") |     |
                ------------------------      ^
                            V                 |
               --------------------------     |
              | sh: lecture et exécution |    |
              | des commandes            |    ^
               --------------------------     |
                            V                 |
                        ----------            |
                       | sh: fin  |-----------
                        ----------

Figure 8.1 : Connection via des terminaux : interaction entre init, getty, login et le shell.

Notez que le seul processus nouveau est celui crée par init (en utilisant l'appel système fork) : getty et login se contentent de remplacer le programme qui tourne dans le processus (en utilisant l'appel système exec).

Si on suit le diagramme, on peut voir que tout semble bon au moins jusqu'à la dernière partie, le exec("/bin/sh"). C'est pendant, ou après cet appel, que tout fout le camp. Le problème était à présent au niveau des appels système, quelque chose que je ne savais pas comment approcher... et pourtant c'est là que se trouvait la solution ; seulement je ne savais pas comment l'appliquer. Plus tard ça deviendra évident.

Pendant à peu prés les dix jours qui suivirent, chaque fois que je me logais j'essayais quelque chose de nouveau ; des trucs complètement incongrus et très peu aptes à fonctionner ; parfois j'avais des idées géniales qui conduisirent à de grandes déceptions quand, encore une fois, ce satané message apparaissait. Rien ne fonctionnait. J'ai remplacé getty, j'ai essayé d'autres shells que /bin/bash, j'ai essayé de su-dé à ben, j'ai vérifié les fichiers de log (ils montraient que ben avait réussi à se connecter avec succès (!), ce qui m'appris que login fonctionnait correctement et que le problème venait de la prise en main de bash : je le savais déjà !)...

Après n'avoir trouvé que quelques références sur l'Internet, la plupart en japonais, suédois et allemand (j'ai réussi à faire quelque chose des deux derniers dont un suggerait de vérifier les permissions de / ! Excellente idée... qui ne mena à rien dans mon cas), j'ai lancé un appel au secour sur The Answer Guy... Salut ! :)) Malheureusement il a du être noyé dans toutes ces questions sur Windows2000 auquel il adore répondre... Allez, débrouille toi tout seul.

Ah ! strace ! Tu te souviens de strace ; strace est ton ami... Un super programme qui trace l'exécution d'un programme et en fait un rapport pas à pas. C'est parti !

Comme vous devez être logé pour lancer un programme, j'ai exécuté

strace -s 10000 -vfo login.ben login ben

depuis le terminal courrant. Ceci signifiait « Lance strace sur login ben ; affiche toutes les lignes de moins de 10000 caractères (je ne voulais pas rater de message, peu importe s'ils étaient très long) ; soit bavard ; fait un rapport de n'importe quel processus fork-é ; met le résultat dans le fichier login.ben ». Et pour avoir une base de comparaison je lançais

strace -s 10000 -vfo login.root login root

et à présent, j'avais deux fichiers à comparer. Celui de root était à peu prés deux fois plus long que celui de ben. Cela semblait correct vu qu'un login fructueux mène à l'exécution de tout dans les fichiers ~/.bash*.

strace login est très intéressant à lire. Si je n'avais pas lu le Guide de l'Administrateur Système avant, ça m'aurait donné toutes les informations précisément — avec bien plus de détails. Il montre toutes les bibliothèques qui sont lues, tous les fichiers qui sont examinés par login, les procédures de comparaison pour group et password... La seule chose qu'il ne montrait pas était la raison de l'échec ; uniquement le fait lui-même, exactement où je l'attendais :

(300+ lines elided)
execve("/bin/bash", ["-bash"], ["TERM=linux", "HZ=100", "HOME=/home/ben", 
    "SHELL=/bin/bash", "PATH=/bin:/usr/bin", "USER=ben", "LOGNAME=ben", 
    "MAIL=/var/spool/mail/ben", "LANG=C", "HUSHLOGIN=FALSE"]) = -1 EACCES 
    (Permission denied)            
write(2, "Cannot execute /bin/bash: Permission denied\n", 44) = 44

Super. Le dernière chose que ce pauvre login essaye de faire avant de se retrouver les quatre fers en l'air est d'execve bash avec les variables collectées dans /etc/password, /etc/login.defs et ainsi de suite — toutes paraissant OK — et d'écrire ces 44 caractères détestables sur stderr (descripteur de sortie numéro 2). En gros, ce dont je m'étais déjà rendu compte.

Cependant, j'ai remarqué que login ouvrait un certain nombre de bibliothèques dans /lib qui étaient nécessaires au fichier de configuration du Name Service Switch (littéralement le service de commutation de noms) : /etc/nsswitch.conf. Et si une des bibliothèques mentionnées était corrompue ? Ce serait en ligne directe avec la thèorie des appels système puisque les bibliothèques sont le point de départ de ces appels système ! Vérifions les bibliothèques qui se chargent des logins locaux pour NSS (reportez-vous à la page de manuel de nsswitch) :

dpkg -S libnss_compat-2.0.7.so

(« Dis moi, Ô puissant gestionnaire de paquetages Debian d'où vient le dit programme ? »), et l'Oracle Debian dans son infinie sagesse répondi :

libc6: /lib/libnss_compat-2.0.7.so

Mouais. Le cœur même des bibliothèques de Linux. Bon... je tente un rapide remplacement de toutes les bibliothèques /lib/libnss*... et pas de changement. Idée suivante.

Cependant cela me fit réfléchir. Il y avait vraiment « quelque chose de pourri au royaume de Danemark ». Peut-être devrai-je vérifier les permissions des fichiers dans /lib ?

Le seul problème était que je ne connaissais pas les valeurs qu'elles étaient sensées avoir. Vous voyez, la plupart des bibliothèques sont positionnées avec les attributs root.root 644 (propriétaire root, groupe root, utilisateur autorisé en lecture/écriture, groupe autorisé en lecture seule, les autres autorisés en lecture seule). Cependant certaines avaient des droits root.root 755, soit la même chose que précédemment mis à par une posibilité d'exécution pour tout le monde. Sans pouvoir jetter un œil a une installation récente de Linux, je n'avais aucune idée de ce qui était bon.

Mais, une seconde ! Comme je l'avais écrit dans un conseil à 3 sous que j'avais envoyé à la Linux Gazette, j'aime bien garder des fichiers copie de l'installation Debian de base (7 fichiers pour à peu prés 15 Mo) sur ma partition DOS comme utilitaire de sauvetage. Ça devrait contenir tout ce dont j'ai besoin !

Et tel fut le cas. Midnight Commander, par le biais de son Système de Fichiers Virtuel (VFS en anglais) vous permet d'explorer les fichiers compressés comme s'ils étaient des répertoires ; un coup d'œil à base2_1.tgz#utar/lib (la syntaxe VFS utilisée pas MC) me montra que l'une des toutes premières bibliothèques (ld-2.0.7.so) était sensée avoir des permissions positionnées à 755. Dix secondes plus tard, j'étais le propriétaire d'un tout nouveau VT en tant qu'utilisateur ben.

J'ai bien sûr vérifié les permissions de toutes les autres bibliothèques et ld-2.0.7.so avait éte la seule à être affectée. La seule inconnue était de savoir comment les permissions ont changé... mais je devine que cette question n'obtiendra jamais de réponse.

Comme d'habitude, les leçons que Linux nous enseigne sont dures, mais honnêtes. Il y a toujours un moyen de résoudre un problème ; il faut bien admettre que parfois, la manière la plus simple est de réinstaller tout le système, mais cela nous vous montre pas le « cœur » d'un OS ; ce à quoi le fait de rechercher la cause d'un problème aboutira. Dans mon cas la réinstallation aurait été assez facile : j'ai quelques disques dur de rechange, assez gros pour contenir toutes mes données, même les plus récentes, pour ne pas avoir à toucher à mes sauvegardes. De plus, l'installation basique d'une Debian ne me prend pas plus de 10 minutes. Mais cela ne m'interessait pas. Ce qui me venait constament à l'esprit était : « Que se passerait-il si cela arrivait à un de mes utilisateurs ? » Je devais savoir comment m'en sortir... et grace à la persévérance — non, uniquement pour emmerder le monde — j'ai réussi.

Je ne suis pas en train de vous conseiller de vous prendre la tête sur un problème une fois par semaine juste pour garder la forme, mais je suggère que vous utilisiez une approche méthodique, basée sur le savoir que vous avez acquis par la lecture des HOWTO appropriés ainsi que d'autres documentations que vous auriez pu vous procurer avant d'avoir recours, une fois de plus, au CD d'installation. Il se passera du temps avant que vous ne préfériez rire comme un maniaque en voyant votre système devenir gros comme une tête d'épingle aprés que vous l'ayez lancé de votre appartement tout en haut de l'Empire State Building... Et il se passera également du temps avant que la satisfaction d'avoir résolu un problème épineux comme celui-là vous fasse bomber le torse et vous lancer dans une imitation de Tarzan.

Et à présent, si vous voulez bien m'excuser, il y a un chimpanzé et un éléphant que je suis sensé rencontrer...

Joyeuses Linuxations à tous.

Adaptation française de la Gazette Linux

L'adaptation française de ce document a été réalisée dans le cadre du Projet de traduction de la Gazette Linux.

Vous pourrez lire d'autres articles traduits et en apprendre plus sur ce projet en visitant notre site : http://www.traduc.org/Gazette_Linux.

Si vous souhaitez apporter votre contribution, n'hésitez pas à nous rejoindre, nous serons heureux de vous accueillir.