为什么我可以创建具有相同 UID 的用户?

nux*_*nux 46 user-management

我对 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:~#
Run Code Online (Sandbox Code Playgroud)

我已经添加了两个用户使用相同的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
Run Code Online (Sandbox Code Playgroud)

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

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

ter*_*don 48

这实际上是有正当理由的。例如,我曾经在一个实验室工作,在那里我们每个人都有自己的电脑,但我们$HOME在一个服务器导出的共享驱动器中。所以,我$HOME

/users/terdon
Run Code Online (Sandbox Code Playgroud)

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

/home/localuser
Run Code Online (Sandbox Code Playgroud)

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

  • 为了支持这个答案,值得注意的是,一些设置(例如虚拟电子邮件托管)使用了这一点,效果很好,即大量虚拟电子邮件帐户共享一个 UID - Dovecot 邮件服务器的文档实际上建议这是一种可选方法在 http://wiki2.dovecot.org/UserIds#mailusers (7认同)
  • @GIJoe 这将允许两个用户读/写,但它不会保留所有权,这可能是一个问题。此外,并非所有文件都可以设置为这些权限(例如 ssh 密钥),并且需要一直使用权限是不切实际的。 (5认同)

Dig*_*ris 41

这里的答案是 Linux 不会保护您免受自己的伤害。

如果你真的想su root进入 /etc 文件并为所有用户提供相同的 UID,你可以。它只是一个文本文件。

但你真的不应该这样做,它会产生意想不到的后果。

  • 你是什​​么意思“接受”它?怎么会不接受呢?这就像是一个厨师,问为什么汤里放了太多盐。就现代计算而言,您可能已经习惯了 RDBMS 的心态,在这种心态下,对 ID 等重要事物的限制使您免于受到打击。Linux 用户 ID 更为原始,没有内部检查或更正。 (47认同)
  • 是的,通过使用 `useradd -o`,你会意识到你超出了 `adduser` 的规范。正如@psusi 所提到的,它创建了两个指向相同 ID 的登录名,就文件权限等而言。它也可能会产生问题,因为这不是一个正常的用例,而且毫无疑问没有经过大量软件包的测试。 (5认同)
  • @Josh 当然是这样,有多个用户具有相同的 UID 是有正当理由的,请参阅我的答案以获取示例。 (5认同)
  • 我的问题是为什么系统接受这个? (4认同)
  • 答:有 2 个登录指向相同的文件系统权限。 (2认同)
  • 如果你想用脚射击自己,linux 完全愿意让你装枪并扣动扳机。它只是一个操作系统,如果你认为你有充分的理由做一些奇怪的事情,它不会再猜你。 (2认同)

psu*_*usi 12

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

  • @nux,他们都是同一个用户。他们可以使用不同的用户名/密码来登录。 (12认同)
  • @bigbadonk420,“支持”这个词相当模糊。这当然是你在 unix 系统上一直可以做的事情,它曾经是一个相当常见的后门程序来设置另一个具有 uid 0 的用户,这样你就可以登录并有效地成为 root,而无需知道或更改密码在普通 root 用户上。 (4认同)

slm*_*slm 12

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
Run Code Online (Sandbox Code Playgroud)

此文件的另一个目的是指定用户登录时将获得的 shell。

$ getent passwd saml
saml:x:1000:1000:saml:/home/saml:/bin/bash
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

/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: -
Run Code Online (Sandbox Code Playgroud)

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


小智 12

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


Jos*_*osh 10

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

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

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

Linux“允许”你这样做,因为没有系统阻止你这样做。/etc/passwd只是一个文本文件,用户名映射到在该文件中找到的 UID,UID 映射到该文件中找到的第一个用户名。

但是您所创建的对于其他系统管理员来说是一个令人困惑的情况;通过更改 UID 来避免它test13


X T*_*ian 7

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

如果这改变了,那么它会破坏那些管理员使用此功能的系统,(参见 Terdon 的示例)。所以它从未改变过,我认为它永远不会改变。

最初只有 passwd 和 group 文件,它们起到了它们的作用。没有adduser命令,没有addgroup,文件是由 root 使用 vi 或 ed 编辑的。

有一些怪癖!

为了记住要使用的下一个用户 ID,管理员通常将一个特殊用户作为最后一行的用户名!(因为这!是一个无效的用户名),并且该条目用于存储下一个用户身份。原油,我承认,但它奏效了!那么为什么要打破直觉,让它变得更加复杂,类似于今天的敏捷开发。

存在已知缺陷。主要是,它必须是世界可读的,以便像这样的实用程序ls可以映射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 是唯一的,您只需要对用户 ID 小心一点,并且没有什么可以阻止发烧友将useradd包装在脚本中,该脚本首先从数据库(文件)中选择下一个唯一 ID 以设置唯一 ID,如果这是您想要的。毕竟它是开源的。