你是一个管理员,但不是root
。 root
用户可以做任何事情。管理员可以以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-data
、lp
、nobody
和其他非人用户账户。(运行cat /etc/passwd
或getent passwd
来查看全部账户。)
人类用户使用自己的用户账户登录,然后如果要执行某个任务需要使用另一个用户账户,他们会通过以该身份执行该任务的方式来实现,而不是真正以那个用户登录。
可以配置其他非人类用户,如www-data
,以便也可以登录为它们。虽然这种情况相当罕见,但在其他一些类Unix操作系统中,在终端中以root
身份登录是很常见的。将整个图形界面作为root
运行的风险,加上许多图形程序并不设计为以root
身份运行且可能无法正常工作,意味着您永远不应尝试获取一个由root
拥有的桌面会话。
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
来以root
身份运行命令:
sudo command...
这将提示我输入我的密码。(不是root的密码;root没有密码。)
- 因为我是管理员,所以可以以root的身份执行操作。在默认配置中,我必须输入我的密码才能做到这一点。
- 非管理员用户无法以root的身份执行操作,即使他们输入了密码也不行。如果运行sudo命令的用户不是管理员,则会失败。
- 由于管理员除了能够以root的身份执行操作之外,其实是完全普通的用户,因此运行需要root权限的命令仍然会失败,除非以root身份运行该命令。
演示需要使用sudo来执行管理任务的必要性。(基于"Sandwich" by Randall Munroe。)
sudo
前端以root
身份运行,例如gksu
/gksudo
和kdesudo
。例如,要以root
身份运行GParted,我可以运行gksudo gparted
。然后我会以图形方式提示输入密码。
由于我是以图形方式提示的,所以不需要终端。这是管理员工具以root
身份运行的一种方式之一。
Polkit(曾被称为PolicyKit)是管理员以root
身份执行操作的另一种方式。程序访问执行该操作的服务。有时,操作是运行整个程序;有时,操作更加有限。
现在,许多图形化系统管理实用程序默认使用polkit,而不是使用sudo
。
一个例子就是软件中心。它充分利用polkit,在用户想要执行需要root
权限的操作时,只需要输入密码。(使用基于sudo
的身份验证也可以实现,但更加困难和丑陋。)
在软件中心,我可以找到并阅读关于一个应用程序的信息;然后当我想要安装它时,会要求输入密码。
任何图形化程序都可以使用gksudo
和其他图形化sudo
前端作为root
运行。(根据程序是否设计为以root
身份使用,该程序可能无法正常工作。但是启动程序的命令将以root
身份执行。)
尽管在Ubuntu上,polkit现在比sudo
的图形界面前端更常见,用于在幕后以root
身份执行操作的应用程序,但只有当存在允许以root
身份运行图形应用程序的配置文件并指示可以执行哪些操作时,polkit才会运行。
pkexec
是用于使用polkit运行程序的命令。
sudo
一样,pkexec
可以运行非图形化命令。(而且它不需要一个定义命令能力的配置文件--它只是以root
身份运行该命令。)
pkexec command...
pkexec
即使从终端运行,也会以图形方式提示输入密码(这是它的行为更类似于gksudo
而不是直接运行sudo
的一种方式)。
(如果没有图形界面--例如,如果您从虚拟控制台或纯文本SSH会话登录,或者图形界面无法正常工作--那么pkexec
将会优雅地降级并在命令行提示输入密码。)
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-data
和nobody
)是禁用的。没有任何密码可以用来作为root
登录。因此,您不能使用su
以root
身份运行命令。
你可以使用su命令以其他用户的身份运行命令,这些用户通常包括你系统上代表人类的所有用户账户。
当以访客身份登录时,你无法使用su命令。
组合使用su和sudo
即使不是管理员,某人也可以使用su命令以管理员身份运行sudo命令。(尽管如此,他们需要管理员密码才能以管理员身份运行命令。)也就是说,有限用户可以使用su命令以root身份运行sudo命令。示例如下:
su username -c 'sudo command...'
(以这种方式运行图形程序需要特别注意。)
su
作为以root
身份运行命令的更安全的方式吗?可能不是。
root
身份操作怎么办?将其设置为受限用户,而不是管理员。
sudo
到root
怎么办?除非你重新配置了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
群组。
如果你愿意,可以。在系统设置 > 用户账户中创建一个有限用户账户,并以该用户登录。
是的,只需将其从sudo
和admin
群组中移除(参见上文)。
但是你应该确保至少有另一个管理员帐户,这样你就可以管理你的系统。 如果没有的话,那么你将不得不引导到恢复模式或使用Live CD,并再次将某个用户设置为管理员。(这类似于重新设置丢失的管理员密码。)
用于管理用户和组的图形工具通常会阻止你创建一个没有管理员的系统,或者至少会警告你。而命令行工具通常不会(相信你知道自己在做什么)。
sudo
和 PolicyKit 来使 "root" 能够执行任何操作。管理员甚至可以启用 "root" 账户并登录。如果你将用户账户抽象为 机械化 和有意识的行为的组合,人类用户既具有机械化行为也具有非人类用户(包括 root
)纯粹机械化的行为。如果你理解其工作原理,并且如果这种类比能加强你的理解,那很好!但我认为它并没有真正捕捉到 root-admin 的关系。 - Eliah Kaganroot
则像蝙蝠侠。两者之间的区别完全是一种构建的身份问题。布鲁斯·韦恩可以随时变身为蝙蝠侠,并且几乎可以做任何事情,但在面具下他始终是布鲁斯·韦恩。然而,蝙蝠侠更接近他真正的自我——布鲁斯·韦恩这个人设只是为了保护他免受成为蝙蝠侠所带来的后果。通过在日常生活中扮演韦恩,他经常能够保护自己和他所爱的人免受自己的错误、系统缺陷以及哥谭市的恶意软件的伤害。 - Eliah Kagansudo
命令。 - Izkatasudo -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)
sudo
和PolicyKit以root
身份执行操作)。 - Eliah Kagansudo
访问权限可以被限制在你尝试以root身份运行的程序上,这使得情况变得更加模糊。 - Izkata
sudo
以root身份运行程序。更一般地说,管理员(或其他经授权的用户)X可以使用sudo -u Y command...
以Y的身份运行command...
。在Windows Vista及更高版本中,启用UAC后,具有管理员权限的用户在没有这些权限的情况下运行程序,除非他们明确授权一个程序继承他们的权限。当UAC开启时(或对于受限制的用户),会出现“以管理员身份运行”的选项。 - Eliah Kagan