Pourquoi puis-je créer des utilisateurs avec le même UID?

37

D'après ce que je comprends des UID, il s'agit d'un entier positif unique attribué à chaque utilisateur par un système d'exploitation de type Unix. Chaque utilisateur est identifié au système par son UID et les noms d'utilisateur ne sont généralement utilisés que comme interface pour les humains.

Comment deux utilisateurs peuvent-ils avoir le même UID, n'est-ce pas un conflit pour mon système et mes packages?

root@kdc:~# id test12
uid=1005(test10) gid=1000(server) groups=1005(test10)
root@kdc:~# id test13
uid=1005(test10) gid=1000(server) groups=1005(test10)
root@kdc:~#

J'ai ajouté deux utilisateurs avec les mêmes UID et GID: test12et test13

La sortie de /etc/passwd:

client@kdc:~$ cat /etc/passwd | grep test12
test12:x:1005:1000::/home/test12:/bin/sh
client@kdc:~$ cat /etc/passwd | grep test13
test13:x:1005:1000::/home/test13:/bin/sh

J'ai ajouté les utilisateurs par useradd -ou 1005 -g1000 username.

Je me suis demandé quel était le but de cette opération. Cela peut-il affecter les autorisations, les journaux des utilisateurs, etc. Maintenant, si un utilisateur est ajouté avec uid=0et gid=0aura des privilèges tels qu'un compte root?

nux
la source
Pas sûr, mais je pense que la sortie affiche l'UID de l'utilisateur "test10" dans les deux commandes. Pourquoi est-ce que je fais cela, je n'ai aucune idée, mais doit être un utilisateur que vous avez créé précédemment.
animaletdesequia
comme si sa parole il y a un utilisateur qui a cette id
nux
OK, j'ai mal compris la question. Je pensais que vous créiez normalement les utilisateurs et que le système leur attribuait le même UID.
animaletdesequia
aucun homme normalement, la question ici, comment le système accepte uids uniques
nux
Je l'ai. Bonne question alors, merci pour l'explication :)
animaletdesequia

Réponses:

40

La réponse ici est que Linux ne vous protège pas contre vous-même.

Si vous voulez vraiment su rootaller dans les fichiers / etc et donner le même UID à tous les utilisateurs, vous pouvez le faire. C'est juste un fichier texte.

Mais vous ne devriez vraiment pas et cela aura des conséquences inattendues.

Chris numérique
la source
4
Ma question est pourquoi le système accepte cela?
Nux
46
Que voulez-vous dire par "accepter"? Comment cela ne l'accepterait-il pas? c'est comme si vous étiez chef et que vous vous demandiez pourquoi la soupe vous permettait d'y mettre trop de sel. En termes d’informatique moderne, vous êtes probablement habitué à la mentalité de SGBDR, où des contraintes importantes telles que les identifiants vous empêchent de vous tirer une balle dans le pied. Les identifiants utilisateur Linux sont beaucoup plus primitifs et n’ont aucune vérification ou correction interne.
Numérique Chris
5
Bien, et en utilisant useradd -ovous reconnaissez que vous êtes en dehors de la norme adduser. Comme @psusi l'a mentionné, il crée deux connexions se référant au même ID en ce qui concerne les autorisations de fichiers, etc.
Numérique Chris
2
Réponse: avoir 2 identifiants de connexion pointant vers des autorisations de système de fichiers identiques.
Numérique Chris
5
@Josh bien sûr, il y a des raisons valables d'avoir plusieurs utilisateurs avec le même UID, voir ma réponse pour un exemple.
terdon
38

Il y a des raisons valables à cela. Par exemple, je travaillais dans un laboratoire où nous avions chacun notre propre ordinateur mais notre ordinateur $HOMEétait dans un lecteur partagé exporté par un serveur. Donc, mon $HOMEétait

/users/terdon

Comme le /usersdossier n'était pas réellement sur ma machine locale mais exporté via NFS, j'utiliserais les données stockées sur mes disques durs locaux pour toute analyse trop chargée en E / S afin de ne pas surcharger le réseau du laboratoire. À cette fin, moi-même et tout le monde, avions deux utilisateurs: un système et un système local pour la machine en question. Le domicile de l'utilisateur local était

/home/localuser

Cependant, je devais avoir un accès complet à mes fichiers, que je sois connecté terdonou non, localuseret la façon dont notre administrateur système l’avait mise en œuvre consistait à donner les deux localuseret terdonle même UID. Ainsi, je pouvais manipuler mes fichiers locaux librement, quel que soit l'utilisateur pour lequel je suis actuellement connecté.

terdon
la source
6
À l'appui de cette réponse, il convient de noter que certaines configurations telles que l'hébergement de messagerie virtuelle l'utilisent avec beaucoup d'effet, c'est-à-dire qu'un grand nombre de comptes de messagerie virtuels partageant un seul UID - la documentation du serveur de messagerie Dovecot suggère en fait une approche optionnelle. à wiki2.dovecot.org/UserIds#mailusers
Matt Thomason
n'aurait pas chmod 666les mêmes affects?
Brian
3
@GIJoe qui permettrait aux deux utilisateurs de lire / écrire mais ne conserverait pas la propriété, ce qui pourrait poser problème. En outre, tous les fichiers ne peuvent pas être configurés avec ces autorisations (clés ssh par exemple) et il n’est pas pratique d’avoir besoin de jouer avec des autorisations tout le temps.
terdon
12

Deux utilisateurs peuvent avoir le même UID car il ne s'agit que d'un nombre dans un fichier texte. Vous pouvez donc le définir comme bon vous semble, y compris une valeur déjà utilisée. Comme vous l'avez vu cependant, ce n'est pas une bonne idée.

psusi
la source
comment le système traite-t-il avec les utilisateurs? partage des autorisations
Nux
12
@nux, ils sont tous deux le même utilisateur. Ils peuvent simplement avoir un nom d'utilisateur / mot de passe différent pour se connecter.
psusi
4
@ bigbadonk420, le terme "supporté" est plutôt nébuleux. C’est certainement quelque chose que vous avez toujours été capable de faire sur les systèmes Unix et c’était jadis une porte dérobée assez courante pour configurer un autre utilisateur avec l’identificateur uid 0 afin que vous puissiez vous connecter et être root, sans avoir besoin de connaître ou de modifier le mot de passe. sur l'utilisateur root normal.
psusi
1
@ bigbadonk420 il est pris en charge, il y a des cas où cela est utile, voir ma réponse pour un exemple.
terdon
11

Il est en fait assez courant d'avoir deux utilisateurs avec le même identifiant. Sur FreeBSD, il y a généralement deux utilisateurs avec l'UID 0: root et toor. Root utilise le shell / bin / sh intégré et toor utilise un shell différent, généralement bash.

Andybalholm
la source
11

Les systèmes Unix et Linux ne font généralement rien pour interdire les doublons dans le /etc/passwdfichier. Le but de ce fichier est d'associer un UID à un nom physique pouvant être affiché à l'aide d'outils de ligne de commande, par exemple lslorsque l'utilisateur répertorie les fichiers.

$ ls -n | head -5
total 986000
drwxrwxr-x.   3 1000 1000      4096 Feb 13 19:51 1_archive_sansa
-rw-rw-r--.   1 1000 1000    760868 Dec 16 08:21 2.18.x Database Scheme.jpg
-rw-rw-r--.   1 1000 1000       972 Oct  6 20:26 abcdefg
drwxrwxr-x.   2 1000 1000      4096 Feb 11 03:34 advanced_linux_programming

L’autre objectif de ce fichier est de spécifier le shell que l’utilisateur obtiendra lorsqu’il se connectera.

$ getent passwd saml
saml:x:1000:1000:saml:/home/saml:/bin/bash

Un vecteur d’attaque courant sur les systèmes de type Unix consiste à ajouter des lignes telles que celles-ci dans un /etc/passwdfichier système :

$ getent passwd r00t
r00t:x:0:0:root:/root:/bin/bash

$ getent passwd toor
toor:x:0:0:root:/root:/bin/bash

Le rôle du /etc/passwdfichier N'EST PAS destiné à suivre uniquement les comptes d'utilisateurs. Le rôle de suivi des noms d'utilisateur et des mots de passe est la responsabilité du /etc/shadowfichier. Les fichiers tels que /etc/passwdet /etc/groupsont vraiment destinés à fournir un nom lisible par l'homme lorsque votre système répertorie les fichiers à partir de disques.

N'oubliez pas que vos fichiers sont écrits sur le disque en utilisant des noms autres que UID / GID.

$ stat afile 
  File: ‘afile’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd02h/64770d    Inode: 6560621     Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/    saml)   Gid: ( 1000/    saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2014-02-27 15:54:21.852697029 -0500
Modify: 2014-02-27 15:54:21.852697029 -0500
Change: 2014-02-27 15:54:21.852697029 -0500
 Birth: -

Notez Uid:que Gid:les chiffres sont ce qui est écrit sur le disque!

slm
la source
9

Sous Linux, tous les utilisateurs et groupes ne sont en réalité que des chiffres. C'est ce idque montre le résultat de la commande que vous avez publiée.

Le /etc/passwdfichier mappe les noms d'utilisateur sur les ID utilisateur (numéros) et, dans l'exemple que vous avez fourni, vous avez simplement mappé deux noms d'utilisateur sur le même ID utilisateur.

En effet, vous avez créé un utilisateur, test12ID 1005, qui possède également un deuxième nom d'utilisateur test13. Cependant, le système mappera l'UID 1005 sur le premier nom d'utilisateur trouvé, ce qui seraittest12

Linux "vous permet" de le faire car aucun système ne vous en empêche. /etc/passwdest simplement un fichier texte, les noms d'utilisateurs sont mappés sur l'UID trouvé pour leur entrée dans ce fichier, les UID sont mappés sur le premier nom d'utilisateur trouvé dans ce fichier.

Mais ce que vous avez créé est une situation confuse pour les autres administrateurs de systams; l'évitez en changeant l'UID detest13

Josh
la source
c'est mon test machine virtuelle, ma question est-elle un objectif de mapper deux utilisateurs pour le même uid
nux
1
Le seul but auquel je puisse penser est de donner à un UID un deuxième nom d'utilisateur aliasé. Mais ce comportement n'est pas défini et n'est pas recommandé. Vraiment c'est une situation indésirable: vous êtes mieux avec une relation 1: 1 entre les noms d'utilisateur et les UID
Josh
C’est pourquoi j’ai posé cette question que j’avais besoin de savoir, j’ai senti que c’était une façon déroutante
nux
C'est confus; c'est pourquoi vous ne devriez pas le faire. Il n’a pas de "but", c’est plus une mauvaise utilisation du /etc/passwdfichier. Mais il n'y a aucun moyen en place pour vous empêcher de le faire. Cela a-t-il du sens?
Josh
1
un utilisateur a mentionné que l'objectif est de faire en sorte que 2 connexions pointent vers des autorisations de système de fichiers identiques.
Nux
5

La raison pour laquelle cela est autorisé aujourd'hui, c'est simplement parce que le système ne l'empêche pas.

Si cela changeait, les systèmes où les administrateurs pouvaient utiliser cette fonctionnalité seraient brisés (voir l'exemple de Terdon). Donc, cela n'a jamais été changé, et je ne pense pas que ce sera le cas.

À l'origine, il n'y avait que les fichiers passwd et group, et ils servaient leur objectif. il n'y avait pas de commande adduser , ni addgroup , les fichiers ont été édités par root à l'aide de vi ou ed.

Il y avait quelques bizarreries!

Afin de se souvenir du prochain identifiant utilisateur à utiliser, il était courant que les administrateurs aient un utilisateur spécial sur la dernière ligne ayant un nom d'utilisateur égal à !(car !c'était un nom d'utilisateur non valide) et cette entrée était utilisée pour stocker la prochaine. identifiant d'utilisateur. Brut, je l'avoue, mais ça a fonctionné! Alors, pourquoi casser les entrailles en les rendant plus compliquées, ce qui s'apparente aujourd'hui au développement agile.

Il y avait des défauts connus. Le principal étant qu’il devait être lisible par tout le monde, afin que des utilitaires comme ceux ls-ci puissent cartographier user-id => name. Cela signifiait que tout le monde pouvait voir le mot de passe crypté de tout le monde, ainsi que tous les utilisateurs et identifiants du système.

Certains systèmes Unix ont commencé à introduire quelques scripts shell adduser addgroup, souvent ignorés, car ils étaient incohérents entre Unix et la plupart des utilisateurs se contentaient donc de l'édition manuelle.

Il a fallu plusieurs années avant que le shadowfichier de mots de passe ne soit inventé, ce qui a apporté un peu plus de sécurité en masquant les mots de passe cryptés. Encore une fois, juste assez de complexité a été ajoutée, mais c'était quand même assez brut et simple. Les utilitaires useraddet groupaddont été introduits, qui conservés shadowet shadow-mis à jour. Pour commencer, il s’agissait souvent de simples wrappers de scripts shell concernant les utilitaires propriétaires d’ adduser / addgroup des fournisseurs. Encore une fois, c'était juste suffisant pour continuer.

Les réseaux d'ordinateurs grandissaient, les gens travaillaient plusieurs fois à la fois pour faire le travail. L'administration des passwd/groupfichiers était en train de devenir un cauchemar, en particulier avec NFS. C'est ainsi que les Pages Jaunes, également appelées NIS, allaient alléger le fardeau.

Il devenait maintenant évident qu’il fallait quelque chose d’un peu plus souple, et PAM a été inventé. Donc, si vous étiez vraiment sophistiqué et que vous vouliez un système d’authentification centralisé, sécurisé, avec un identifiant unique, appelez un serveur central pour s’authentifier, par exemple un serveur Radius, un serveur LDAP ou Active Directory.

Le monde avait grandi. Mais les fichiers passwd / group / shadow restaient toujours pour nous, utilisateurs / développeurs / laboratoires plus petits. Nous n’avions toujours pas vraiment besoin des cloches et des sifflets. J'imagine que la philosophie avait un peu changé: "Si vous deviez l'améliorer, vous ne l'utiliseriez pas du tout" , alors ne vous inquiétez pas.

C'est pourquoi je ne pense pas que le fichier passwd simple changera jamais. Cela n'a plus sa raison d'être, et il est tout simplement génial pour les Raspberry Pi à 30 £ avec une température de surveillance de 2, voire 3 utilisateurs, et des flux Twitter. OK, vous devez juste être un peu prudent avec vos identifiants si vous voulez qu'ils soient uniques, et rien n'empêche le passionné d'envelopper useradd dans un script qui sélectionne d'abord le prochain identifiant unique d'une base de données (fichier) pour définir un paramètre. identifiant unique, si c'est ce que vous voulez. Il est open source après tout.

X Tian
la source
2

Le /etc/passwdfichier ne fait que mapper les noms d'utilisateur symboliques sur le véritable ID utilisateur. Si vous faites délibérément deux noms symboliques qui correspondent à un ID utilisateur, il vous le laissera.

Cela ne signifie pas que ce soit une bonne idée de le faire. Certaines personnes ont pu trouver des cas d'utilisation très spécifiques pouvant tirer parti de cette fonctionnalité, mais en général, vous ne devriez pas le faire.

Linux (et d'autres UNIX) considèrent que l'administrateur sait ce qu'il fait. Si vous lui dites de faire quelque chose de stupide, alors c'est de votre faute, à peu près de la même manière que si vous dites à votre voiture de rouler sur une falaise, vous ne pouvez pas aller voir les fabricants et demander pourquoi la voiture vous a permis de le faire.

utilisateur253158
la source
pourquoi a-t-il été mentionné comme un bug?
Nux
1

Il existe des identifiants que le système d’exploitation attend d’être uniques, mais ils sont utilisés pour le suivi du matériel. Savoir qu'un IDentifier Universellement Unique particulier correspond à un disque dur contenant des fichiers système peut aider celui-ci à continuer de fonctionner si la configuration matérielle change. Microsoft appelle ces identifiants globaux uniques et les utilise pour suivre tous les logiciels Windows. Ironiquement, ces acronymes étaient mal choisis.

Du point de vue du système d'exploitation, la plupart des changements d'identifiant d'utilisateur et de groupe reviennent à changer d'interface externe. Il pourrait fonctionner normalement malgré les collisions. ce qui est principalement demandé aux utilisateurs et aux groupes du système, c’est qu’ils existent. Il ne peut pas savoir ce dont les utilisateurs ont besoin. Dans de telles situations, la philosophie Unix est que le système d'exploitation suppose que les administrateurs savent ce qu'ils font et les aident à le faire rapidement.

utilisateur130144
la source
0

J'ai trouvé des preuves qui appuient la réponse de @ andybalholm.

À partir de APUE , § 8.15:

Tout processus peut trouver son identifiant utilisateur réel et effectif et son identifiant de groupe. Parfois, cependant, nous souhaitons connaître le nom de connexion de l'utilisateur qui exécute le programme. Nous pourrions appeler getpwuid( getuid()), mais que se passe-t-il si un seul utilisateur a plusieurs noms de connexion, chacun avec le même ID utilisateur? ( Une personne peut avoir plusieurs entrées dans le fichier de mots de passe avec le même ID utilisateur pour avoir un shell de connexion différent pour chaque entrée .) Le système garde normalement une trace du nom sous lequel nous nous sommes connectés (Section 6.8), et la getloginfonction fournit un moyen pour récupérer ce nom de connexion.

....

Étant donné le nom de connexion, nous pouvons ensuite l'utiliser pour rechercher l'utilisateur dans le fichier de mots de passe - pour déterminer le shell de connexion, par exemple - à l'aide de getpwnam.

Btw, je voudrais savoir si on peut passer à un autre shell tout en étant connecté.

Meule
la source