具有相同UID的多个* NIX帐户


14

我很好奇,是否有一个标准的预期行为,是否在Linux / Unix上创建多个具有相同UID的帐户时被认为是不好的做法。我已经在RHEL5上进行了一些测试,它的表现符合我的预期,但是我不知道我是否正在使用这种技巧来吸引命运。

例如,假设我有两个具有相同ID的帐户:

a1:$1$4zIl1:5000:5000::/home/a1:/bin/bash
a2:$1$bmh92:5000:5000::/home/a2:/bin/bash

这意味着:

  • 我可以使用自己的密码登录每个帐户。
  • 我创建的文件将具有相同的UID。
  • 诸如“ ls -l”之类的工具会将UID列为文件中的第一个条目(在本例中为a1)。
  • 我避免了两个帐户之间的任何权限或所有权问题,因为它们实际上是同一用户。
  • 我为每个帐户进行登录审核,因此可以更好地跟踪系统上发生的情况。

所以我的问题是:

  • 这个能力是设计出来的还是仅仅是它发生的方式?
  • 这在* nix变体中会保持一致吗?
  • 这是公认的做法吗?
  • 这种做法会产生意想不到的后果吗?

注意,这里的想法是将其用于系统帐户,而不是普通用户帐户。

Answers:


8

我的想法:

这个能力是设计出来的还是仅仅是它发生的方式?

它是设计的。自从我开始使用* NIX以来,您就可以将用户置于普通组中。使UID相同而不会出现问题的能力只是预期的结果,与所有问题一样,如果管理不当,可能会带来问题。

这在* nix变体中会保持一致吗?

我相信是这样。

这是公认的做法吗?

接受,通常以一种或另一种方式使用,是的。

这种做法会产生意想不到的后果吗?

除了登录审核之外,您别无其他。除非您确实想要那样,否则请先开始。


请注意,这不是将用户放在同一个组中,而是为他们提供相同的组ID。因此,将存在一个组G1为5000的a1和一个组为GID 5000的a2。但是,更关键的概念是相同的UID,因为您可以按照建议的方式进行组处理。

1
* NIX组的名称无关紧要。重要的是GID。通过将相同的GID分配给多个组,您完成的工作很少;为什么不为您想要的尽可能多的用户使用相同的组名/ GID?UID稍有不同,因为友好名称已被记录。

我可能只应该讨论UID,因为它是问题中最相关的项目。
蒂姆

这个答案今天无效。
阿斯塔拉

@Astara:想详细说明吗?
user63623 '19

7

它可以在所有Unix上运行吗?是。

使用起来好吗?否。还有其他更好的技术。例如,正确使用unix组和严格控制的“ sudo”配置可以实现相同的目的。

我已经确切地看到一个地方使用它没有问题。在FreeBSD中,通常会创建另一个名为“ toor”的根帐户(根向后拼写),该默认帐户具有/ bin / sh作为默认外壳。这样,如果root的shell混乱了,您仍然可以登录。


3
它不仅是传统的,它是默认的。在每次安装时都会创建toor用户,因此,如果用户搞砸了root帐户,则toor仍然可用。话虽如此,大多数人从未为用户帐户设置密码!
X-Istence,2009年

这个答案是错误的-过去和现在。我敢肯定它没有,而且不会在所有 unix变体上起作用。
阿斯塔拉

用什么方式错了?哪些变体不起作用?
TomOnTime 2014年

使用基于文件的名称服务映射(/ etc / passwd,/ etc / group),这在我见过的每个UNIX上都可以一致地工作。AIX或HP-UX(我忘记了哪一个)会自动添加第二个名为“ group2”(和“ group3”等)的组,当该组中的成员数增加以使文件中的行长于操作系统最大行长。我是在另一台,SunOS和Linux上手动完成的。直到我们迁移到LDAP为止。:)
dannysauer

1
@TomOnTime与其说是否禁止不当行为,不如说是一个问题,而是 供应商所支持和测试的问题。我不知道任何支持这种用法的Unix或Linux供应商。鉴于它不太可能被测试,其后果是未经测试且未知的。任何遵循最佳做法的公司都将遵循供应商的支持。如果不这样做,将在以后出现问题时打开诉讼的大门。它要求潜在的问题。要使用此功能,将需要对所有所需路径进行全面测试。这将是非常昂贵的。
阿斯塔拉

4

我无法为您的问题提供规范的答案,但奇怪的是,我的公司多年来一直与root用户一起这样做,并且从未遇到过任何问题。我们创建一个'kroot'用户(UID 0),其存在的唯一原因是使用/ bin / ksh作为外壳,而不是/ bin / sh或bin / bash。我知道我们的Oracle DBA会与用户进行类似的操作,每次安装使用3或4个用户名,并且都使用相同的用户ID(我相信这样做是为了使每个用户拥有单独的主目录。我们至少已经这样做了在Solaris和Linux上运行了十年,我认为它的工作是按设计的。

我不会使用普通用户帐户执行此操作。如您所述,在首次登录后,所有内容都返回到日志文件中的名字,因此我认为一个用户的操作可能会伪装成另一个用户的操作。对于系统帐户,虽然效果很好。


4

这个能力是设计出来的还是仅仅是它发生的方式?

以这种方式设计。

这在* nix变体中会保持一致吗?

应该,是的。

这是公认的做法吗?

取决于你的意思。这种类型的问题可以回答一个非常具体的问题(请参阅根/户口帐户)。在其他任何地方,您将来都需要一个愚蠢的问题。如果您不确定这是否是正确的解决方案,那可能不是。

这种做法会产生意想不到的后果吗?

通常将用户名和UID视为可互换的。正如其他一些人指出的那样,登录/活动审核将是不准确的。您还需要检查任何与用户相关的相关脚本/程序(您的发行版的useradd,usermod,userdel脚本,任何定期维护脚本等)的行为。

您想通过将这两个用户添加到新组并向该组授予所需的权限来完成此任务是什么?


4

这种做法会产生意想不到的后果吗?

我知道一个问题。Cron不能很好地使用此UID别名。尝试从Python脚本运行“ crontab -i”以更新cron条目。然后在外壳程序中运行“ crontab -e”进行修改。

请注意,现在cron(我想是vixie)将为a1和a2(在/ var / spool / cron / a1和/ var / spool / cron / a2中)更新相同的条目。


3

这是我所见过的所有发行版上的预期行为,这是“敌人”用来隐藏具有root用户访问权限的帐户的常见技巧。

它当然不是标准的(我在任何地方都没有看到过此功能),但是如果您认为合适的话,应该没有任何理由不能在自己的环境中使用它。

现在唯一想到的陷阱是,这可能会使审核变得困难。如果您有两个具有相同uid / gid的用户,我认为您将很难确定在分析日志时哪个用户做了什么。


这是真的。初始登录将在/ var / log / secure中注册为a1或a2,但是无论您如何登录,后续活动都将登录为a1。–
Tim

3

共享主要组ID是很常见的,因此问题实际上是围绕UID展开的

我之前已经完成过此操作,以使某人具有root访问权限,而不必透露root密码-效果很好。(尽管我认为sudo是一个更好的选择)

我要谨慎的主要事情是删除一个用户之类的程序-程序可能会感到困惑,并删除两个用户或属于这两个用户的文件或类似的东西。

实际上,我认为程序员可能假设用户和UID之间的关系1:1,因此,与我为userdel描述的类似的其他程序很可能会产生意想不到的后果。


我认为共享组ID并不常见,因为有多个用户属于一个组。有细微的差别。关键确实在于UID处理。不过,我会测试一下删除的好处。

2

顺便说一句-这个问题/答案已针对当今的操作系统进行了更新。

引用redhat:管理唯一的UID和GID号分配,它描述了UID和GID的用法及其管理以及生成器(ID服务器)的方式

必须生成随机的UID和GID值,并同时确保副本永远不会生成相同的UID或GID值。如果单个组织具有多个不同的域,则甚至需要跨IdM域使用唯一的UID和GID号。

同样,允许访问系统的实用程序的行为可能无法预测(相同的参考):

如果为两个条目分配了相同的ID号,则在搜索该编号时仅返回第一个条目。

问题是当“第一”的概念定义不正确时。根据安装的服务,用户名可能会保留在可变大小的哈希中,该哈希会根据不一致的因素返回不同的用户名。(我知道这是真的,因为我有时尝试使用2个带有一个ID的用户名,一个是本地用户名,另一个是domain.username,我想要映射到UID(我最终在(一种完全不同的方式),但我可以使用“ usera”登录,执行“ who”或“ id”并随机查看“ userb”或“ usera”。

有一个接口可以从一个组中检索多个UID值(具有单个GID的组被设计为与多个UID关联),但是没有可移植的接口返回一个UID的名称列表,因此任何期望相同的人或系统之间甚至同一系统上的应用程序之间的类似行为可能会令人惊讶。

在Sun(现在是oracle)的yp(yellowpages)或NIS(NetworkInformationServices)中,也有很多引用涉及唯一性要求。设置特殊功能和服务器以在多个服务器和域之间分配唯一 ID(例如uid_allocd,gid_allocd-UID和GID分配器守护程序手册页

可能要检查的第三个来源是Microsoft的NFS帐户映射的服务器文档。NFS是unix文件共享协议,它们描述了ID如何维护文件权限和访问。在那里,他们写道:

  • UID。这是UNIX操作系统用于标识用户的无符号整数,并且在passwd文件中必须是唯一的。

  • GID。这是UNIX内核用来标识组的无符号整数,并且在组文件中必须是唯一的。MS-NFS管理页面

尽管某些操作系统可能允许使用多个名称/ UID(也许是BSD派生?),但大多数操作系统都依赖于此唯一性,而在不允许时,它们的行为可能无法预测。

注意-我正在添加此页面,因为有人将这个过时的条目称为对现代实用程序的支持,以适应非唯一UID / GID的...大多数情况并非如此。


1

我也不知道这是一个好主意,但是我在一些地方使用了上述行为。通常,它是用于访问ftp / sftp服务器和更新网站内容的帐户。它似乎并没有破坏任何东西,而且似乎比使用多个帐户更容易处理权限。


0

只是由于使用具有相同UID的多个帐户而遇到了一个(相当晦涩的)问题,并认为我将其分享为一个为什么这不是好习惯的示例。

在我的情况下,供应商在RHEL 7上设置了Informix数据库服务器和Web应用程序服务器。在设置过程中,创建了多个UID为0的“根”帐户(不要问我为什么)。即,“ root”,“ user1”和“ user2”都具有UID 0。

后来,使用winbind将RHEL 7服务器加入了Active Directory域。此时,Informix DB服务器将无法启动。运行oninit失败,并显示一条错误消息"Must be a DBSA to run this program"

这是我们在进行故障排除时发现的:

  1. 在加入Active Directory的系统上运行id rootgetent passwd 0(将UID 0解析为用户名)将随机返回“ user1”或“ user2”,而不是“ root”。

  2. Informix显然是依靠字符串比较来检查启动它的用户的文本用户名是否为“ root”,否则将失败。

  3. 如果没有winbind的,id root并且getent passwd 0将始终返回“根”作为用户名。

解决方法是禁用以下方面的缓存和持久性/etc/nscd.conf

enable-cache    passwd      no
persistent      passwd      no

进行此更改之后,UID 0再次一致地解析为“ root”,并且Informix可以启动。

希望这对某人有用。


我有一种感觉,即当UID是16位数字并仅用作登录计算机的一种方式时,这是行得通的,甚至还没有完全“皱眉”。同样,我觉得这种情况随着UUID和GUID的引入而开始改变,UUID和GUID是以这种大小专门创建的128位/数字,这使得两个不同的用户最终拥有相同的ID的可能性很小。这是为了跟踪,计费和许可。随着政府对技术的控制越来越多,对唯一ID的要求也越来越高。需要去除匿名性。不,我不是偏执,真的!; ^ /
Astara
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.