我对 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:test12
和 test13
的输出/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)
不过,我需要有我在为是否已登录完全访问我的文件terdon
或localuser
与我们的系统管理员已经实施的方式,是通过给双方localuser
和terdon
相同的UID。这样,无论我当前以哪个用户登录,我都可以自由地操作我的本地文件。
Dig*_*ris 41
这里的答案是 Linux 不会保护您免受自己的伤害。
如果你真的想su root
进入 /etc 文件并为所有用户提供相同的 UID,你可以。它只是一个文本文件。
但你真的不应该这样做,它会产生意想不到的后果。
psu*_*usi 12
两个用户可以具有相同的 UID,因为它只是文本文件中的一个数字,因此您可以将其设置为您想要的任何内容,包括已使用的值。但是,正如您所见,这样做并不是一个好主意。
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。
实际上,您已经创建了一个用户test12
ID 1005,该用户还有第二个用户名test13
。但是系统会将 UID 1005 映射到它找到的第一个用户名,即test12
Linux“允许”你这样做,因为没有系统阻止你这样做。/etc/passwd
只是一个文本文件,用户名映射到在该文件中找到的 UID,UID 映射到该文件中找到的第一个用户名。
但是您所创建的对于其他系统管理员来说是一个令人困惑的情况;通过更改 UID 来避免它test13
今天允许这样做的原因仅仅是因为系统没有阻止它。
如果这改变了,那么它会破坏那些管理员使用此功能的系统,(参见 Terdon 的示例)。所以它从未改变过,我认为它永远不会改变。
最初只有 passwd 和 group 文件,它们起到了它们的作用。没有adduser命令,没有addgroup,文件是由 root 使用 vi 或 ed 编辑的。
有一些怪癖!
为了记住要使用的下一个用户 ID,管理员通常将一个特殊用户作为最后一行的用户名!
(因为这!
是一个无效的用户名),并且该条目用于存储下一个用户身份。原油,我承认,但它奏效了!那么为什么要打破直觉,让它变得更加复杂,类似于今天的敏捷开发。
存在已知缺陷。主要是,它必须是世界可读的,以便像这样的实用程序ls
可以映射user-id => name
. 这意味着任何人都可以看到每个人的加密密码,以及系统中的所有用户和 ID。
一些 Unix 系统开始引入一些 shell 脚本adduser
addgroup
,通常这些被忽略,因为它们在 Unix 之间不一致,所以大多数人只是继续手动编辑。
花了好几年时间,才shadow
发明了密码文件,通过隐藏加密的密码,这提供了更多的安全性。同样,添加了足够的复杂性,但它仍然相当粗糙和简单。公用事业useradd
和groupadd
被引入,从而保持shadow
和shadow-
更新。首先,这些通常是围绕供应商专有的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,如果这是您想要的。毕竟它是开源的。