该/etc/sudoers
文件列出了哪些用户可以使用该sudo
命令执行哪些操作
root 用户创建并修改该/etc/sudoers
文件。
这个概念对我来说很难理解。
如果所有具有 sudo 权限的用户都属于sudoers
该组,那么通过发出该命令,所有用户都可以成为 root sudo su
。
那么谁是真正的root用户,他是如何控制sudoers组用户的权限的呢?
请给我解释一下。
答案1
内容提要:“root”是管理员帐户的实际名称。 “sudo”是一个允许普通用户执行管理任务的命令。 “Sudo”不是用户。
长答案:
“root”(又名“超级用户”)是系统管理员帐户的名称。这个名字的起源有点古老,但这并不重要。
Root 用户的用户 ID 为 0,名义上拥有无限的权限。 root 可以访问任何文件、运行任何程序、执行任何系统调用以及修改任何设置。 (但见下文1)。
在“sudo”命令发明之前,如果您想执行管理任务,您必须以 root 身份登录,要么通过某种方式获得登录提示²,要么使用命令su
(“su”是替代用户的缩写。)³
这有点麻烦,而且也不允许您授予用户部分管理权限。于是“sudo”命令(“substitute user do”的缩写)就被发明了。
只要您的用户 ID 位于 sudoers 文件中,“sudo”命令就可以让您以超级用户权限执行命令,从而为您提供必要的授权。
因此,egsudo vi /etc/hosts
将允许您编辑主机文件,就像您以 root 身份运行一样。您甚至不需要 root 密码,只需要您自己的登录密码。
当然,sudo su
会让你简单地成为root。结果与以 root 身份登录或执行命令相同su
,只是您不需要知道 root 密码,但需要位于 sudoers 文件中。
sudoers 文件确定谁可以使用 sudo 命令以及他们可以用它做什么。
sudoers 文件为您提供了多个管理员⁴。实际上,您的管理员是 root,加上 sudoers 文件中列出的每个人。如果没有 sudoers 文件,唯一的管理员就是 root。
事实上,在其他人为您管理计算机的组织中,不知道自己计算机的 root 密码是很常见的 — 只要您位于 sudoers 文件中,就没有关系。
我工作过的一家公司拥有庞大的服务器群,只有极少数人知道 root 密码。相反,有一个数据库记录了谁可以在哪些服务器上工作。自动化过程会将您添加到您有权访问的服务器的 sudoers 文件中,并在您的授权过期时将您删除。
1 还有一件事:现代 Unix 版本现在甚至可以限制 root 用户可以执行的操作。
在下面SELinux(安全增强型 Linux),实际上有一个访问控制列表来确定哪个程序可以做什么,甚至 root 也无法超越这些限制。
在苹果的下系统完整性保护(SIP)(又名“无根”)系统,某些文件和目录被锁定,以便只有相应白名单上的应用程序才能访问它们。
这些系统的存在是为了保护系统免受恶意用户设法获得根访问权限的情况的影响。 (或者在某些情况下,为了防止用户越狱其嵌入式设备。)出于显而易见的原因,即使具有 root 访问权限,也很难绕过这些限制。
² “login:”提示符是 Unix 历史的另一个古老部分,可以追溯到我们在串行线路上使用 ascii 终端而不是窗口系统的时候。您仍然可以通过简单地login
在任何终端窗口中键入内容或从其他地方打开到计算机的 ssh(或 telnet 或 rsh)连接来获得“登录:”提示。如果需要,您可以从那里以其他用户身份登录。 (如果您的计算机恰好有串行端口,您仍然可以将其配置为允许登录。)
³ 也可以为单个程序授予 root 访问权限。这些程序可以执行具有 root 访问权限的用户可以执行的任何操作,即使由普通用户运行也是如此。这些通常仅限于特定任务。例如,定时任务程序具有 root 权限,因此可以编辑 cron 表。显然,“sudo”具有root权限,因此它可以做它所做的事情。
⁴ 我将再谈一谈我之前忽略的一点。我一直交替使用“管理员”和“root”,但还有其他类型的管理员。这些通常称为“角色帐户”,也就是说这些帐户不属于实际人类,而是为了在系统上执行某些特定角色而存在。如果您查看/etc/passwd
系统上的文件,您会发现数十个此类帐户。
例如,如果您的系统上安装了 mysql,则将有一个“mysql”用户,并且所有数据库文件、配置文件等都将归该用户所有。只有该用户(当然还有 root)才有访问文件和运行 mysql 服务器所需的权限。从某种意义上说,该用户将是管理员帐户,但仅限于 mysql。
如果您需要执行数据库管理任务,您可以使用该su mysql
命令成为“mysql”,或者使用sudo
sudoers 文件为您提供这些特定命令的 mysql 权限。