Comprendre les autorisations UNIX et les types de fichiers

68

Je n'ai jamais vraiment eu comment chmodtravaillé jusqu'à aujourd'hui. J'ai suivi un tutoriel qui m'a expliqué un gros problème.

Par exemple, j'ai lu que vous avez trois groupes d'autorisations différents:

  • propriétaire ( u)
  • groupe ( g)
  • tout le monde ( o)

Sur la base de ces trois groupes, je sais maintenant que:

  • Si le fichier appartient à l'utilisateur, les autorisations de l'utilisateur déterminent l'accès.
  • Si le groupe du fichier est identique au groupe de l'utilisateur, l'autorisation de groupe détermine l'accès.
  • Si l'utilisateur n'est pas le propriétaire du fichier et ne fait pas partie du groupe, l'autre autorisation est utilisée.

J'ai également appris que vous disposiez des autorisations suivantes:

  • read ( r)
  • écrire ( w)
  • execute ( x)

J'ai créé un répertoire pour tester mes connaissances nouvellement acquises:

mkdir test

Puis j'ai fait des tests:

chmod u+rwx test/
# drwx------
chmod g+rx test/
# drwxr-x---
chmod u-x test/
# drw-r-x---

Après avoir passé du bon temps pendant un certain temps, je pense que j'ai enfin compris chmodcomment vous définissez les autorisations à l'aide de cette commande.


Mais...

J'ai encore quelques questions:

  • Que signifie le ddébut?
  • Quels sont le nom et l'utilisation de l'emplacement contenant et quelles autres valeurs peut-il contenir?
  • Comment puis-je le définir et le désactiver?
  • Quelle est la valeur pour cela d? (Comme vous avez seulement 7 = 4 + 2 + 1 7 = 4 + 2 + 1 7 = 4 + 2 + 1)
  • Pourquoi les gens utilisent-ils parfois 0777au lieu de 777définir leurs autorisations?

Mais comme je ne devrais pas poser plusieurs questions, je vais essayer de le faire en une seule question.

Dans les systèmes UNIX tels que toutes les distributions Linux, en ce qui concerne les autorisations, que signifie la première partie ( d) et quelle est l'utilisation de cette partie des autorisations?

Peter
la source
3
S'il vous plaît, la prochaine fois, essayez de poser une seule question, plusieurs questions sont généralement mauvaises pour le référencement et ne sont presque jamais traitées en même temps.
Kiwy
1
@ Kiwy Je suis désolé, je pensais que je le ferais comme ça parce que ça concerne le même sujet. Si vous le souhaitez, vous pouvez suggérer un meilleur titre pour ma question afin d’améliorer sa référence.
Peter
1
Incidemment, la valeur du "d" est 040000 - elle se trouve dans les fichiers d’en-tête sous le nom S_IFDIR. Vous ne l'utilisez pas lorsque vous définissez le mode de fichier, mais la stat()fonction renvoie la valeur 040750 pour drwxr-x---.
Random832
2
@jamesqf En fait, maintenant que je comprends comment mapper les codes octaux, il est plus simple pour moi de penser à cela.
HalosGhost
4
@ Peter: il n'y a pas de questions stupides - juste des stupides qui n'apprennent pas parce qu'ils ont peur de demander.
mgarciaisaia

Réponses:

117

Je répondrai à vos questions en trois parties: types de fichiers, autorisations et cas d'utilisation pour les différentes formes de fichiers chmod.

Types de fichier

Le premier caractère de la ls -lsortie représente le type de fichier; dsignifie que c'est un répertoire. Il ne peut pas être activé ou désactivé, cela dépend de la manière dont le fichier a été créé. Vous pouvez trouver la liste complète des types de fichiers dans la documentation de ls ; ceux que vous êtes susceptible de rencontrer sont

  • -: Fichier “normal”, créé avec n'importe quel programme capable d'écrire un fichier
  • b: bloquer un fichier spécial, généralement un disque ou une partition, peut être créé avec mknod
  • c: fichier spécial de caractère, peut également être créé avec mknod(voir /devdes exemples)
  • d: répertoire, peut être créé avec mkdir
  • l: lien symbolique, peut être créé avec ln -s
  • p: pipe nommée, peut être créée avec mkfifo
  • s: socket, peut être créé avec nc -U
  • D: door , créé par certains processus serveur sous Solaris / openindiana.

Les permissions

chmod 0777est utilisé pour définir toutes les autorisations dans une chmodexécution, plutôt que de combiner les modifications avec, u+etc. Chacun des quatre chiffres est une valeur octale représentant un ensemble d'autorisations:

  • suid, sgidEt « collant » (voir ci - dessous)
  • autorisations utilisateur
  • autorisations de groupe
  • “Autres” autorisations

La valeur octale est calculée comme la somme des autorisations:

  • «Lu» est 4
  • «Écrire» vaut 2
  • «Exécuter» est 1

Pour le premier chiffre:

  • suidest 4; les binaires avec ce bit sont exécutés en tant que propriétaire (généralement root)
  • sgidest 2; les fichiers binaires avec ce jeu de bits sont gérés en tant que groupe propriétaire (utilisé pour les jeux afin que les scores élevés puissent être partagés, mais cela constitue souvent un risque pour la sécurité lorsqu'il est combiné à des vulnérabilités dans les jeux), et les fichiers créés dans les répertoires avec ce jeu de bits appartiennent à la liste. le groupe de propriétaires du répertoire par défaut (c'est pratique pour créer des dossiers partagés)
  • «Collant» (ou «suppression restreinte») vaut 1; les fichiers des répertoires avec ce bit défini ne peuvent être supprimés que par leur propriétaire, le propriétaire du répertoire ou root(voir /tmpun exemple courant).

Voir la chmodpage de manuel pour plus de détails. Notez que dans tout cela, j'ignore d'autres fonctionnalités de sécurité qui peuvent modifier les autorisations des utilisateurs sur les fichiers (SELinux, ACL de fichiers, etc.).

Les bits spéciaux sont traités différemment selon le type de fichier (fichier ou répertoire standard) et le système sous-jacent. (Ceci est mentionné dans la chmodpage de manuel.) Sur le système que j'avais l'habitude de tester (avec coreutils8.23 sur un ext4système de fichiers, le noyau Linux exécutant 3.16.7-ckt2), le comportement est le suivant. Pour un fichier, les bits spéciaux sont toujours effacés, sauf s'ils sont définis explicitement. Cela chmod 0777équivaut à chmod 777, et les deux commandes effacent les bits spéciaux et accordent à tous des autorisations complètes sur le fichier. Pour un répertoire, les bits spéciaux ne sont jamais complètement effacés à l’aide de la forme numérique à quatre chiffres. Par conséquent, cela chmod 0777équivaut également àchmod 777mais c'est trompeur, car certains des éléments spéciaux resteront tels quels. (Une version précédente de cette réponse s'est trompée.) Pour effacer des bits spéciaux sur les répertoires, vous devez utiliser u-s, g-set / ou o-texplicitement ou spécifier une valeur numérique négative, ainsi chmod -7000effacerez tous les bits spéciaux d'un répertoire.

En ls -lsortie, suid, sgidet « collant » apparaît à la place de l' xentrée: suidest sou au Slieu de de l'utilisateur x, sgidest sou au Slieu de ce groupe x, et « collant » est tou Tplutôt que d'autres x. Une lettre minuscule indique que le bit spécial et le bit exécutable sont définis. une lettre majuscule indique que seul le bit spécial est activé.

Les différentes formes de chmod

En raison du comportement décrit ci-dessus, l'utilisation des quatre chiffres entiers chmodpeut être source de confusion (au moins, il s'avère que j'étais confus). C'est utile lorsque vous souhaitez définir des bits spéciaux ainsi que des bits de permission; sinon, les bits sont effacés si vous manipulez un fichier, conservés si vous manipulez un répertoire. Donc, chmod 2750assure que vous aurez au moins sgidet exactement u=rwx,g=rx,o=; mais chmod 0750ne sera pas nécessairement effacer les bits spéciaux.

Utiliser des modes numériques au lieu de commandes de texte ( [ugo][=+-][rwxXst]) est probablement plus un cas d'habitude et le but de la commande. Une fois que vous êtes habitué à utiliser les modes numériques, il est souvent plus facile de spécifier simplement le mode complet. et il est utile de pouvoir penser aux autorisations à l'aide de modes numériques, car de nombreuses autres commandes peuvent les utiliser ( install, mknod...).

Certaines variantes de texte peuvent être utiles: si vous voulez simplement vous assurer qu'un fichier peut être exécuté par n'importe qui, vous chmod a+xle ferez, quelles que soient les autres autorisations. De même, +Xajoute l'autorisation d'exécution uniquement si l'une des autorisations d'exécution est déjà définie ou si le fichier est un répertoire. Cela peut être pratique pour restaurer des autorisations globalement sans avoir à utiliser des fichiers de cas spéciaux v. des répertoires. Cela chmod -R ug=rX,u+w,o=revient donc à appliquer chmod -R 750à tous les répertoires et fichiers exécutables et chmod -R 640à tous les autres fichiers.

Stephen Kitt
la source
Bien que les autres réponses soient plutôt bonnes, vous avez vraiment passé un certain temps à répondre à cette question. Merci.
Peter
Les répertoires On * BSD se comportent comme si leur sgidbit était toujours activé, quelle que soit sa valeur réelle. Sous FreeBSD, le suidbit peut être configuré pour agir de manière analogue sgid(les fichiers et les sous-répertoires créés à l'intérieur du même propriétaire auront le même propriétaire que le répertoire), à ​​condition que le système de fichiers sous-jacent le supporte et qu'il soit monté avec l' suiddiroption.
lcd047
" +Xn’ajoute l’autorisation d’exécution que si l’une des autorisations d’exécution est déjà définie ou si le fichier est un répertoire" merci @ stephen-kitt de ne pas avoir "est déjà défini" la documentation m’a vraiment jeté pour une boucle!
Ryan Fisher
39

Donc, les permissions sous Linux sont très importantes. Je vais essayer de faire une courte explication.

Pour les morceaux d'un mode fichier

Chaque fichier Unix possède un ensemble d'autorisations qui déterminent si vous pouvez lire, écrire ou exécuter le fichier. L'exécution de ls -l affiche les autorisations. Voici un exemple d'un tel affichage:

-rw-r--r-- 1 user somegroup 7041 Mar 26 19:34 somefile

Je joins une image de morceaux d'un mode de fichier:

entrez la description de l'image ici

Le type peut être différent. Par exemple:

  • d (répertoire)
  • c (périphérique de caractère)
  • l (lien symbolique)
  • p (pipe nommée)
  • s (prise)
  • b (bloc périphérique)
  • D (porte, pas commun sur les systèmes Linux, mais a été porté)

Si vous souhaitez définir des autorisations pour tous les répertoires, vous pouvez utiliser l'attribut R, par exemple:

chmod -R 777 /some/directory/

Pour chmod 777 vs 0777

La chmodcommande s'attend généralement à ce que l'entrée soit un nombre octal, le zéro à gauche fait référence à la valeur du triplet de bits sticky / sgid / suid. En C cependant, cela ferait une différence, car 777serait traduit en 01411(octal), définissant ainsi le bit collant (voir la chmod(2)page de manuel), les autorisations de lecture sur le propriétaire et le bit exécutable pour le groupe et les autres (combinaison plutôt étrange) .

EDIT 1

J'ai trouvé une autre image sur les autorisations Linux et je vais attacher pour comprendre plus facilement: Autorisations de fichiers UNIX

ValeriRangelov
la source
5
Vous vous trompez à propos du 777 vs 0777. Les deux sont octaux (la décimale n’a aucun sens, dans ce cas), mais sous forme de caractères à quatre caractères, le premier chiffre définit les bits spéciaux (sticky & setuid).
orion
3
@orion Parfois, c'est vrai, par exemple, dans un code de type C, chmod(777)cela équivaut en fait à exécuter chmod 1411(c'est-à-dire la chmodcommande avec argument 1411).
Peter
2
... ce qui dans le cas de l'appel système (ou de son wrapper) et du binaire portant le même nom peut être un peu déroutant.
Peter
3
Race Master Python a résolu ce problème en arrière en interdisant tous les « chiffres » qui commencent par 0, ce qui oblige l'utilisateur à être explicite si elles veulent autre chose que décimal, par exemple hex: 0x1FF, binaire: 0b111111111ou octal: 0o777. PYTHON POWER
Nick T
Source de l'image?
rugk
10

dsignifie que c'est un répertoire, si vous avez un fichier c'est -et si c'est un lien vous allez trouver un fichier l. Il ne peut pas être activé / désactivé.

Si vous utilisez les autorisations 0777, vous accordez un contrôle total (lecture + écriture + exécution) à chaque utilisateur / groupe du système. C'est un moyen paresseux de résoudre des problèmes lorsque vous avez des utilisateurs / groupes qui ne peuvent pas accéder aux répertoires / fichiers.

Par exemple, si vous listez le contenu d'un répertoire et obtenez ceci:

-rw-r--r-- 1 root root 42596 jun 7 2012 preloadable_libintl.so

preloadable_libintl.so est un fichier appartenant à l'utilisateur root et au groupe root. Le propriétaire dispose d'un accès en lecture et en écriture, le groupe n'a qu'un accès en lecture et tout autre utilisateur a un accès en lecture. Cela peut être traduit par 644.

Si je le change en 777, il ressemblera à ceci:

-rwxrwxrwx 1 root root 42596 jun 7 2012 preloadable_libintl.so

jcbermu
la source
7

Après avoir obtenu une réponse à ma question ici et effectué quelques recherches sur les résultats, j'ai trouvé un article qui explique très bien tout. Je voudrais partager certaines parties de cet article ici pour des références futures.

Voir les autorisations

Pour pouvoir chmodmodifier les autorisations d'un fichier ou d'un répertoire, vous devez d'abord connaître le mode d'accès actuel. Vous pouvez afficher le contenu d'un répertoire du terminal cddans ce répertoire, puis utiliser:

$ ls -l

Le -lcommutateur est important car son utilisation lssans afficher uniquement les noms de fichiers ou de dossiers du répertoire.

Voici un exemple d'utilisation ls -lde mon répertoire personnel:

total 128
drwxr-xr-x 2 peter users  4096 Jul  5 21:03 Desktop
drwxr-xr-x 6 peter users  4096 Jul  5 17:37 Documents
drwxr-xr-x 2 peter users  4096 Jul  5 13:45 Downloads
drwxr-xr-x 2 peter users  4096 Jun 24 03:36 Movies
drwxr-xr-x 2 peter users  4096 Jun 24 03:38 Music
drwxr-xr-x 2 peter users  4096 Jun 26 00:09 Pictures
-rw-r--r-- 1 peter users   354 Jul  6 17:15 chmodtest

Que signifient les colonnes

La première colonne est le type de chaque fichier:

  • - dénote un fichier normal.
  • d désigne un répertoire, c’est-à-dire un dossier contenant d’autres fichiers ou dossiers.
  • p désigne un tube nommé (ou FIFO).
  • l dénote un lien symbolique.

Les lettres qui suivent sont les permissions, cette première colonne est ce qui nous intéressera le plus. La seconde est le nombre de liens dans un fichier, nous pouvons l’ignorer en toute sécurité. La troisième colonne a deux valeurs / noms: La première (dans mon exemple, "peter") est le nom de l'utilisateur qui possède le fichier. La deuxième valeur ("utilisateurs" dans l'exemple) est le groupe auquel appartient le propriétaire (en savoir plus sur les groupes).

La colonne suivante est la taille du fichier ou du répertoire en octets et les informations qui suivent sont les dates et heures de la dernière modification du fichier ou du répertoire, et bien sûr le nom du fichier ou du répertoire.

Que signifient les autorisations

Les trois premières lettres, après la première -ou dsont les autorisations dont dispose le propriétaire. Les trois lettres suivantes sont des autorisations qui s'appliquent au groupe. Les trois dernières lettres sont les autorisations qui s'appliquent à tout le monde.

Chaque série de trois lettres est composée de r wet x. rtoujours en première position, wtoujours en deuxième position et xtoujours en troisième position. rest l'autorisation de lecture, wl'autorisation d'écriture et xl'autorisation d'exécution. S'il y a un trait d'union ( -) à la place de l'une de ces lettres, cela signifie que la permission n'est pas accordée, et si la lettre est présente, elle est accordée.

Dossiers

Dans le cas de dossiers, les bits de mode peuvent être interprétés comme suit:

  • r (read) signifie la capacité de lire la table des matières du répertoire donné,
  • w(write) signifie la possibilité d'écrire la table des matières du répertoire donné (créer de nouveaux fichiers, dossiers; renommer, supprimer des fichiers existants, dossiers) si et seulement si le bit d'exécution est défini. Sinon, cette permission n'a pas de sens.
  • x (execute) signifie la possibilité d'entrer dans le répertoire donné avec la commande cd et d'accéder aux fichiers, dossiers de ce répertoire.

Modification des autorisations à l'aide de la commande chmod

chmodest une commande sous Linux et d'autres systèmes d'exploitation de type Unix. Il vous permet de modifier les autorisations (ou le mode d'accès) d'un fichier ou d'un répertoire.

Vous pouvez modifier les autorisations de deux manières différentes: - à base de texte - à base de chmod nombrechmod

Méthode de texte

Pour changer le mode de permissions ou d'accès d'un fichier, nous utilisons la commande chmod dans un terminal. Vous trouverez ci-dessous la structure générale de la commande:

chmod who=permissions filename

Where Who is any, parmi une série de lettres, chacune désignant à qui vous allez donner la permission. Ils sont comme suit:

u - The user that owns the file.
g - The group the file belongs to.
o - The other users i.e. everyone else.
a - all of the above - use this instead of having to type ugo.

Les autorisations sont les mêmes que déjà discuté ( r, wet x).

La commande chmod nous permet d'ajouter et de soustraire des autorisations d'un ensemble existant en utilisant + ou - au lieu de =. Ceci diffère des commandes ci-dessus, qui consistent essentiellement à réécrire les autorisations (c.-à-d. Pour modifier une autorisation de r--en rw-, vous devez toujours inclure raussi bien wqu'après =la chmodcommande. Si vous ratez la fin r, cela vous rpriverait de ils sont en train d'être réécrits avec le =. Utiliser + et - pour éviter cela en ajoutant ou en supprimant l'ensemble actuel des permissions).

Méthode du nombre

chmod peut également définir des autorisations à l'aide de nombres.

L'utilisation de nombres est une autre méthode qui vous permet de modifier les autorisations pour les trois propriétaires, groupes et autres en même temps. Cette structure de base du code est la suivante:

chmod xxx file/directory

Où xxx est un nombre à 3 chiffres où chaque chiffre peut aller de 1 à 7. Le premier chiffre concerne les autorisations pour le propriétaire, le deuxième chiffre concerne les autorisations pour le groupe et le troisième chiffre concerne les autorisations pour tous les autres.

Dans cette notation numérique, les valeurs r, w et x ont leur propre valeur numérique:

r=4
w=2
x=1

Pour obtenir un nombre à trois chiffres, vous devez déterminer les autorisations que vous souhaitez attribuer à un propriétaire, à un groupe et à un utilisateur, puis faire le total de leurs valeurs. Par exemple, supposons que je souhaite accorder au propriétaire d’un répertoire des autorisations d’exécution, de lecture et d’écriture, et que je souhaite regrouper, ainsi que tous les autres utilisateurs, les autorisations de lecture et d’exécution. Je viendrais avec les valeurs numériques comme suit:

Owner: rwx = 4+2+1=7
Group: r-x = 4+0+1=5 (or just 4+1=5)
Other: r-x = 4+0+1=5 (or just 4+1=5)

Final number = 755

$ chmod 755 filename

Ceci équivaut à utiliser les éléments suivants:

chmod u=rwx filename
chmod go=rx filename

La plupart des dossiers / répertoires sont réglés sur 755 pour autoriser la lecture et l'écriture et l'exécution pour le propriétaire, mais refusent l'écriture à tout le monde, et les fichiers 644 pour autoriser la lecture et l'écriture pour le propriétaire mais uniquement pour la lecture par remarque sur le manque d'autorisations x avec des fichiers non exécutables - c'est la même affaire ici.

Peter
la source
Copier simplement le texte d'un autre article est - au moins - impoli. Peut-être aussi une violation du droit d'auteur. Si ce n'est pas seulement copié ou si vous avez vraiment utilisé de petites parties (respectueux des droits d'auteur grâce à une utilisation équitable), alors ajoutez au moins un lien vers l'article que vous référencez / citez.
rugk
0

Pour les d questions

Cela vous indique le type de fichier Unix. Par défaut, Unix n'a que 3 types de fichiers. Elles sont:

  • - - Dossier régulier
  • d - Répertoire
  • Fichier spécial (avec 5 sous-types):
    • b - Fichier bloc
    • c - Fichier de périphérique de caractère
    • p - Fichier de pipe nommé ou simplement fichier de pipe
    • l - Fichier de lien symbolique
    • s - Fichier de socket

Lisez plus ici: Les types de fichiers sous Linux / Unix expliqués en détail

0777 contre 777

Peu collant spécifié ou non. Lorsque le bit collant d'un répertoire est défini, le système de fichiers traite les fichiers de ces répertoires d'une manière spéciale afin que seul le propriétaire du fichier, le propriétaire du répertoire ou l'utilisateur root puisse renommer ou supprimer le fichier. Sans le sticky bit défini, tout utilisateur disposant des autorisations d'écriture et d'exécution pour le répertoire peut renommer ou supprimer des fichiers contenus, quel que soit le propriétaire du fichier.

0777 définit les autorisations de fichier 777 et le bit collant sur 0 - aucun mode spécial.

777 définit les autorisations de fichier 777, sans changer le bit collant.

En savoir plus: sticky bit et chmod

csny
la source
2
Mieux: mais il n'offre toujours rien que les autres réponses n'aient pas déjà abordées ...
jasonwryan
1
(1) Il existe trois types de fichiers de base: les fichiers simples, les répertoires et tout le reste. Quelle? Où allez-vous? Dans le grand ordre des choses, les fichiers et répertoires simples sont assez similaires. Les canaux nommés et les liens symboliques s'apparentent davantage à des fichiers et à des répertoires simples qu'à des fichiers de périphérique ou à des sockets. (2) Vous pensez chmod 777ne pas effacer les bits setuid, setgid et sticky? L'essayer
G-Man dit 'Réintégrez Monica' le
Unix a 7 types de fichiers, pas 3.
wjandrea