Le comportement des permissions des liens physiques est différent entre CentOS 6 et CentOS 7

J'obtiens une erreur d'autorisation dans CentOS 7 quand j'essaye de créer un lien dur. Avec les mêmes permissions définies dans CentOS 6, je ne reçois pas l'erreur. Le problème est axé sur les permissions de groupe. Je ne suis pas sûr de savoir quelle version de l'OS est correcte et quelle est la mauvaise.

Permettez-moi d'illustrer ce qui se passe. Dans mon directory de travail actuel, j'ai deux directorys: source et destination. Au départ, la destination est vide; La source contient un file text.

[root@tc-dlx-nba cwd]# ls -l total 0 drwxrwxrwx. 2 root root 6 Jun 12 14:33 destination drwxrwxrwx. 2 root root 21 Jun 12 14:33 source [root@tc-dlx-nba cwd]# ls -l destination/ total 0 [root@tc-dlx-nba cwd]# ls -l source/ total 4 -rw-r--r--. 1 root root 8 Jun 12 14:20 test.txt [root@tc-dlx-nba cwd]# 

Comme vous pouvez le voir, en ce qui concerne les permissions, les deux directorys sont 777, avec le propriétaire et le groupe à la racine. Le propriétaire et le groupe du file text sont également tous deux définis sur la racine. Cependant, les permissions du file text sont en lecture-écriture pour le propriétaire, mais en lecture seule pour le groupe.

Lorsque je suis connecté en tant que root, je n'ai aucun problème à créer un lien dans le directory de destination pointant vers le file text (dans le directory source).

 [root@tc-dlx-nba cwd]# ln source/test.txt destination/ [root@tc-dlx-nba cwd]# ls destination/ test.txt 

Cependant, si je me connecte en tant qu'autre user, dans ce cas, admin, je ne peux pas créer le lien. Je reçois: "Opération non autorisée."

 [root@tc-dlx-nba cwd]# rm -f destination/test.txt [root@tc-dlx-nba cwd]# su admin bash-4.2$ pwd /root/cwd bash-4.2$ ln source/test.txt destination/ ln: failed to create hard link 'destination/test.txt' => 'source/test.txt': Operation not permitted 

Ce qui se passe réellement a du sens pour moi, mais comme ce qui précède est autorisé dans CentOS 6, je voulais vérifier si j'avais mal compris quelque chose. Pour moi, il semble comme un bug dans CentOS 6 qui a été corrigé dans CentOS 7.

Quelqu'un sait ce que donne? Ai-je raison de croire que le comportement ci-dessus est le bon comportement? Est-ce que c'est CentOS 6 qui est correct? Ou, sont tous les deux bien et peut-être il y a-t-il un problème subtil de permissions de groupe qui me manque? Merci.


Edit: J'ai essayé le même test tout à l'heure sur une machine virtuelle Debian v7 que j'ai. Debian est d'accord avec CentOS 7: "Opération non autorisée."


Edit # 2: J'ai juste essayé la même chose sur Mac OS X (Yosemite). Cela a fonctionné de la même façon que CentOS 6. En d'autres termes, cela a permis de créer le lien. (Remarque: Sous OS X, le groupe racine est appelé "wheel". C'est la seule différence, pour autant que je sache.)

J'ai tourné quelques CentOS 6 et 7 vm fraîches et j'ai pu recréer le comportement exact que vous avez montré. Après avoir creusé, il s'avère qu'il s'agit en fait d'un changement dans le kernel concernant le comportement par défaut en ce qui concerne les liens durs et logiciels pour des raisons de security. Les pages suivantes m'ont orienté dans la bonne direction:

http://kernel.opensuse.org/cgit/kernel/commit/?id=561ec64ae67ef25cac8d72bb9c4bfc955edfd415

http://kernel.opensuse.org/cgit/kernel/commit/?id=800179c9b8a1

Si vous faites en sorte que le file soit accessible en écriture, votre administrateur pourra créer le lien.

Pour revenir au comportement de CentOS 6 à l'échelle du système, de nouveaux parameters de kernel ont été ajoutés. Définissez ce qui suit dans /etc/sysctl.conf:

 fs.protected_hardlinks = 0 fs.protected_symlinks = 0 

puis courir

 sysctl -p 

En ce qui concerne la raison pour laquelle votre programme choisit d'utiliser des liens au lieu de copyr des files, pourquoi créer une copy exacte d'un file que vous devez utiliser quand vous pouvez simplement créer une input qui pointe vers les blocs d'origine? Cela économise de l'espace disque et l'opération est less coûteuse en termes de CPU et d'E / S. Le nouveau lien dur est le même file, avec des métadonnées / inodes différentes. Si vous supprimez le file d'origine après avoir créé un lien, cela n'affectera pas le lien. Un file est seulement "supprimé" une fois que tous les liens ont été supprimés.