当前位置: 首页>>技术教程>>正文


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

,

问题描述

我对UID的理解是,它是由Unix-like操作系统分配给每个用户的唯一正整数。通过其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=0gid=0将具有像root帐户的权限?

最佳解决办法

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

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

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

次佳解决办法

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

/users/terdon

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

/home/localuser

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

第三种解决办法

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

第四种办法

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

第五种办法

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

第六种办法

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

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

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

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

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

第七种办法

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

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

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

有几个怪癖!

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

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

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

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

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

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

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

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

第八种办法

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

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

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/6423.html,未经允许,请勿转载。