为什么会有很多帐户?我是唯一的用户


13

我正在运行Ubuntu 12.04桌面系统。到目前为止,我只安装了一些程序(我具有sudo权限)。

  1. 当我检查系统上的用户列表时,会看到很长的列表,例如超过20个用户-这些用户是何时创建的(例如,守护程序,sys,sync,游戏,pulse等)?这些与新程序的安装有何关系?

  2. 如果我在系统上运行程序,则该程序应与UID一起运行。但是在执行ps时,我看到许多其他程序以不同的UID运行(例如root,daemon,avahi,syslog,colored等)-这些程序是如何以不同的UID启动的?


3
换种方式思考:计算机首次启动时,您尚未登录,并且程序必须以某人身份运行。它们都可以以root用户身份运行,但这并不安全,因为这些程序中的大多数仅负责计算机操作的一小部分。登录后,大多数直接运行的程序将随您运行。
dimo414

最终,这是一个hack。广泛使用的一种,但仍然是骇客。UNIX发行版滥用“用户”概念来解决旧的不完整的安全模型。
Federico Poloni 2015年

Answers:


24

用户帐户不仅用于实际的人类用户,还用于运行系统服务,有时还用作系统文件的所有者。这样做是因为人力资源(流程,文件等)之间的分隔与系统服务资源之间的分隔在幕后需要相同的机制。

您通常运行的程序使用您的用户ID运行。只有系统守护程序以自己的帐户运行。指示何时运行守护程序的配置文件也指示应该由哪个用户运行它,或者守护程序启动后切换到非特权帐户。一些守护程序需要完全的管理特权,因此它们在root帐户下运行。许多守护程序仅需要访问特定的硬件设备或特定的文件,因此它们以专用的用户帐户运行。这样做是出于安全考虑:这样,即使其中一项服务中存在错误或配置错误,也不会导致全面的系统攻击,因为攻击者将受限于该服务可以做的事情,而且不会能够覆盖文件,监视进程等

在Ubuntu下,系统安装时会创建0-99范围内的用户ID。0是根;1–99范围内的许多设备仅出于历史原因存在,并且仅出于与使用它们的本地安装的向后兼容性的考虑而保留(一些额外的条目不会有任何损害)。当安装或删除需要专用用户ID的服务时,将动态创建和删除100-999范围内的用户ID。从1000开始的范围适用于人类用户或系统管理员创建的任何其他帐户。团体也是如此。


7

我想您可以通过检查找到此用户列表/etc/passwd?这是完全正常的-“用户”用于携带一组权限,不仅可以锁定“实际用户”,还可以锁定程序到系统的某些区域并跟踪他们的更改(与组相同的概念)。

我在下面插入了我的Raspberry Pi /etc/passwd文件之一,以供您参考;您会ntop在该文件的底部注意到用户,该文件是由程序创建的ntop(网络监控)。同样sshdgnats错误报告等。

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
pi:x:1000:1000:,,,:/home/pi:/bin/bash
sshd:x:101:65534::/var/run/sshd:/usr/sbin/nologin
ntp:x:102:104::/home/ntp:/bin/false
statd:x:103:65534::/var/lib/nfs:/bin/false
messagebus:x:104:106::/var/run/dbus:/bin/false
usbmux:x:105:46:usbmux daemon,,,:/home/usbmux:/bin/false
lightdm:x:106:109:Light Display Manager:/var/lib/lightdm:/bin/false
smmta:x:107:110:Mail Transfer Agent,,,:/var/lib/sendmail:/bin/false
smmsp:x:108:111:Mail Submission Program,,,:/var/lib/sendmail:/bin/false
Debian-exim:x:109:113::/var/spool/exim4:/bin/false
ntop:x:110:115::/var/lib/ntop:/bin/false

当我在ubuntu上安装新程序时,它会创建一个新用户吗?如果不是,那么为什么有那么多程序以不同于我的UID运行?我的意思是这些程序如何与diff UID一起运行?
2015年

dpkg --get-selections | grep -v deinstall如果愿意,您可以运行它并将其与用户的/ etc / passwd文件列表进行比较。至于您的问题:“ ...这些程序如何与diff UID一起运行”,您可以自己尝试。编写一个test_file包含无害(echo "Test")的随机bash脚本。然后sudo chmod 755 test_file(任何人都可以读取和执行,并且所有者可以读取,写入和执行),然后sudo chown nobody将其分配给用户nobody。然后运行它。“程序” test_file随UID一起运行nobody
toxefa

2
@ py4on不太...从具有nobodyUID 的文件运行,但是与您的UID一起运行;您需要使其成为一个SUID文件来执行此操作,但是如果使用解释程序运行该文件,则会删除SUID位。
Riking

好的,因为我无法编辑上面的评论,但是该dpkg位仍然有用(希望如此),请忽略有关以您自己的身份运行的部分!要么使用SUID要么以其他用户身份登录
才有

3

这些用户是何时创建的?

在您提到的情况下,它们是在系统安装时创建的。这些用户帐户是常规帐户,有些可以追溯到几十年前。它们也是标准化的。Linux标准库将它们分为:

  • 所需标准用户帐户,rootbin,和daemon; 和
  • 可选的标准用户帐户admlpsyncshutdownhaltmailnewsuucpoperatorman,和nobody

此处提到的其他用户帐户- ,pulseavahicolordDebian-exim(挑选一个从py4on的密码文件) -把我们带到你的下一个问题。

这些与新程序的安装有何关系?

在安装和清除这些软件包时,非标准用户帐户由各种软件包的“维护者脚本”创建和销毁。用户帐户将由软件包的所谓postinst维护者脚本创建,该脚本将运行getent以查看该用户帐户是否已经存在,是否存在useradd。从理论上讲,它将被软件包的所谓的postrm维护者脚本running 删除userdel

实际上,不会删除软件包的用户帐户。Fedora Wiki(qv)解释说这很困难。请参见Debian错误#646175,以获取有关此基本原理的示例,在该示例中,决定清除软件包后根本删除rabbitmq用户帐户,以解决继续在该帐户的支持下运行的dæmon问题。

这些程序如何以不同的UID开始的?

在Unix和Linux下,在超级用户的支持下运行的进程可以将其用户帐户更改为其他用户,然后继续运行同一程序,但是不允许相反。(必须使用set-UID机制。)

守护程序管理系统以超级用户身份运行。其配置数据指定特定守护程序在特定用户帐户的支持下运行:

  • 在System 5中rc,脚本中/etc/init.d使用了诸如start-stop-daemonand及其--chuid选项之类的辅助工具。
  • 随着daemontools的家庭服务经理,该run脚本调用setuidgids6-setuidgidchpst,或runuid与用户帐户名。在/unix//a/179798/5132中有设置nagios用户帐户的示例。
  • 对于新贵,setuid作业文件中有一个节,用于指定用户帐户。这不是特别细的,有时有人想要在/superuser//a/723333/38062上描述的内容。
  • 使用systemd User=时,服务单元文件中有一个设置,用于指定用户帐户。

当守护程序管理系统生成一个进程作为守护程序时,这些机制会放弃超级用户特权,以便守护进程继续在未特权用户帐户的支持下运行。

有一个相当长的解释,为什么用这种方式进行良好的恶魔管理。但是你没有问为什么。仅在何时,如何以及从何而来。therefore因此,一个非常简短的准则:

Unix和Linux操作系统将在不同用户帐户的主持下运行的进程彼此隔离。从历史上看,如果一个人能够接管以超级用户身份运行的守护程序,那么任何人都可以做自己喜欢的事情。另一方面,在非特权帐户的主持下运行的守护程序只能访问该非特权帐户可以访问的文件,目录,设备和进程。因此,一个互不信任的demon程序系统都在不同用户帐户的支持下运行,并且无法访问/控制彼此(内部,受信任的)文件/目录/进程/设备,因此很难破解。

进一步阅读


1

在Linux上,当我们安装服务时,它会创建一个具有其服务名称或类似名称的用户,以便它无法访问其他文件。


1
这是一个约定,但完全不是必需的,当然也不是普遍的。实际上,它真的不再那么普遍了……
HalosGhost

1
@HalosGhost嗯?不,这是一个非常普遍的约定,仍然很有效。这个答案是不完整的,但完全正确。
吉尔斯(Gilles)'所以

1
@Gilles,我没有说(或暗示)它是不正确的。但这大多已经过时了。如今(随着systemd的出现),大部分服务只是服务文件。现在,这并不是说每个服务的用户帐户都不再存在。他们肯定会。但是,例如,在我的整个系统上只有24个帐户,在那里我可以提供更多的服务。
HalosGhost

@Gilles我的情况与HalosGhost相同-服务多于帐户。那么这是否意味着它们都以root用户身份运行?
lonix
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.