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

我对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.添加了用户useradd -ou 1005 -g1000 username.

我很困惑这是什么目的,它可以影响权限和用户日志等。所以现在如果用户添加uid=0gid=0将具有像root帐户的权限?

这里的答案是Linux不能保护您自己。

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

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

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

 /users/terdon 

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

 /home/localuser 

但是,我需要完全访问我的文件,无论我是以terdon还是localuser身份登录,以及我们的sysadmin实现的方式是通过给localuserterdon相同的UID。 这样,我可以自由地操纵我的本地文件,无论我当前登录的是哪个用户。

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

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 

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

 $ 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:数字是实际写入磁盘的数字!

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

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

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

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

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

但是你创建的是其他系统管理员的混乱局面; 通过更改test13的UID来避免它

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

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

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

有一些怪癖!

为了记住要使用的下一个用户ID,管理员通常会将特殊用户作为最后一行,其用户名为! (因为!是一个无效的用户名),该条目用于存储下一个用户ID。 我承认,原油,但它的确有效! 那么为什么要使它变得更加复杂,就像今天的敏捷开发一样。

有已知的缺陷。 主要的是,它必须是世界可读的,所以像ls这样的实用程序可以映射user-id => name 。 这意味着任何人都可以看到每个人的加密密码,以及系统中的所有用户和ID。

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

花了几年时间,在发明shadow密码文件之前,通过隐藏加密密码,这提供了更多的安全性。 同样,增加了足够的复杂性,但它仍然相当粗糙和简单。 引入了实用程序useraddgroupadd ,它们保持shadowshadow-更新。 首先,这些通常是围绕供应商专有的adduser / addgroup实用程序的简单shell脚本包装器。 再次,这足以继续前进。

计算机网络正在成长,人们一次只能做几个工作来完成工作,所以passwd/group文件的管理变成了一场噩梦,特别是对于NFS,所以黄页也称为NIS,以减轻负担。

现在越来越明显的是,需要更灵活的东西,并且发明了PAM。 因此,如果您真的很老练并想要一个集中的,安全的,独特的id,所有的铃声和​​口哨认证系统,您可以呼叫中央服务器进行身份validation,可能是Radius服务器,LDAP服务器或Active目录。

世界已经成长起来。 但是passwd / group / shadow文件仍然适用于我们较小的用户/开发人员/实验室。 我们仍然没有真正需要所有的花里胡哨。 我想现在的哲学已经改变了一点, “如果你想要做得更好,你根本就不会使用它” ,所以不要担心。

这就是为什么我认为简单的passwd文件不会改变的原因。 没有任何意义了,对于那些30英镑的Raspberry Pi来说,它有2个可能是3个用户的监控温度和twitter。 好的,如果你想要它们是唯一的,你只需要对你的用户ID有点小心,并且没有什么可以防止发烧友在一个脚本中包装useradd ,该脚本首先从数据库(文件)中选择下一个唯一的id来设置一个唯一身份证,如果这就是你想要的。 毕竟它是开源的。

/etc/passwd文件只是将符号用户名映射到真实用户ID。 如果你故意制作两个映射到一个userID的符号名称,那么它就会让你。

这并不意味着实际做到这一点是个好主意。 有些人可能已经找到了非常具体的用例,他们可以利用这个function,但一般情况下你不应该这样做。

Linux(和其他UNIX)认为管理员知道他们在做什么。 如果你告诉它做一些愚蠢的话,那就是你自己的错,就像你告诉你的车开过悬崖一样,你不能去制造商那里问为什么汽车允许你这样做。

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

从操作系统的角度来看,大多数用户和组标识符的更改都会改变其外部接口。 尽管碰撞,它仍能正常运作; 主要是系统用户和组所需要的是它们的存在。 它无法知道用户需要什么。 在这种情况下,Unix的理念是操作系统应该让管理员知道他们在做什么,并且应该帮助他们快速完成。