我正在运行 Ubuntu 12.04 桌面系统。到目前为止我只安装了一些程序(我有 sudo 权限)。
当我检查系统上的用户列表时,我看到一个很长的列表,比如超过 20 个用户 - 这些用户是什么时候创建的(例如 daemon、sys、sync、games、pulse 等)?这些与正在安装的新程序有何关系?
如果我在我的系统上运行一个程序,它应该使用我的 UID 运行。但在做一个附注,我看到许多其他程序使用不同的 UID 运行(例如 root、daemon、avahi、syslog、colord 等)——这些程序是如何使用不同的 UID 启动的?
答案1
用户帐户不仅用于实际的人类用户,还用于运行系统服务,有时还用作系统文件的所有者。这样做是因为人类用户资源(进程、文件等)之间的分离和系统服务资源之间的分离在幕后需要相同的机制。
您运行的程序通常使用您的用户 ID 运行。只是系统而已守护进程在他们自己的帐户下运行。指示何时运行守护程序的配置文件也指示应运行它的用户,或者守护程序在启动后切换到非特权帐户。一些守护进程需要完全的管理权限,因此它们在根帐户。许多守护进程只需要访问特定的硬件设备或特定的文件,因此它们在专用的用户帐户下运行。这样做是为了安全:这样,即使其中一项服务存在错误或配置错误,也不会导致完整的系统攻击,因为攻击者将仅限于该服务可以执行的操作,而不会执行该服务的操作。能够覆盖文件、监视进程等。
在 Ubuntu 下,0-99 范围内的用户 ID 是在系统安装时创建的。 0 为根; 1-99 范围内的许多项仅出于历史原因而存在,并且保留只是为了向后兼容某些使用它们的本地安装(一些额外的条目不会造成影响)。当安装或删除需要专用用户 ID 的服务时,会动态创建和删除 100-999 范围内的用户 ID。 1000 及以上的范围适用于人类用户或系统管理员创建的任何其他帐户。对于团体来说也是如此。
答案2
我想您是通过检查找到此用户列表的/etc/passwd
?这是完全正常的 - “用户”用于携带一组权限,不仅可以锁定“实际用户”,还可以锁定系统某些区域的程序并跟踪他们更改的内容(与组相同的概念)。
我在下面插入了我的 Raspberry Pi 文件之一/etc/passwd
供您参考;您会注意到ntop
该文件底部的用户,由程序ntop
(网络监控)创建。同样sshd
,gnats
错误报告等。
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
答案3
这些用户是什么时候创建的?
在您提到的情况下,它们是在系统安装时创建的。这些用户帐户都是传统的,有些可以追溯到几十年前。它们也是标准化的。 Linux 标准库将它们分为:
- 这必需的标准用户帐户、
root
、bin
和daemon
;和 - 这选修的标准用户帐户
adm
,lp
,sync
,shutdown
,halt
,mail
,news
, ,uucp
,operator
,man
和nobody
此处提到的其他用户帐户 — pulse
、avahi
、colord
和Debian-exim
(从 py4on 的密码文件中选择一个) — 让我们回答您的下一个问题。
这些与正在安装的新程序有何关系?
当安装和清除这些软件包时,非标准用户帐户由各种软件包的“维护者脚本”创建和销毁。用户帐户将由包的所谓postinst
维护者脚本创建,该脚本运行getent
以查看用户帐户是否已存在,useradd
如果不存在。理论上,它会被包的所谓postrm
维护者脚本删除,运行userdel
.
实际上,包的用户帐户不会被删除。 Fedora wiki (qv) 解释说这会充满困难。看Debian 错误 #646175举一个实际行动中的例子,决定不是清除程序包时删除rabbitmq
用户帐户,解决在该帐户的支持下继续运行的守护进程的问题。
这些程序是如何使用不同的 UID 启动的?
在 Unix 和 Linux 下,在超级用户支持下运行的进程可以将其用户帐户更改为其他帐户并继续运行相同的程序,但反之则不允许。 (必须使用 set-UID 机制。)
守护进程管理系统以超级用户身份运行。其配置数据指定特定守护进程在特定用户帐户的支持下运行:
- 在 System 5 中
rc
,脚本/etc/init.d
使用辅助工具,例如start-stop-daemon
及其--chuid
选项。 - 使用 daemontools 系列服务管理器,脚本可以使用用户帐户名
run
调用setuidgid
、s6-setuidgid
、chpst
或。runuid
有这样的例子https://unix.stackexchange.com/a/179798/5132设置nagios
用户帐户。 setuid
对于 upstart,作业文件中有一个节,用于指定用户帐户。这不是特别细粒度,有时人们想要的是所描述的内容https://superuser.com/a/723333/38062。- 对于 systemd,服务单元文件中有一个
User=
设置,用于指定用户帐户。
当守护进程管理系统生成一个进程作为守护进程时,这些机制删除超级用户权限以便守护进程继续在非特权用户帐户的支持下运行。
有一个相当长的解释为什么良好的守护进程管理就是通过这种方式完成的。但你没有问为什么;只有何时、如何以及从何而来。 ☺ 因此,这是一个非常简短的概要:
Unix 和 Linux 操作系统将不同用户帐户下运行的进程相互隔离。从历史上看,如果一个人能够接管一个以超级用户身份运行的守护进程,那么他就可以做任何他喜欢做的事情。另一方面,在非特权帐户的支持下运行的守护进程只能访问该非特权帐户可以访问的文件、目录、设备和进程。一个系统相互不信任的守护程序所有这些都在不同用户帐户的支持下运行,并且无法访问/控制彼此的(内部、可信)文件/目录/进程/设备,因此,破解起来要困难得多。
进一步阅读
- 乔纳森·德博因·波拉德 (2014)。并排查看运行脚本和服务单元。。常见答案。
- 维护者脚本中的帐户处理。 Debian 维基。
- 打包:用户和组。 Fedora 项目维基。
- “第 15 章. 用户和组”。 Linux 标准基本规范 2.1。 2004 年。自由标准组织。
- “9.2 用户和组”。Debian 政策手册. 2014-11-22. Debian 政策邮件列表。
- “37.3. 标准用户”。 RHEL 部署指南。第 11 版。 2013。红帽。
- 用户和组。拱门维基。
- 卡罗尔·赫维茨和斯科特·麦克皮克 (2001-02-12)。 废除根守护进程!。 DOI 10.1.1.120.3567。
答案4
在 Linux 上,当我们安装服务时,它会创建一个具有其服务名称或类似名称的用户,以便它无法访问其他文件。