Answers:
用户帐户由真实用户使用,服务帐户由系统服务(例如Web服务器,邮件传输代理,数据库等)使用。按照惯例,并且只有按照惯例,服务帐户的用户ID范围较小,例如<1000左右。除了UID 0,服务帐户没有任何特殊特权。服务帐户可能而且通常确实拥有特定资源,甚至包括设备专用文件,但它们没有类似于超级用户的特权。
可以像普通用户帐户一样创建服务帐户(例如,使用 useradd
)。但是,服务帐户通常是由软件包管理器在安装服务软件时创建和配置的。因此,即使作为管理员,您也应该很少直接关注服务帐户的创建。
有充分的理由:与用户帐户相反,服务帐户通常没有“适当的”登录外壳,即,它们具有/usr/sbin/nologin
登录外壳(或以前的状态/bin/false
)。此外,服务帐户通常是锁定的,即无法登录(对于传统帐户/etc/passwd
,/etc/shadow
这可以通过将密码哈希设置为任意值(例如*
或x
)来实现)。这是为了加强服务帐户以防滥用(纵深防御)。
为每项服务拥有单独的服务帐户有两个主要目的:这是一种安全措施,可减少因一项服务而引起的事件影响(隔离),并且由于可以更轻松地查找哪些资源属于哪个服务而简化了管理。 。请参见本或本有关更多详细信息相关的问题的答案。
最初,用户的意图是与使用该系统的人相对应,因此得名。每个进程都以特定用户身份运行,并且每个文件都由特定用户拥有。特殊用户(称为root)用于不属于任何特定人类用户的事物,即操作系统本身。由于root对应于操作系统本身,因此它具有所有特权。
很快,人们发现创建多个系统用户很方便,而无需广泛的特权。这样可以隔离运行在计算机上的各种服务,以使它们不会踩在彼此的脚趾上。服务帐户(或“系统帐户”,这两个术语是同义词)是与系统上运行的服务相对应的名称,而不是与使用系统的用户相对应的名称。通常,您对系统上运行的每个任务都有一个服务帐户,该帐户具有自己的一组特权(例如,自己的文件,自己的网络端口等)。
没有人与系统/服务帐户的正式定义。内核不在乎(除了向UID 0的用户授予很多特权之外)。大多数管理命令也不在乎。一些典型的区别是:
/bin/sh
或/bin/bash
或/bin/csh
一些系统的用户有一个外壳(几乎总是/bin/sh
),其他人不这样做,这取决于它们是如何打算使用(例如su foo
,需要foo
有一个壳)。/etc/passwd
但位于其他文件中,例如/etc/shadow
。/home
(或某些特定于站点的位置)下,而系统用户的主目录通常不在/home
且可能不存在(但有例外)。在跨多台计算机共享帐户的站点上,通常会有一个中央服务器,其中包含可通过NIS或LDAP访问的用户列表。中的passwd
条目/etc/nsswitch.conf
指定在哪里可以找到用户信息。在整个/etc/passwd
网络范围的数据库中,本地用户和实际用户通常具有系统用户,但是有时在整个网络范围的数据库中存在系统用户(以执行一致的UID,从而促进服务器和数据复制),有时本地文件中的人工用户(即使在网络连接中断时也允许他们登录)。
伪装成系统用户的人类可访问帐户通常不具有真实姓名,而是具有登录外壳以及密码集或SSH密钥,而用户ID在系统范围内。实际上,最好使用一个实际的系统帐户来伪装,将其删除会导致某些服务停止工作。但是您没有任何严格的规则来检测潜在的攻击:根据定义,攻击者不会遵循规则。
服务帐户和人员帐户由相同的命令管理,并记录在相同的文件中。帐户创建命令可能具有用于为人工用户和服务用户设置合理的默认值的选项,例如,选择适当范围内的用户ID,并提示输入人工密码并禁用对服务的密码验证。例如,adduser
vs adduser --system
或useradd
vs useradd -r
在Linux上。
init
,systemd
或相似,其以root身份运行,迅速降级到服务帐户,以限制风险。根据所使用的操作系统,与普通帐户相比,可以向应用程序帐户授予更多特权,例如,绑定特权TCP端口的权限,或者与普通用户相比,特权降低了,例如拒绝服务进程以授予特权。致电fork
/ exec
。在这种情况下,无需将服务降级到服务帐户,可以从中启动。/bin/false
),普通用户就无法使用它,即无法本地或远程登录(例如通过ssh
)使用帐户名。像大多数限制一样,使用root帐户还是sudo
可以克服它。