为什么要创建具有相同UID的用户?


37

我对UID的理解是,它是类似Unix的操作系统分配给每个用户的唯一正整数。每个用户都通过其UID标识到系统,并且用户名通常仅用作人类的界面。

两个用户如何具有相同的UID,这对我的系统和软件包不是冲突吗?

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:~#

我添加了两个具有相同UID和GID的用户:test12test13

输出/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

我添加了用户 useradd -ou 1005 -g1000 username.

我很困惑,这样做的目的是什么,它会影响权限和用户日志等吗?那么,如果现在添加了一个用户,uid=0并且该用户gid=0将具有像root帐户这样的特权?


不确定,但是我认为输出在两个命令中都打印用户“ test10”的UID。为什么这样做,我不知道,但必须是您之前创建的某个用户。
animaletdesequia 2014年

好像是说有一个用户拥有这个ID
nux

好的,我误解了这个问题。我以为您正常创建了用户,系统为他们分配了相同的UID。
animaletdesequia 2014年

没有人通常不是,这里的问题是,系统如何接受唯一的uid
nux

得到它了。那么,好问题,谢谢您的解释:)
animaletdesequia 2014年

Answers:


40

答案是Linux并不能保护您自己。

如果您确实想要su root进入/ etc文件并为所有用户提供相同的UID,则可以。这只是一个文本文件。

但是您实际上不应该这样做,否则会产生意想不到的后果。


4
我的问题是系统为什么接受这一点?
nux 2014年

46
你是什​​么意思“接受”呢?怎么会不接受呢?这就像当厨师,然后问为什么汤允许您在其中加太多盐。在现代计算方面,您可能已经习惯了RDBMS的思维方式,因为ID等重要内容上的矛盾使您无法用脚射击。Linux用户ID更原始,没有内部检查或更正。
数字克里斯

5
是的,通过使用useradd -o它,您会认识到自己在规范之外adduser。如@psusi所述,它会创建两个指向相同ID(就文件权限而言)的登录名。它可能还会产生问题,因为这不是正常的用例,并且毫无疑问未经大量软件包测试。
数字克里斯

2
答:要有2个登录名,则指向相同的文件系统权限。
数字克里斯

5
@Josh当然是,有充分的理由要让多个用户具有相同的UID,请参阅我的答案作为一个示例。
terdon

38

实际上有正当的理由。例如,我曾经在一个实验室工作,每个实验室都有自己的计算机,但是我们$HOME位于服务器导出的共享驱动器中。所以,我$HOME当时

/users/terdon

由于该/users文件夹实际上不在我的本地计算机上,而是通过NFS导出的,因此对于任何繁琐的I / O分析,我都将使用存储在本地硬盘驱动器上的数据,以免增加实验室的网络负担。为此,我和其他所有人都有两个用户:一个在系统范围内,一个在所讨论的机器本地。本地用户的住所是

/home/localuser

不过,我需要有我在为是否已登录完全访问我的文件terdonlocaluser与我们的系统管理员已经实施的方式,是通过给双方localuserterdon相同的UID。这样,无论我当前以哪个用户登录,我都可以自由操作本地文件。


6
为了支持此答案,值得注意的是,诸如虚拟电子邮件托管之类的某些设置可以很好地利用此功能,即大量虚拟电子邮件帐户共享一个UID-Dovecot邮件服务器的文档实际上建议将此作为一种可选方法。在wiki2.dovecot.org/UserIds#mailusers
Matt Thomason

不会chmod 666有相同的影响?
布莱恩(Brian)

3
@GIJoe,这将允许两个用户都可以读取/写入,但不会保留所有权,这可能是一个问题。同样,并非所有文件都可以设置为那些权限(例如ssh键),并且不时需要使用权限播放也不现实。
terdon

12

两个用户可以具有相同的UID,因为它只是文本文件中的一个数字,因此您可以将其设置为所需的任何值,包括已经使用的值。如您所见,这样做不是一个好主意。


系统如何处理用户呢?共享权限
nux 2014年

12
@nux,他们都是同一用户。他们可以使用不同的用户名/密码进行登录
。– psusi 2014年

4
@ bigbadonk420,术语“受支持”非常模糊。当然,这是您在Unix系统上一直能够做的事情,并且它曾经是设置另一个拥有uid 0的用户的相当普遍的后门程序,因此您可以登录并有效地成为root用户,而无需知道或更改密码。在普通的root用户上。
psusi 2014年

1
@ bigbadonk420它受支持,在某些情况下这很有用,请参阅我的答案作为一个示例。
terdon

11

具有两个具有相同ID的用户实际上是相当普遍的。在FreeBSD上,通常有两个UID为0的用户:root和toor。Root使用内置的/ bin / sh shell,而toor使用不同的shell,通常是bash。


11

Unix系统和Linux通常不采取任何措施来禁止/etc/passwd文件中的重复项。该文件的目的是将UID与可以通过命令行工具(例如,ls当用户列出文件时)显示的物理名称相关联。

$ 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

该文件的另一个预期目的是指定用户登录时将获得的外壳。

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

在Unix类型的系统上,常见的攻击方式是在系统/etc/passwd文件中添加以下行:

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

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

/etc/passwd文件的作用并不意味着仅跟踪用户帐户。跟踪用户名和密码的作用是/etc/shadow文件的责任。当系统列出磁盘中的文件时,诸如/etc/passwd/etc/group等文件实际上是为了提供一个易于理解的名称。

请记住,您的文件是使用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: -

注意Uid:Gid:,数字是实际写入磁盘的数字!


9

在Linux中,所有用户和组实际上都是数字。这就是id您发布的命令的输出所显示的。

/etc/passwd文件将用户映射到用户ID(数字),在您提供的示例中,您仅将两个用户名映射到相同的用户ID。

实际上,您已经创建了一个test12ID 1005的用户,该用户还具有另一个用户名test13。但是,系统会将UID 1005映射到它找到的第一个用户名,即test12

Linux允许您执行此操作,因为没有系统可以阻止您执行此操作。/etc/passwd只是一个文本文件,用户名映射到在该文件中找到的UID,UID映射到该文件中找到的第一个用户名。

但是,对于其他系统管理员,您创建的情况却令人困惑。通过更改UID来避免test13


这是我的测试虚拟机人,我的问题是有一个目的是为同一个uid映射两个用户
nux 2014年

1
我能想到的唯一目的是给UID第二个别名用户名。但这是未定义的行为,不建议这样做。真的,这是不希望的情况:你最好用1:用户名和UID的1之间的关系
乔希

那就是为什么我问这个问题我需要知道的原因,我觉得这是一个令人困惑的方式
nux 2014年

令人困惑;这就是为什么你不应该这样做。它没有“目的”,而是对/etc/passwd文件的滥用。但是没有任何方法可以阻止您这样做。那有意义吗?
2014年

1
一位用户提到目标是让2次登录指向相同的文件系统权限。
nux

5

今天允许这样做的原因仅仅是因为系统没有阻止它。

如果这种情况发生了变化,那么它将破坏管理员已使用该功能的那些系统(请参阅Terdon的示例)。因此它从未改变过,我认为它永远不会改变。

最初只有passwd和group文件,它们可以达到目的。没有adduser命令,没有addgroup,这些文件是由root使用vi或ed编辑的。

有一些怪癖!

为了记住下一个要使用的用户ID,管理员通常在最后一行中有一个特殊用户,该用户的用户名是!(因为!用户名无效),并且该条目用于存储下一个用户名。用户身份。我承认,粗鲁,但是行得通!那么,为什么要破坏直觉使之变得更加复杂,类似于当今的敏捷开发。

存在已知的缺陷。最主要的是,它必须是世界范围内可读的,以便ls可以使用map 等实用程序user-id => name。这意味着任何人都可以看到每个人的加密密码,以及系统中的所有用户和ID。

某些Unix系统开始引入了几个shell脚本adduser addgroup,通常会忽略它们,因为它们在Unix之间是不一致的,因此大多数人只是继续进行手动编辑。

shadow在发明密码文件之前,花了好几年的时间,通过隐藏加密的密码来提供更高的安全性。再次,仅添加了足够的复杂性,但是仍然相当粗糙和简单。公用事业useraddgroupadd被引入,从而保持shadowshadow-更新。首先,这些通常是围绕卖方专有的adduser / addgroup实用程序的简单shell脚本包装。再次足以继续前进。

计算机网络正在成长,人们一次要花很多时间才能完成工作,因此passwd/group文件的管理正成为一场噩梦,尤其是在使用NFS的情况下,因此黄页也被称为NIS以减轻负担。

现在变得很明显,需要一些更灵活的方法,并且发明了PAM。因此,如果您真的很老练,并且想要一个集中的,安全的,唯一的,唯一的身份验证系统,则可以呼叫中央服务器进行身份验证,例如Radius服务器,LDAP服务器或Active Directory。

世界已经成长。但是对于较小的用户/开发人员/实验室,passwd / group / shadow文件仍然保留。我们仍然并没有真正要求所有的风吹草动。我猜想这种哲学现在已经改变了一些,“如果要使其变得更好,就根本不会使用它”,所以不必担心。

这就是为什么我认为简单的passwd文件不会更改的原因。没有任何意义了,它对于那些售价30英镑的Raspberry Pi具有2个或3个用户的监控温度以及twitter提要非常有用。好的,如果您希望用户ID唯一,则只需要小心一点即可,并且没有什么可以阻止发烧友将useradd包装在脚本中的,该脚本首先从数据库(文件)中选择下一个唯一ID来设置唯一ID(如果您要这样做)。毕竟它是开源的。


2

/etc/passwd文件仅将符号用户名映射到真实的用户ID。如果您故意制作两个映射到一个userID的符号名,那么它将允许您。

这并不意味着实际执行此操作是一个好主意。某些人可能已经找到了非常具体的使用案例,可以利用此功能,但是通常您不应该这样做。

Linux(和其他UNIX)认为管理员知道他们在做什么。如果您告诉它做一些愚蠢的事情,那是您自己的错,就像您告诉汽车在悬崖上行驶时,您无法去向制造商询问汽车为何允许您这样做。


为什么提到它是一个bug?
马钱

1

操作系统期望有一些标识符是唯一的,但是它们用于跟踪硬件。如果硬件配置发生更改,则特定的通用唯一IDentifier对应于包含系统文件的硬盘驱动器的知识可帮助其继续运行。Microsoft称这些为全球唯一IDentifier,并使用它们来跟踪所有Windows软件。具有讽刺意味的是,这些首字母缩写词选择不当。

从操作系统的角度来看,大多数用户和组标识符更改都等于更改其外部接口。即使发生碰撞,它也可以正常运行;系统用户和组的主要要求是它们必须存在。它不知道用户的需求。在这种情况下,Unix的哲学是操作系统应假定管理员知道他们在做什么,并应帮助他们快速地做到这一点。


0

我发现了一些支持@andybalholm答案的证据。

APUE,§8.15:

任何进程都可以找到其真实有效的用户ID和组ID。但是,有时我们想找出运行该程序的用户的登录名。我们可以调用getpwuidgetuid()),但是如果单个用户具有多个登录名,每个登录名具有相同的用户ID怎么办?(一个人可能在密码文件中有多个条目,且每个条目具有相同的用户ID,以便每个条目具有不同的登录外壳。)系统通常会跟踪我们在(第6.8节)下登录的名称,该getlogin功能提供了一种方法获取该登录名。

....

给定登录名后,我们可以使用它在密码文件中查找用户(例如,确定登录外壳)getpwnam

顺便说一句,我想知道一个人在登录时是否可以切换到另一个shell。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.