如何不成为根用户?管理员是根用户吗?

我在我的PC上安装了Ubuntu。要登录,我使用我在安装过程中创建的用户名和密码。这是否意味着我是一个root用户?如果是的话,那么我如何变成非root用户?看起来非root用户比管理员用户更安全。

9你把_root_和_administrator_混淆了,它们是两个不同的东西。 - fitojb
相关链接:RootSudo(在Ubuntu维基上) - Eliah Kagan
Windows 7并没有清楚地表明这个区别,这真的让我很困扰和困惑。在Windows中,以root身份运行的等效方式是“以管理员身份运行”。但当然,如果你已经以管理员身份登录,根据定义,你已经以管理员身份运行所有东西了。真是一个非常糟糕的术语选择。 - Kris Harper
@KrisHarper 根据定义(甚至是事实)并不要求用户必须以自己的身份运行程序。在Ubuntu中,管理员(非root用户)可以使用sudo以root身份运行程序。更一般地说,管理员(或其他经授权的用户)X可以使用sudo -u Y command...以Y的身份运行command...。在Windows Vista及更高版本中,启用UAC后,具有管理员权限的用户在没有这些权限的情况下运行程序,除非他们明确授权一个程序继承他们的权限。当UAC开启时(或对于受限制的用户),会出现“以管理员身份运行”的选项。 - Eliah Kagan
@EliahKagan 当然,您是正确的。在底层,用户被分配了一个低级安全令牌,并且可以在需要时请求更高级别的令牌。不过,我从用户体验的角度来讲话语义上说的。如果我管理一台计算机并正在使用它,那么我实际上是以管理员身份运行程序。我的观点是,这是一个糟糕的术语选择,因为它打破了物理管理员(我自己)和数字管理员(特定用户帐户)之间的抽象。即使技术熟练的人会理解发生了什么,但我认为这是糟糕的用户体验。 - Kris Harper
5个回答

你是一个管理员,但不是rootroot用户可以做任何事情。管理员可以root的身份执行操作,但通常管理员所做的事情并非由root完成。这样,您对自己的系统拥有完全控制权,但只有在您选择使用它时才能使用。

当您尝试以root身份进行操作时,Ubuntu会要求您输入密码,以确保确实是您本人。

用户帐户:人类和其他

真正的人类用户拥有代表他们的用户帐户。您在安装Ubuntu时创建了一个此类帐户。但并非所有用户帐户都代表真正的人类用户。

真正的人类用户通过其用户帐户被授予(和否决)权限。他们必须使用自己的用户帐户来使用系统;因此,他们的用户帐户的能力和限制适用于他们。

用户账户还用于编码一组能力和限制。一些用户账户(实际上是大多数,除非您有很多人类用户使用该机器)存在的目的是为了以其身份运行某些程序或命令,这个身份具有适合工作的正确能力和限制。
例如,www-data用户存在的目的是,如果您运行一个Web服务器,它拥有服务器可访问的数据。没有真正的人类用户需要被授权对这些数据进行未经检查的更改,而且Web服务器也不需要被授权执行任何与提供Web服务无关的操作。因此,无论是Web数据还是系统的其他部分都比如果由某个具有Web服务器所有权限的人类用户来运行Web服务器(并且Web服务器将具备该用户的权限)更安全,可以防止意外或故意破坏。

最重要的非人类用户账户

超级用户,其用户名为root,是一个具有非常特定能力和限制组合的非人类用户账户:所有能力,没有限制

root的权限几乎无所不能。但仍有一些事情,由于系统本身无法执行或理解,root也无法做到。因此,root无法杀掉处于不可打断休眠状态的进程,也无法让一个重得无法移动的岩石移动

很多重要的系统进程,比如init,都以root身份运行,并且root用于执行管理员任务。

我能使用root账户登录吗?

可以配置root账户以便使用密码登录,但在Ubuntu中默认情况下不启用该功能。相反,您可以将root视为类似于www-datalpnobody和其他非人用户账户。(运行cat /etc/passwdgetent passwd来查看全部账户。)

人类用户使用自己的用户账户登录,然后如果要执行某个任务需要使用另一个用户账户,他们会通过以该身份执行该任务的方式来实现,而不是真正以那个用户登录。

可以配置其他非人类用户,如www-data,以便也可以登录为它们。虽然这种情况相当罕见,但在其他一些类Unix操作系统中,在终端中以root身份登录是很常见的。将整个图形界面作为root运行的风险,加上许多图形程序并不设计为以root身份运行且可能无法正常工作,意味着您永远不应尝试获取一个由root拥有的桌面会话

请注意,在Ubuntu中,默认情况下禁用了以root身份登录,但有办法在不作为root进行身份验证的情况下获取root shell,从而产生类似的效果:最常见的方法是sudo -s-i恢复模式类似的技术。(如果你不知道这些东西,不要担心。)这实际上并不是登录:在恢复模式下,您会在任何登录之前成为root;而使用基于sudo的方法,您只是以root身份运行一个shell。

管理员

在Ubuntu中,管理员是那些可以在选择时以root身份做任何他们想做的事情的用户。

系统设置,显示包括管理员账户在内的人类用户账户。
系统设置 > 用户账户。"Eliah Kagan" 是一个管理员,所以他可以像 root 一样做一些事情,但他并不是 root

我是我的Ubuntu系统上的管理员。当我运行程序时,通常它们会以 ek 运行("Eliah Kagan" 是与 ek 用户名对应的全名)。

当我运行AbiWord或LibreOffice时,它以 ek 运行。当我运行Firefox、Chromium、Empathy或Pidgin时,它以 ek 运行。提供桌面界面的程序以 ek 运行。

然而,我是一个管理员,所以如果我需要执行管理任务,我可以这样做。

sudo

在命令行上,通常我会使用sudo来以root身份运行命令:
sudo command...

这将提示我输入我的密码。(不是root的密码;root没有密码。)
- 因为我是管理员,所以可以以root的身份执行操作。在默认配置中,我必须输入我的密码才能做到这一点。 - 非管理员用户无法以root的身份执行操作,即使他们输入了密码也不行。如果运行sudo命令的用户不是管理员,则会失败。 - 由于管理员除了能够以root的身份执行操作之外,其实是完全普通的用户,因此运行需要root权限的命令仍然会失败,除非以root身份运行该命令。

演示需要使用sudo的截图:只有通过以root身份运行某些命令,管理员才能成功执行这些命令。通常情况下,可以在命令前加上sudo(和一个空格)来实现此目的。
演示需要使用sudo来执行管理任务的必要性。(基于"Sandwich" by Randall Munroe。)

以图形方式使用sudo

图形程序可以通过图形界面的sudo前端root身份运行,例如gksu/gksudokdesudo。例如,要以root身份运行GParted,我可以运行gksudo gparted。然后我会以图形方式提示输入密码。

gksudo graphical password prompt

由于我是以图形方式提示的,所以不需要终端。这是管理员工具以root身份运行的一种方式之一。

Polkit

Polkit(曾被称为PolicyKit)是管理员以root身份执行操作的另一种方式。程序访问执行该操作的服务。有时,操作是运行整个程序;有时,操作更加有限。

现在,许多图形化系统管理实用程序默认使用polkit,而不是使用sudo

一个例子就是软件中心。它充分利用polkit,在用户想要执行需要root权限的操作时,只需要输入密码。(使用基于sudo的身份验证也可以实现,但更加困难和丑陋。)

在软件中心,我可以找到并阅读关于一个应用程序的信息;然后当我想要安装它时,会要求输入密码。

Authenticating via polkit to install an application in the Ubuntu Software Center.

polkit的不同之处

任何图形化程序都可以使用gksudo和其他图形化sudo前端作为root运行。(根据程序是否设计为以root身份使用,该程序可能无法正常工作。但是启动程序的命令将以root身份执行。)

尽管在Ubuntu上,polkit现在比sudo的图形界面前端更常见,用于在幕后以root身份执行操作的应用程序,但只有当存在允许以root身份运行图形应用程序的配置文件并指示可以执行哪些操作时,polkit才会运行。

Polkit的非图形化使用

pkexec是用于使用polkit运行程序的命令。

sudo一样,pkexec可以运行非图形化命令。(而且它不需要一个定义命令能力的配置文件--它只是以root身份运行该命令。)
pkexec command...

pkexec即使从终端运行,也会以图形方式提示输入密码(这是它的行为更类似于gksudo而不是直接运行sudo的一种方式)。

(如果没有图形界面--例如,如果您从虚拟控制台或纯文本SSH会话登录,或者图形界面无法正常工作--那么pkexec将会优雅地降级并在命令行提示输入密码。)

Running a command in a terminal with pkexec.

一旦成功进行身份验证,命令将在终端中运行。

A command runs seamlessly as <code>root</code> after successfully polkit authentication.

以除了root之外的其他用户身份运行命令

root是特殊的,因为它可以执行任何操作。但它只是一个普通的用户账户,使用sudo(直接或通过图形界面)或polkit以其他用户身份运行命令的方式可以稍作修改:

sudo -u username command...

gksudo -u username command...

pkexec --user username command...

什么?你只是先输入sudo吗?这就是安全性吗?!

使用sudo运行命令有点像调用教皇的无误论

当你sudo运行命令 [调用教皇的无误论]时,Ubuntu会努力确保你是真正的你 [真正的教皇]。

是的,我知道教皇的无误论(即使是规范上的)是陈述性的;这个类比并不完美。

试图使用sudo(或polkit)以root身份做某事是一件大事 - Ubuntu并不会像你运行程序的其他时间那样轻易放过它。

系统会提示你输入密码。(然后,你已经输入密码的事实会在短时间内被记住,这样你在管理系统时就不必不断输入密码了。)

除了提醒你要小心之外,这还可以防止两种情况发生:
1. 有人使用你的电脑(或移动设备),可能是以检查电子邮件或其他类似无害目的为幌子。在这种情况下,他们仍然有可能造成一些损害,例如修改或删除你的文件。但是,他们无法管理系统,因为他们无法输入你的密码。
2. 不应该管理系统的程序,除非你输入密码,否则无法执行此操作。例如,如果你的网络浏览器受到安全漏洞的影响并运行恶意代码,它仍然无法执行管理任务。它无法创建和删除用户,修改以root身份安装的程序(包括由软件包管理器安装的任何内容,如LibreOffice),或者对系统进行深层次的更改。
我听说过su命令,那是什么?我可以使用吗?
su命令用于切换到另一个用户,并运行一个命令(或启动一个交互式shell)。可以限制谁可以使用su命令,但su命令使用目标账户的密码进行身份验证,而不是运行用户的密码。
例如,su 用户名 -c '命令...'会以用户名的身份运行命令...,就像使用sudo -u 用户名 命令...一样。
但是,当您使用sudo用户名的身份运行命令时,您需要输入您的密码。而当您使用su用户名的身份运行命令时,您需要输入用户名的密码
由于su为目标用户执行身份验证,因此您只能以启用了账户的用户身份运行命令。
默认情况下,root账户(如www-datanobody)是禁用的。没有任何密码可以用来作为root登录。因此,您不能使用suroot身份运行命令。
你可以使用su命令以其他用户的身份运行命令,这些用户通常包括你系统上代表人类的所有用户账户。
当以访客身份登录时,你无法使用su命令。
组合使用su和sudo
即使不是管理员,某人也可以使用su命令以管理员身份运行sudo命令。(尽管如此,他们需要管理员密码才能以管理员身份运行命令。)也就是说,有限用户可以使用su命令以root身份运行sudo命令。示例如下:
su username -c 'sudo command...'

(以这种方式运行图形程序需要特别注意。)

使用su作为以root身份运行命令的更安全的方式吗?

可能不是。

如果一个用户不被允许以root身份操作怎么办?

将其设置为受限用户,而不是管理员。

如果一个以管理员身份运行的程序尝试sudoroot怎么办?

除非你重新配置了sudo以允许无需密码成功执行,否则它将失败。

一个不应该以root身份运行的程序能否利用最近的sudo命令,从而无需密码?

这种情况很不可能成功。现在,大多数操作系统(包括Ubuntu)默认配置sudo,使其时间戳仅适用于特定上下文。

例如,如果我在一个终端选项卡中运行sudo ...并成功验证,另一个选项卡中的sudo(或由不相关的GUI程序运行,或者从虚拟控制台或SSH会话中运行)仍然会提示输入密码。即使是紧接着运行也是如此。
一个以用户X身份运行的程序是否可以访问用户X的密码?
不可以。
如果恶意程序能够以管理员身份运行,它不能“监听”管理员在使用sudo或polkit进行身份验证时输入的内容吗?
理论上是可以的。但那样它也可以“监听”输入给su的密码。
如果我告诉别人我的密码——
不要告诉别人你的密码。
如果有人必须知道我的密码才能代表我做某事,但我不想让他们管理系统怎么办?
理想情况下,他们应该有一个单独的用户账户,让他们可以做他们需要做的事情。例如,可以在多个用户之间共享文件,允许多个用户对其进行写入,同时拒绝其他用户的访问。
然而,在允许不太可信任的人共享您的帐户的情况下,应该使用有限用户帐户。您可以为此目的创建一个单独的帐户(这是有道理的 - 如果它是一个用于您和其他人具有不同功能的帐户,那么它应该是一个不同的帐户)。
那么,最安全的做法是禁止使用sudo和su,并要求人们手动以root身份登录吗?
不,因为让人们完全以root身份登录存在严重的缺点。尽可能少地以root身份执行操作是最好的。即使是与管理系统直接相关的大多数操作(例如查看配置的用户和读取日志),通常也不需要root权限。
此外,就像潜在的恶意程序可以监视某人在运行sudo或su时输入的内容,或者创建一个虚假的sudo/su密码提示一样,潜在的恶意程序也可以创建一个虚假的登录界面。
什么使用户成为管理员?

成员群组。

在Ubuntu 12.04及更高版本中, 管理员属于名为sudo的群组。

在Ubuntu 11.10及早期版本中, 管理员属于名为admin的群组。

当一个Ubuntu系统从12.04之前升级到12.04或更高版本时,admin群组会保留以供向后兼容(并继续为其中的用户提供管理权限),但同时也使用了sudo群组。

有限用户账户

我能使用有限用户账户替代管理员账户吗?

如果你愿意,可以。在系统设置 > 用户账户中创建一个有限用户账户,并以该用户登录。

我能将我的管理员账户变成有限用户账户吗?

是的,只需将其从sudoadmin群组中移除(参见上文)。

但是你应该确保至少有另一个管理员帐户,这样你就可以管理你的系统。 如果没有的话,那么你将不得不引导到恢复模式或使用Live CD,并再次将某个用户设置为管理员。(这类似于重新设置丢失的管理员密码。)

用于管理用户和组的图形工具通常会阻止你创建一个没有管理员的系统,或者至少会警告你。而命令行工具通常不会(相信你知道自己在做什么)。


2@EliahKagan-又一个笨蛋 :) 我来做个类比-Root就像是父母,而任何用户就像是孩子。年长的孩子(管理员)拥有更多特权。一个孩子(用户)永远不能成为“父母”(Root)。12岁的孩子可以在房子里(操作系统/Ubuntu)做一些无害的事情,比如使用冰箱等。他不被允许触碰保险柜里的钱。但是,18岁的孩子(管理员)可以通过使用'sudo'或者得到父母的许可来接触那些钱。但是,两者都不被允许触碰另一个保险柜里的枪支。只有root(父母)才能这样做。明白了吗? - FirstName LastName
1@FirstNameLastName 管理员账户代表真实的人类用户,在现实世界中拥有所有权限。管理员可以通过 sudo 和 PolicyKit 来使 "root" 能够执行任何操作。管理员甚至可以启用 "root" 账户并登录。如果你将用户账户抽象为 机械化 和有意识的行为的组合,人类用户既具有机械化行为也具有非人类用户(包括 root)纯粹机械化的行为。如果你理解其工作原理,并且如果这种类比能加强你的理解,那很好!但我认为它并没有真正捕捉到 root-admin 的关系。 - Eliah Kagan
7@FirstNameLastName 对我来说,一个更好的类比是:管理员就像布鲁斯·韦恩(Batman)一样,而root则像蝙蝠侠。两者之间的区别完全是一种构建的身份问题。布鲁斯·韦恩可以随时变身为蝙蝠侠,并且几乎可以做任何事情,但在面具下他始终是布鲁斯·韦恩。然而,蝙蝠侠更接近他真正的自我——布鲁斯·韦恩这个人设只是为了保护他免受成为蝙蝠侠所带来的后果。通过在日常生活中扮演韦恩,他经常能够保护自己和他所爱的人免受自己的错误、系统缺陷以及哥谭市的恶意软件的伤害。 - Eliah Kagan

没有所谓的愚蠢问题 ;)
希望这能稍微澄清一些事情:
在Ubuntu中,可以创建两种不同类型的用户账户:标准账户和管理员账户。两者之间的区别是:标准账户无法通过获取root访问权限对系统进行任何重要更改,而管理员账户可以使用他们的密码作为root用户进行更改。Root用户本身是系统创建的众多用户之一,通常你看不到或注意不到它,并且默认情况下无法以其登录。如果您以管理员类型账户登录,您可以使用终端中的sudo命令成为此Root用户,并且可以输入密码来安装软件、进行系统更改等操作。如果您以标准用户身份登录,则无法执行任何此类操作。

如果管理员只需运行一个命令就能成为root用户,那么其他人/黑客是否可以远程运行此命令并成为root用户? - FirstName LastName
@FirstNameLastName 他们需要已经以其他用户的身份远程登录才能运行 sudo 命令。 - Izkata
@FirstNameLastName 还会要求输入账户名和密码才能获得 root 权限。 - Destrictor
@Destrictor - 是的,确实如此。事实上,这让我感到困惑。我正在使用管理员帐户,并输入管理员密码以登录root。当管理员和root的密码和用户名相同时,为什么还要有两个帐户呢? - FirstName LastName
@FirstNameLastName 使用sudo时需要输入密码的主要原因是为了记录日志。这主要是出于安全考虑(发生了什么事情,你的IT部门正在查明是谁/什么/在哪里)。 - Destrictor
@Destrictor 如果一个人拥有管理员账户并且心怀不轨,他可以使用sudo来做一些恶作剧,并再次使用sudo来修改日志。这可以通过将日志记录到WORM驱动器中来防范。 - emory

在所有的Linux系统中,要对系统进行任何更改,我们需要以root用户的身份进行身份验证,并且为了应用所有更改,我们也需要成为root用户。
普通用户无法对整个系统应用更改。这是Linux与Windows相比的优势。
如果发生任何攻击,那么在Linux/Unix系统中只会影响到被攻击的区域,因为要攻击或修改其他区域需要root权限,但在Windows中,如果一个地方受到攻击,整个系统都会受到影响。
这就是为什么在许多问题中,如果有用户提出不提示root密码的要求,我们会警告他,在安全情况下不建议这样做,并将选择权留给他们。
如果您想成为root用户,可以使用sudo命令帮助您。
sudo -i 

如果您想以root用户身份启动应用程序,您可以使用sudo命令。
sudo <app_name>

最好以非root用户身份运行系统。

在安装过程中创建的账户是一个管理员账户。

在Ubuntu中,root账户没有密码,因此您无法以root用户登录。有一些方法可以绕过这个限制,但这是默认设置。

在Ubuntu中,管理员账户意味着将用户添加到sudo组,从而使该账户有资格使用sudo命令临时获得特权。PolicyKit可以通过提示“管理员”密码来请求权限提升(您需要选择一个管理员用户,并提供该账户的密码)。

要确认这些是否正确:

  • 打开终端并尝试更新软件包索引。使用命令apt-get update进行操作,这个操作必须在root权限下运行。只有当你以root用户登录或者通过特权提升以root身份执行该命令时,它才能工作。管理员可以通过验证sudo机制来运行sudo apt-get update,该机制允许命令以任何用户身份运行。标准用户将无法执行此操作。

  • 从系统设置中打开用户帐户,并尝试添加新用户。该保护机制是PolicyKit。管理员可以进行身份验证和提升权限,但标准用户将被阻止。这需要输入“管理员”密码才能继续。

以下是如何检查您的账户是否为管理员:

  • 从系统设置中打开用户帐户。
  • 在左侧栏中选择您的用户帐户。
  • 对于管理员帐户,在两个窗格中,您应该看到帐户名称下面显示为Administrator,对于普通用户,则显示为Standard

不是的。

你在Ubuntu上登录的用户不是管理员用户 (在Linux术语中,管理员用户被称为root)


6这个说法最多是误导性的。在安装过程中创建的非root用户一个管理员。虽然不是root,但是他们是管理员(主要意味着他们可以使用sudo和PolicyKit以root身份执行操作)。 - Eliah Kagan
@EliahKagan - 好的,那么管理员账户和root账户之间有什么区别?我对Linux和计算机科学都很陌生,请多包涵。 - FirstName LastName
@EliahKagan 实际上并不是,这只是试图将Windows的术语应用到Linux上。sudo访问权限可以被限制在你尝试以root身份运行的程序上,这使得情况变得更加模糊。 - Izkata
@FirstNameLastName 有一个用户实际上被命名为"root"(通常是这样的;我听说可以更改,但我不知道如何)。它拥有对所有内容的访问权限。 - Izkata
2@Izkata【不,管理员在Ubuntu中有特定的含义。】(http://i.stack.imgur.com/YxZw5.png)说安装过程中创建的用户帐户不是管理员是*完全错误的*。至于允许特定命令以`root`身份通过`sudo`运行,那是无关紧要的。管理员可以使用`sudo`以`root`身份运行*任何*命令。默认情况下,其他人无法以`sudo`方式运行任何命令作为`root`(或任何其他用户)。另外,`sudo`只是以root身份执行操作的一种机制-这些天人们往往会认为是`sudo`,实际上通常是PolicyKit。 - Eliah Kagan