Cours Linux : Les permissions
Cet article a été publié par Benjamin
le 09-02-09 à 10:13 dans la catégorie Cours Linux
Tags :
- Cours
- Libre
- Ubuntu
Tout linuxien sait ce que sont les permissions dans un système Unix. En revanche, tous ne savent pas forcément comment modifier ces droits, et surtout, comment bien les modifier.
Dans ce cours, nous allons étudier les différents privilèges d'un système Unix, comment modifier les droits d'un fichier de manière optimale et les risques encourus en cas de mauvaise gestion de ces droits.
I. Présentation des différents droits Unix
La philosophie d'un système Unix est la suivante : tout est fichier. En effet, dans un système Unix, tout est caractérisé par un fichier, que ce soit un fichier texte, un répertoire ou les périphériques de la machine.
Il est donc primordial d'avoir connaissance et de maitriser les différents droits applicables à un fichier.
Pour voir les différents droit des fichiers, exécutons la commande ls -l
dans un terminal :
-rw-r--r-- 1 benj benj 670567 2009-02-01 22:32 Freedom.tar.gz
drwxr-xr-x 5 benj benj 4096 2009-02-04 22:30 Roms
drwx------ 2 benj benj 4096 2009-02-05 18:40 ruby
lrwxrwxrwx 1 benj benj 9 2009-02-07 14:26 www -> /var/www/
Nous allons, pour le moment, nous intéresser aux lettres situées à gauche : (drwxr-xr-x)
La première lettre désigne le type de fichier :
- - : fichier "classique"
- d : répertoire (directory)
- l : lien symbolique (link)
- r : read (droit de lecture)
- w : write (droit d'écriture)
- x : execute (droit d'exécuter un fichier ou d'ouvrir un répertoire)
Les 3 premiers sont les droits du propriétaire du fichier, les trois suivants du groupe et les trois derniers des autres. Par exemple, pour cette ligne :
-rw-r--r-- 1 benj benj 670567 2009-02-01 22:32 Freedom.tar.gz
Ici, l'utilisateur (en général, celui qui a créé le fichier ou le dossier) est benj et le groupe est également benj (benj:benj : user:group)
Les droits sur ce fichier sont donc les suivants :
user (3 premiers caractères) : rw- (droits de lecture, écriture)
group (3 caractères suivants) : r-- (droit de lecture)
les autres : (3 derniers caractères) : r-- (droit de lecture)
Notez que pour qu'un dossier puisse être ouvert par un utilisateur, il doit avoir les droits d'exécution.
II. Comment modifier les droits d'un fichier
Il y a deux façons de modifier les droits d'un fichier : la manière "relative" qui consiste à modifier les droits existants et la manière "absolue"qui consiste à créer les droits à partir de rien.
La manière "relative"
Elle consiste, comme je l'ai dit, à modifier les droits existants. Par exemple, on souhaite simplement ajouter les droits d'exécution au groupe (en plus des droits existants). Cela ne modifie donc que le droit d'exécution, les autres droits sont conservés tels quels.
Rappel : Signification des lettres utilisés ci-dessous :
- u : user (utilisateur)
- g : group (groupe)
- o : other (autres)
- a: all (tout le monde)
Par exemple, nous souhaitons simplement ajouter les droits d'exécution au groupe. Nous devons donc exécuter cette commande :
chmod g+x nom_fichier
Un autre exemple, nous souhaitons ajouter les droits d'écriture au groupe et supprimer le droit de lecture aux autres (utilisateur non propriétaire du fichier et ne faisant pas partie du groupe du fichier) :
chmod g+w o-r mon_fichier
Enfin, nous souhaitons donner tous les droits à tout le monde (c'est une mauvaise idée, comme nous le verrons plus loin, mais c'est juste pour l'exemple) :
chmod a+rwx mon_fichier
Petite pause :)
La manière "absolue"
Cette méthode consiste à changer les droits en écrasant ceux existants.
Avant tout, un petit rappel : conversion des chiffres décimal / binaire
0 : 000
1 : 001
2 : 010
3 : 011
4 : 100
5 : 101
6 : 110
7 : 111
Remarquez qu'il y a autant de chiffres que de nombres de lettres nécessaires à la définition des droits.
Autrement dit, 5 correspond à 101 et donc à r-x
, 4 à r--
et 7 à rwx
. Simple non ?
Vous comprenez désormais le fameux 777 (chmod 777) correspond à rwxrwxrwx
(soit tous les droits).
Vous souhaitez affecter ces droits à un fichier :
- Tous les droits au propriétaire du fichier (user) :
rwx
- Les droits de lecture et d'écriture au groupe :
rw-
- Uniquement les droits de lecture aux autres :
r--
chmod 764 mon_fichier
La différence avec la méthode précédente est qu'avec cette méthode, il faut définir l'ensemble des droits à chaque fois (d'où le nom méthode "absolue")
Note : Je ne parlerais pas des droits "spéciaux" ici (sticky bit, set uid,...), ils feront l'objet d'un prochain article.
III. Les droits par défaut de vos fichiers
Seb me l'a très justement fait remarqué, j'ai oublié de parler des droits par défaut des fichiers. En effet, il est possible de définir les droits associés à vos fichiers lors de leur création. Je vais donc reprendre son commentaire car il est parfait :
On retrouve la valeur de son umask, simplement en tapant la commande umask dans un terminal. Pour la modifier, il suffit d'exécuter cette commande :
umask 002
(par exemple)
Avec cet exemple de mask positionné à 002, les fichiers créés auront
par défaut les droits rw-rw-r--
, cela s'explique (un peu d'algèbre
booléen) :
Quand on crée un fichier, les droits de celui-ci sont 666 (soit rw-rw-rw
) + NON masque
Si on note ça en bit, cela fait :
110 110 110 pour les rw-rw-rw-
000 000 010 pour le masque de 2
------------------
110 110 100 pour 666 et Non masque
rw- rw- r--
Quand on crée un répertoire c'est le même principe mais les droits de celui-ci sont de 777 + NON masque
Ainsi, dans certains cas, il est plus intéressant de changer la valeur de umask que de faire des chmod à répétition ensuite.
IV. Les dangers d'une mauvaise gestion des droits
Comme je l'ai évoqué dans l'article "les 10 erreurs les plus fréquentes sous Linux", une mauvaise gestion des droit sous Linux peut s'avérer très dangereux !
Un exemple simple, vous montez un site web (avec un serveur LAMP) et vous rencontrez une erreur : "You don't have permission to access /www/dossier/ on this server".
Vous n'avez donc pas les droits, la solution de facilité serait de faire un chmod -R 777
(tous les droits à tout le monde sur tous les fichiers).
Cette opération est risquée car elle autorise l'exécution de tous les fichiers. Une personne avec des mauvaises intentions pourrait donc y insérer du code malveillant et l'exécuter sur votre machine.
Il faut donc faire très attention aux droits que vous accordez à vos fichiers (maintenant vous savez comment faire :) ).
A bientôt
Commentaires
Pas la peine d'embêter les débutants avec la vieille méthode binaire : la manière absolue peut aussi se faire avec la notation u/g/o/a et r/w/x en utilisant le signe =. Exemple : chmod u=rw,g=r,o=r fichier
Pas la peine non plus de forcer l'utilisation du sudo : Il est tout à fait possible de faire un chmod en tant que propriétaire du fichier.
N'utiliser sudo que pour les fichiers du système ou les fichiers d'un autre utilisateur.
@Thomas : vu le nombre de tuto qui contiennent des chmod avec la méthode binaire, je pense qu'il est important de connaitre aussi cette méthode.
d'ailleurs, personnellement, je préfère la méthode binaire à la version avec les = de ton exemple, mais tout est affaire de goût ;-)
Merci pour ce petit résumé: simple et clair !
Effectivement, j'ai trouvé intéressant de décrire la méthode binaire car j'ai vu tellement de "c'est quoi 777?".
Pour les sudo, j'ai modifié, je les ai supprimés, merci de la remarque.
Bha il est où le sticky bit, et le SETUID/SETGID bit ?
"Un exemple simple, vous montez un site web (avec un serveur LAMP) et vous rencontrez une erreur : "You don't have permission to access /www/dossier/ on this server".
Vous n'avez donc pas les droits, la solution de facilité serait de faire un chmod -R 777 (tous les droits à tout le monde sur tous les fichiers)."
J'ai commis cette erreur !
Quels sont les bons droits à donner à ce répertoire ?
c'est marrant j'avais pas appris ça avec l'explication binaire, mais octale :)
r = 4
w = 2
x = 1
donc si on veut rwx on additionne ça fait 7, c'est peut etre plus simple de retenir ça que les valeurs binaires.
Ceci dit c'est important de rappeler cette methode car sur certaines machines assez anciennes (ou certains unix) il n'y a que cette méthode
Sympa l'article. Mais on en trouve trop comme ça sur le net déjà. Ce qui serait plus intéressant serait un tutoriel explorant les possibilités plus avancées relatives aux permissions, style SGID, SUID, droits avancés (je sais plus comment s'appelle cette fonctionnalité, activable dans le noyau) utilisateur par utilisateur, SElinux...
@ Pois et phentex : Je ne voulais pas trop charger cet article (plus pour les débutants) avec les sticky bit, setuid/setgid. Comme je l'ai précisé dans cet article, j'en ferais un autre spécialement pour ça :)
@Ed : Au moins avec la méthode binaire tu sais pourquoi "r" vaut 4 et pas 6 ou 7, j'ai bien voulu expliquer la base mais c'est vrai que ta façon est certainement plus simple à retenir
@toto : Pour ma part, je change juste le propriétaire du dossier : chown -R www-data:www-data ton_repertoire
www-data étant l'utilisateur par défaut "affecté" à ton serveur Apache :)
Merci Benjamin !
Je changerai ça en rentrant chez moi.
continue comme ça !
Un petit complément intéressant à cet article serait l'utilisation de umask qui positionne les droits par défaut des fichiers créés.
on retrouve la valeur de son umask, simplement en tapant la commande umask dans un terminal, et on la change avec
umask 002 par exemple
Avec cet exemple de mask positionné à 002, les fichiers créés ont par défaut les droits rw-rw-r--, cela s'explique (un peu d'algèbre booléen):
Qd on crée un fichier, les droits de celui ci sont
666 (soit rw-rw-rw) et NON masque
Si on note ca en bit, ca fait
110 110 110 pour les rw-rw-rw-
000 000 010 pour le masque de 2
------------
110 110 100 pour 666 et Non masque
rw- rw- r--
Qd on crée un répertoire c'est le même principe mais on prend 777 et NON masque
Ainsi, dans certains cas, il est plus intéressant de changer la valeur de umask que de faire des chmod à répétition ensuite..
voila
Effectivement je n'en avais pas parlé, merci pour cette remarque, je l'ai ajoutée dans l'article (si cela ne te dérange pas) :)
Salut,
Pas mal pour la théorie, mais chez moi la pratique est moins évidente....
Distribution: G Ubuntu 8.10 x64bits
Rapidement le problème:
Je veux installer les drivers d'une carte Wifi connecté en PCI. Pour cela le Fabriquant EDIMAX dans son "readme.txt" me donne la marche à suivre. Jusqu'a l'étape 6) load driver dans le dossier \etc\wireless\blabla
J'ai donc tenté naivement le $mkdir wireless
Erreur classique de débutant .............
Aprés mes recherches je tombe sur ce cours bien fait et donc réalise l'ensemble des instructions.
1) chmod u+rw \etc ===> chmod: changing permissions of 'etc' : Operation not permitted
2) chmod 755 \etc ===> chmod: changing permissions of 'etc' : Operation not permitted
3) chmod u=rw \etc ===> chmod: changing permissions of 'etc' : Operation not permitted
Je tente de forcer:
4) chmod 755 -f \etc ===> ........rien....... :)
Et la je m'empresse d'aller faire ls -l pour voir si les droits avaient changé...... reponse....... NON :(
Bon ben voila si qqu'un aurait la gentillesse de m'aider à mettre en pratique ce cours ?
Merci d'avance
@Amin : Salut
Pour commencer fait attention, le chemin des fichiers est /etc/... et non pas \...\..
Il te dit juste que tu n'a pas les droits de changer les permission de /etc.
Le proprietaire de /etc est l'utilisateur "root",("l'administrateur", celui qui a tous les droits sur le système). Il faut donc que tu ait ses droits pour modifier /etc.
Il faut que tu utilise la commande "sudo" pour creer ton repertoire, je te conseille de lire www.generation-linux.fr/index.php?post/2009/03/24/Cours-Linux-%3A-sudo, et ne pas changer les droits sur /etc.
Et pour finir u+rw donne 6 et non pas 5 (donc chmod x6x).
Voila, j'espère que ça t'aidera.
Et une petite précision u+x ajoute les droits de lecture à users, et u=x ne lui donne plus que ce droits de lecture.
coucou,
j'ai un fichier avec la permission srwxrwxrwx, et j'arrive pas à le lire. C'est quoi ce "s" devant ?
merci pour ce cours, ça m'a beaucoup aider à comprendre quelques trucs ambigus, je t'encourage à faire le plus, on est besoin.
Salut tuto interresant, mais j'ai une question :
Je me retrouve avec une carte SD qui lorsqu'elle est monté se retrouve avec les droits en lecture et ecriture pour moi l'utilisateur mais en lecture seul pour root.
En tant qu'utilisateur simple je ne peut modifier les permission et en tant que root non plus !
Pourquoi et que puis je faire pour changer cela ?
Je suis sous debian lenny et openbox avec comme gestionnaire de fichier thunar et son plugin de montage auto des supports amovibles.
j'ai un script php qui contient la commande exec(). Cependant j'aimerais exécuter le script depuis l'interface de apache (le localhost). Quand je saisis en root la commande: php nom_du_script.php
le script marche correctement mais quand j'essai depuis le navigateur ça ne donne rien. Je sais que c'est un problème de droit. Comment résoudre ce problème?
pk lorsque je tape la commande umask , le terminal m'affiche 4 chiffre par exp 0002 hors normalement 3 seulement pour (u,g,o) !!!
slp une reponse et merci d'avance
super cours, merci pour ces précieuses informations.
je trouve que c'est Ed qui a la façon la plus simple de retenir et de modifier les droits d'accès;
on retient 1 2 4 (3 fois de droite à gauche) pour lire les droits depuis ls -l
Bonjour
Très bonnes explications pour comprendre les équivalences.
Je dirais que celle de Ed et celle de Benjamin se complètent, dans un premier temps j'ai retenu celle de Ed, mais en revenant sur le chapitre de Benjamin "La manière absolue" on sait clairement pourquoi 4, 2, 1 pour rwx
r =4=100
w=2=010
x =1=001
au total rwx=7=111 ce qui correspond au tableau de conversion décimal/binaire de Benjamin
Se rappeler c'est bien et comprendre encore mieux (je suis débutante) ^_^
110 110 110 + 000 000 010 != 110 110 100
Merci d'avance le cours a était bien détailler et Bravo
Bonjour, comment puis-je faire pour changer l'umask d'un seul usager?
Merci.
Bonjour,
Je suis une parfaite débutante sur Ubuntu et forcément j'ai fait une erreur de débutant...
J'en avais marre d'utiliser sudo avant chaque commande, j'ai alors modifié le propriétaire de mon dossier /etc et par conséquent le fichier sudoers :/
Maintenant je ne peux plus utiliser les commandes telles que apt -get install... J'ai l'erreur suivante:
sudo: /etc/sudoers is owned by uid 1000, should be 0
sudo: no valid sudoers sources found, quitting
sudo: unable to initialize policy plugin
Vous l'aurez deviné je ne suis pas très patiente comme fille sinon j'aura continué avec sudo -_- j'espère donc que vous avez une solution simple :p sinon je suis du genre à réinstaller Ubuntu depuis le début sans me casser la tête... :p
J'espère que vous pourrez m'aider
just change (!back) permission!(s)