Jak*_*ake 16 process users software-installation accounts
我正在运行 Ubuntu 12.04 桌面系统。到目前为止,我只安装了一些程序(我有 sudo 权限)。
当我查看系统上的用户列表时,我看到一个很长的列表,比如超过 20 个用户——这些用户是什么时候创建的(例如 daemon、sys、sync、games、pulse 等)?这些与正在安装的新程序有什么关系?
如果我在我的系统上运行一个程序,它应该使用我的 UID 运行。但是在执行ps 时,我看到许多其他程序以不同的 UID 运行(如 root、daemon、avahi、syslog、colord 等)——这些程序是如何以不同的 UID 启动的?
Gil*_*il' 28
用户帐户不仅用于实际的人类用户,还用于运行系统服务,有时还用作系统文件的所有者。这样做是因为人类用户资源(进程、文件等)之间的分离和系统服务资源之间的分离在幕后需要相同的机制。
您通常使用您的用户 ID 运行的程序。只有在他们自己的帐户下运行的系统守护进程。指示何时运行守护程序的配置文件也指示应由哪个用户运行它,或者守护程序在启动后切换到非特权帐户。一些守护进程需要完全的管理权限,因此它们在root帐户下运行。许多守护进程只需要访问特定硬件设备或特定文件,因此它们在专用用户帐户下运行。这样做是为了安全:这样,即使这些服务之一存在错误或配置错误,也不会导致完整的系统攻击,因为攻击者将仅限于该服务可以做什么和不会做什么能够覆盖文件,监视进程等。
在 Ubuntu 下,0-99 范围内的用户 ID 在系统安装时创建。0 是根;1-99 范围内的许多项仅出于历史原因而存在,并且只是为了与使用它们的某些本地安装向后兼容而保留(一些额外的条目不会造成伤害)。安装或删除需要专用用户 ID 的服务时,会动态创建和删除 100-999 范围内的用户 ID。从 1000 开始的范围适用于人类用户或系统管理员创建的任何其他帐户。团体也是如此。
我想你是通过检查来找到这个用户列表的/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
Run Code Online (Sandbox Code Playgroud)
这些用户是什么时候创建的?
在您提到的情况下,它们是在系统安装时创建的。这些用户帐户是传统的,有些可以追溯到几十年前。它们也是标准化的。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 机制。)
守护进程管理系统以超级用户身份运行。它的配置数据指定特定的守护进程在特定用户帐户的支持下运行:
rc,脚本/etc/init.d使用了一个辅助工具,例如start-stop-daemon及其--chuid选项。run脚本调用setuidgid,s6-setuidgid,chpst,或runuid与用户帐户名。https://unix.stackexchange.com/a/179798/5132 中有设置nagios用户帐户的示例。setuid作业文件中有一个节,用于指定用户帐户。这不是特别细粒度,有时人们想要https://superuser.com/a/723333/38062 中描述的内容。User=,服务单元文件中有一个设置,用于指定用户帐户。当守护进程管理系统产生一个进程作为守护进程时,这些机制会放弃超级用户权限,以便守护进程继续在非特权用户帐户的支持下运行。
为什么以这种方式完成良好的守护进程管理有一个相当冗长的解释。但你没有问为什么;只有何时、如何以及从何而来。☺ 一个非常简短的概要,因此:
Unix 和 Linux 操作系统将在不同用户帐户下运行的进程相互隔离。从历史上看,如果一个人能够接管一个以超级用户身份运行的守护进程,那么一个人就可以做任何自己喜欢的事情。另一方面,在非特权帐户的支持下运行的守护进程只能访问该非特权帐户可以访问的文件、目录、设备和进程。因此,一个相互不信任的守护程序系统都在不同用户帐户的支持下运行,并且无法访问/控制彼此的(内部的、受信任的)文件/目录/进程/设备,因此更难破解。