Pourquoi 666 sont les autorisations de création de fichiers par défaut?

12

Comme je l'ai découvert, lorsque vous utilisez umask, les autorisations les plus élevées que vous pouvez accorder aux fichiers sont 666. Ce qui est fait par umask 0000. C'est à cause des autorisations de création de fichiers par défaut, qui semblent être 666 sur tous les systèmes que je connais.

Je sais que pour les fichiers, nous avons besoin de droits exécutables pour afficher leur contenu.
Mais pourquoi limitons-nous les autorisations de création de fichiers par défaut sur 666?

Peter
la source
Quel genre de système? Le seul que umaskj'ai rencontré était toujours 0022, créant l'autorisation par défaut 644.
Manatwork
Non, vous avez mal compris. Umask utilise les autorisations de fichier par défaut de 666 et soustrait sa propre valeur (qui est 0022 pour votre système). La plupart des autorisations que vous pouvez définir sont donc umask 0000- ce qui limite toujours les autorisations de fichiers de 666. (Mais apparemment, les dossiers utilisent 777)
Peter
Je t'ai eu. Maintenant, c'est une bonne question.
manatwork
2
Vous n'avez pas besoin d'autorisations exécutables pour voir le contenu du fichier. C'est le cas pour les répertoires, c'est pourquoi les répertoires sont créés par défaut avec des autorisations d'exécution.
Joseph R.
1
Je crois [mais il faudrait chercher plus pour être sûr] que c'est par conception, pour éviter certains problèmes de sécurité: sans accès à "chmod", vous ne pouvez pas rendre un fichier exécutable. umask 0000 crée des fichiers avec 0666 et des répertoires avec 0777 [qui, soit dit en passant, est un paramètre par défaut assez horrible, en termes de sécurité!]
Olivier Dulac

Réponses:

10

Pour autant que je sache, cela est codé en dur dans les utilitaires standard. Je stracesouhaitais à la fois touchcréer un nouveau fichier et mkdircréer un nouveau répertoire.

La touchtrace a produit ceci:

open("newfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3

tandis que la mkdirtrace a produit ceci:

mkdir("newdir", 0777)                   = 0

À moins de coder le processus de création de fichier / répertoire en C, je ne vois pas de moyen de modifier les autorisations par défaut. Il me semble cependant que ne pas rendre les fichiers exécutables par défaut est logique: vous ne voulez pas qu'un texte aléatoire soit mal interprété par erreur comme des commandes shell.

Mise à jour

Pour vous donner un exemple de la façon dont les bits d'autorisation sont codés en dur dans les utilitaires standard. Voici quelques lignes pertinentes de deux fichiers du coreutilspackage qui contiennent le code source pour les deux touch(1)et mkdir(1), entre autres:

mkdir.c:

if (specified_mode)
   {   
     struct mode_change *change = mode_compile (specified_mode);
     if (!change)
       error (EXIT_FAILURE, 0, _("invalid mode %s"),
              quote (specified_mode));
     options.mode = mode_adjust (S_IRWXUGO, true, umask_value, change,
                                  &options.mode_bits);
     free (change);
   }   
  else
    options.mode = S_IRWXUGO & ~umask_value;
}   

En d'autres termes, si le mode n'est pas spécifié, réglez-le sur S_IRWXUGO(lire: 0777) modifié par le umask_value.

touch.c est encore plus clair:

int default_permissions =
  S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;

Autrement dit, donnez des autorisations de lecture et d'écriture à tout le monde (lire: 0666), qui seront umaskbien sûr modifiées par le processus de création de fichiers.

Vous pouvez peut-être contourner ce problème uniquement par programme: c'est-à-dire lors de la création de fichiers à partir d'un programme C, où vous effectuez les appels système directement ou à partir d'un langage qui vous permet de faire un appel système de bas niveau (voir par exemple Perl sysopensous perldoc -f sysopen).

Joseph R.
la source
Tu as raison, je ne veux pas d'accidents. Mais n'avoir aucun moyen de le changer, c'est affreux! Les valeurs standard devraient être 777. Et nous avons besoin de umask fileet umask dir. Définissez deux valeurs par défaut différentes et bien. Mais maintenant, je n'ai aucun moyen de créer des fichiers avec des perms exec.
Peter
1
@PeterI Eh bien, mkdir(1)vous propose un -mcommutateur pour spécifier le mode du répertoire au moment de la création. Avec les fichiers, cependant, puisque la création de fichiers utilise l'appel open(2)système, l'outil que vous utilisez pour créer le fichier est celui qui est chargé de transmettre les bits de mode openet vous n'avez pas votre mot à dire. install(1)par défaut copie votre fichier vers un nouvel emplacement et définit les bits d'exécution, mais cela ne se produit toujours pas au moment de la création.
Joseph R.
Ce que vous dites, touchpar exemple, est responsable de définir les bonnes valeurs. Savez-vous où il stocke les valeurs? Peut-être qu'ils sont définis à l'échelle du système - afin que nous puissions les modifier? Parce que je veux me libérer ;)
Peter
@PeterI Voir la réponse mise à jour.
Joseph R.
1
@PeterI J'ai mis à jour la réponse à nouveau. Vous pourrez peut-être faire l'appel système directement à partir de C ou d'un autre langage comme Perl.
Joseph R.
6

Tout d'abord, il n'y a pas de valeur par défaut globale, les autorisations dépendent de l'application qui crée le fichier. Par exemple, ce petit programme C créera un fichier '/ tmp / foo' avec les permissions 0777 si umask vaut 0000 (en tout cas les permissions seront 0777 & ~ umask):

int main() 
{
   creat("/tmp/foo", 0777);
   return 0;
}

Cela étant dit, de nombreuses applications créent des fichiers avec des autorisations de 0666. Cela a deux raisons:

  1. Sécurité: vous ne voulez pas qu'un fichier arbitraire soit exécutable.
  2. Commodité: la plupart des fichiers n'ont pas besoin d'être exécutables. Il est plus facile de définir le bit exécutable sur quelques fichiers sélectionnés que de le désactiver sur la grande quantité d'autres fichiers. Bien sûr, umask 0133 résoudrait cela, mais alors rien n'est gagné et vous ne pouvez pas laisser les programmes créer des fichiers exécutables même si vous le souhaitez.
Adaephon
la source
1
Les fichiers sont créés sans le bit x (exécuter) défini pour des raisons de sécurité. L'exécution par inadvertance de fichiers [cw] pourrait être une «mauvaise chose» (tm). Le programme chmod vous donne la possibilité de (re) définir les bits d'autorisation selon les besoins.
ChuckCottrill