Eli*_*gan 84 sudo environment-variables home-directory history-of-ubuntu 19.10
在 Ubuntu 19.10 Eoan Ermine 之前的 Ubuntu 版本中,当我使用 运行命令时sudo,该命令会在环境变量中接收我的主目录$HOME。这是我一直期待并警告其他人的行为。如果我想sudo重置$HOME环境变量,使其指向目标用户的主目录而不是我自己的主目录,我必须传递该-H选项(或-i,尽管这样做更多)。
ek@Kip:~$ lsb_release -d
Description: Ubuntu 18.04.3 LTS
ek@Kip:~$ sudo printenv HOME # Shows ek's home, not root's.
/home/ek
ek@Kip:~$ sudo -u as printenv HOME # Shows ek's home, not as's.
/home/ek
ek@Kip:~$ sudo -H printenv HOME # Shows root's home.
/root
ek@Kip:~$ sudo -Hu as printenv HOME # Shows as's home.
/home/as
Run Code Online (Sandbox Code Playgroud)
当我第一次升级到 Ubuntu 19.10 时,我惊讶地发现它sudo似乎$HOME无论如何都会重置!现在 19.10 已发布,我继续观察这一点,并且我已经在新安装的系统和我升级到 19.10 的系统上安装了更新。
ek@Cord:~$ lsb_release -d
Description: Ubuntu 19.10
ek@Cord:~$ sudo printenv HOME # Shows root's home, even without -H or -i.
/root
ek@Cord:~$ sudo -u as printenv HOME # Shows as's home, even without -H or -i.
/home/as
ek@Cord:~$ sudo -H printenv HOME # Also shows root's home.
/root
ek@Cord:~$ sudo -Hu as printenv HOME # Also shows as's home.
/home/as
Run Code Online (Sandbox Code Playgroud)
我认为这可能是由于更新的配置文件。但是我检查了,并always_set_home没有出现Defaults在我的 19.10/etc/sudoers文件的任何行中。
从 19.10 开始,是什么让sudo待遇$HOME有所不同,为什么要做出这样的改变?sudo在我以前使用过的情况下,这是否可以安全地使用普通sudo -H?
Eli*_*gan 111
多年来,Ubuntu 已经发布了一个默认sudo保留的补丁版本$HOME。除了 Ubuntu 及其衍生产品之外,很少有其他操作系统(可能没有其他操作系统)这样做。它已经决定,这将导致更多的问题比它解决,并开始在Ubuntu 19.10,$HOME不再是一些环境变量之一sudo蜜饯。
在变化是什么以及它如何影响用户方面,关键点是:
sudo commandsudo -H command它确实可以用于以前建议的情况sudo -H,包括以 root 或其他用户身份运行 GUI 应用程序。以 root 身份运行图形程序仍然存在争议。但是在 19.10 中,您可以以sudo gedit与sudo -H gedit. 在 19.10 中,像这样的命令sudo gedit不再在您的主目录中创建烦人的文件所有权问题。/etc/sudoers文件。更改是在sudo程序本身的源代码中,而不是在其默认配置文件中。(它可以在sudoers文件中被覆盖,但如果你这样做了,你可能会知道。)sudo保留$HOME,未来更新sudo不会改变它。例如,18.04 LTS 将始终具有旧行为,即使在未来的版本中也是如此。sudo -H command仍然工作正常。如果你习惯使用它,没问题。在 19.10 系统上,您不必这样做。sudo行为不会有所不同。在绝大多数您不会通过的情况下-H,您可以通过。一些用户确实依赖或以其他方式更喜欢保留的旧行为$HOME。但这常常会产生意想不到的效果。所以,如果你是靠这个,你可能还是不希望覆盖在改变sudoers文件。另请参阅WinEunuuchs2Unix对为什么用户不应使用普通 sudo 来启动图形应用程序的回答?
正如变更日志所说的那样(在“sudo (1.8.27-1ubuntu2) eoan”下):
这会将 $HOME 的 sudo 处理恢复为其他人所做的
“其他人”指的是上游 sudo项目(在此处托管)以及似乎所有其他包含 的操作系统sudo,但那些源自 Ubuntu 的操作系统除外。
不过,还有更多。这也被认为是为了修复安全错误,如Ubuntu 补丁中所述,将 HOME 添加到 env_keep 使自定义命令在默认情况下易受攻击。历史上曾扼要地归纳在此评论有由史蒂夫Langasek(其中你可能听说过),我完全引用:
此更改最初是为了响应错误 #760140 而引入的。
sudo 的上游更改从未伴随 CVE,并且行为更改从未应用于 Ubuntu 的先前版本,因此当时它似乎对安全不敏感。
我不反对改变它以按照 Simon 描述的方式行事,但我在此向安全团队表示敬意。
维护上游sudo项目的托德 C.米勒(非常积极,并且已经多年),也被要求就这个问题提供意见。他解释了 sudo重置的原因(即不保存)$HOME:
2019 年 5 月 16 日星期四 07:48:40 -0400,Dan Streetman 写道:
我已经抄送了 sudo-users,所以上游 sudo 列表的问题可以概括为:
默认情况下,上游 sudo 将 HOME 添加到 env_keep 的可能性有多大?极不可能。在 sudo 1.7.4 之前,HOME 和 MAIL 环境变量默认保留在环境中。这会导致程序使用原始用户的主目录的配置文件,这具有安全隐患,因此在 1.7.4 中更改了默认值。
在过去,sudo 所做的只是改变 uid。现在 sudo 尝试在与您以该用户身份登录所获得的内容非常匹配的环境中运行该命令。事实证明,这更安全,因为它更接近于其他程序所做的假设。
我们之所以这么问是因为 Ubuntu 带有一个将 HOME 添加到 env_keep 的补丁,这与默认的上游或任何其他 Linux/Unix 不同。我们正在考虑删除该补丁,以匹配上游默认值,而不是 在 env_keep 中包含 HOME。
我会支持这一点。我相信重置 HOME 是更安全的默认设置。
- 托德
(我已更改原始消息的格式以在此媒体中正确显示。)
从 19.10 开始,Ubuntu 中的下游 sudo行为与上游sudo(以及sudo其他操作系统,包括 Debian)的行为相同多年。有关此更改的历史及其之前的发展的更多详细信息,包括供进一步阅读的大量链接,请参阅下面的“sudo和$HOME:过去 20 年”部分。
sudo用呢$HOME您运行的需要主目录位置的程序通常会检查$HOME 环境变量的值。一个重要的情况是当程序试图在运行它的用户的主目录中存储和访问配置文件时。程序通常按照 的值运行$HOME。有时,当您以替代用户身份运行程序时——例如,以 root 帐户身份运行时,让该程序使用您的设置是很有吸引力的。但这也可以通过两种方式变得混乱:
通常,当您以其他用户身份运行命令时,您希望它的工作方式与该用户运行它的方式大致相同。但是,如果它是一个命令,它的行为可以因您运行它的事实而彻底改变——如果它的行为是通过从名为 in 的目录中找到的文件读取的数据进行大量定制的,$HOME那么这个目标就无法实现。
当您被允许以任何用户身份执行您选择的任何操作时,包括 root(在 Ubuntu 中由sudo组中的成员身份授予),问题主要是意外之一。但是,如果你是一个有限的用户,您已允许运行只有特定的命令有sudo,则能够操纵什么这些命令做了严重的安全隐患。导致 19.10 更改的错误报告正是由该问题引起的(并包括一个令人信服的示例)。
如果您以另一个用户身份运行命令,并且该命令更改了名为 in 的目录中的配置$HOME,则会尝试将更改写入该位置的文件。当替代用户不是 root 时,如在 中,这通常会失败并产生错误消息,这有点烦人但并不严重。sudo -u username command
但是在替代用户是 root 的常见情况下,如 中所示,这会成功,但如果创建了任何新文件,则它们归 root 所有,并且您的用户帐户不再具有对其所有配置文件的完全访问权限。这可以通过将文件返回来解决,因此在图形应用程序的情况下问题最为严重,其复杂性可能会导致在更多地方涉及更多文件(并且据报道有时会导致登录困难),尽管通常问题没有那么严重)。sudo commandchown
默认情况下未重置的环境变量的简短白名单sudo本身是硬编码的。在 19.10 之前的 Ubuntu 版本中,特定$HOME于Ubuntu 的补丁添加到此白名单中。它被编译成 使用的二进制文件sudo,因此升级到sudo没有补丁的版本会将其从白名单中删除。
该补丁已在 19.10 中删除。因此升级到 19.10 或更高版本将始终应用更改,即使没有修改与之关联的配置文件sudo。
仍然可以配置sudo要保留的任何版本$HOME(见下文)。在极不寻常的情况下,您在 19.10 之前执行此操作 - 当此类配置没有任何区别时 - 并在升级过程中保留该配置,$HOME仍将保留。但你大概会记得做过这件奇怪的事。
如果您升级到 19.10(或更高版本)失败并为您提供了一个仅部分升级的系统,其版本为sudo19.10 之前的版本,则sudo该系统仍$HOME默认保留。这几乎是唯一一种在您不知情的情况下sudo保留$HOME在 19.10(或更高版本)中的情况——尽管您仍然会在版本升级期间被告知并非所有软件包都可以升级。
sudo在Ubuntu 19.10的源代码中直接看到补丁消失的最简单方法是比较https://git.launchpad.net/ubuntu/+source/sudo/tree/debian/patches?h=ubuntu/disco - 安全到https://git.launchpad.net/ubuntu/+source/sudo/tree/debian/patches?h=ubuntu/eoan。
不过,如果您不确定您的系统是如何配置的,您可以运行sudo printenv HOME以找出答案。
$HOME在 Ubuntu 19.04 及更早版本中重置尽管sudoUbuntu 19.04 及更早版本的更新可能包括对文档的更改以解释这种情况,但这些版本中的sudo处理方式$HOME尚未也不会因任何更新而改变。大多数用户不想费心手动更改sudo他们已经在使用它而没有问题的系统上的工作方式。但是,如果您愿意,即使不升级它们,也可以在这些系统上进行sudo重置$HOME。
在您运行的任何特定时间sudo,您都可以使用-H/--set-home选项重置$HOME:
sudo -H commandRun Code Online (Sandbox Code Playgroud)
或者你可以使用-i. 这不仅仅是 reset $HOME。行为就像您以 root 身份登录、运行和注销一样;其本身的行为就像您以 root 身份登录并将您置于交互式 root shell 中。这不同于,后者启动一个不是登录 shell 的交互式 shell。在 Ubuntu 19.10 之前,保留; 也就是说,无论版本如何,该选项都不带有任何影响处理方式的行为。和一起使用才有意义。你也可以使用任意的,以及与成为而非根源。最后,通过图形前端使用或sudo -i commandcommandsudo -isudo -ssudo -s$HOME-s$HOME-H-s-H-i-s-u userusersudogksugksudo(在 16.04 LTS 中仍然可用,但您可能需要安装该gksu软件包) resets $HOME。
如果要重新配置sudo以使其始终重置$HOME,则可以always_set_home在sudoers文件中启用该选项:
Defaults always_set_home
Run Code Online (Sandbox Code Playgroud)
你会该行增加/etc/sudoers或更好,在一个新的文件/etc/sudoers.d/。无论哪种方式,您都应该使用visudo来编辑文件,以便获得语法检查的好处。(任何sudoers文件中的语法错误都会导致sudo根本拒绝工作。虽然可以修复,但很麻烦。)
例如,在我 19.10 之前的一些系统上,我通过运行来创建和编辑:/etc/sudoers.d/always_set_home
sudo visudo -f /etc/sudoers.d/always_set_homeRun Code Online (Sandbox Code Playgroud)
在文件中,我写了上面的Defaults行。文件名不必是always_set_home-- 它可以是您喜欢的任何名称,只要它包含 no.或~字符即可。当然,Defaults线上的单词确实需要正好是always_set_home。
(喜欢创建新文件而不是/etc/sudoers.d/修改现有/etc/sudoers文件的一个原因是,如果将来的更新确实更改了默认/etc/sudoers文件,您可以接受新文件而不会丢失您的自定义。另一个原因是您可以立即清楚已更改配置,以及可以在何处找到您的更改。)
如果您执行此操作并且稍后希望运行一个sudo保留的单个命令$HOME,您可以按照在 19.10 中执行的相同方式执行此操作(见下文)。
$HOME在 Ubuntu 19.10 及更高版本中保留由于某种原因,sudo治疗方式$HOME发生了变化。(请参阅上面的部分,以及下面的详细历史记录部分。)但是,如果您真的希望sudo继续保留$HOME,即使在 19.10 及更高版本中,您也可以在sudoers文件中配置此行为。
你运行任何特定的时间sudo,你可以告诉它保存$HOME与--preserve-env=HOME:
sudo --preserve-env=HOME commandRun Code Online (Sandbox Code Playgroud)
这是的形式--preserve-env被记录为--preserve-env=list在该sudo手册页。也可以在--preserve-env没有列表操作数的情况下使用,这与-E; 保留所有环境变量。但是很少有充分的理由这样做,特别是如果您的目标只是保留$HOME. 如果您不喜欢打字--preserve-env=HOME,您可以定义一个 shell 别名或 shell 函数,或者编写一个脚本,让您运行更短的命令来完成它。更好的是很少保留$HOME(请参阅下面关于这样做的替代方案的部分)。
更一般地,你可以sudo保留任何特定的环境变量varname有。(您可能还会看到通过在命令运行中显式设置来有效保留的代码,例如 with 。这也有效。它与 完全不同,后者不会阻止重置。)--preserve-env=varname$HOMEsudosudo HOME="$HOME" commandHOME="$HOME" sudo commandsudo$HOME
或者,如果您真的想要sudo始终保留$HOME,您可以通过在文件中添加$HOME来做到这一点:env_keepsudoers
Defaults env_keep += "HOME"
Run Code Online (Sandbox Code Playgroud)
可以进入/etc/sudoers或在/etc/sudoers.d/. 尽管我强调我根本不建议这样做,但如果您决定这样做,那么我建议通过运行来创建和编辑(调用您喜欢的文件,只要名称不包含或):/etc/sudoers.d/keep-home.~
sudo visudo -f /etc/sudoers.d/keep-homeRun Code Online (Sandbox Code Playgroud)
然后您可以将该Defaults行放入文件中。
使用+=而不是仅仅使用的原因=是有一些其他环境变量,硬编码到sudo自身中,默认情况下保留,并且您可能希望保留。如果您使用了=,则只会保留您在文件中明确列出的环境变量。在这种情况下,那将只是 $HOME. sudoers(5) 中sudoers提供了有关文件语法的更多信息。
至于为什么我建议创建一个文件/etc/sudoers.d/而不是编辑/etc/sudoers——以及为什么你绝对应该使用visudo任何一种方式——请参阅我在上面“$HOME在 Ubuntu 19.04 及更早版本中重置”部分中的评论。
$HOME大多数情况下,您使用sudo,保留的最佳替代方法$HOME是什么都不做。大多数sudo命令具有相同的效果(有些命令稍微好一些)而无需$HOME保留。但是,我知道有两个流行的用于保留$HOME.
使用您的文本编辑器配置和/或插件来编辑 root 或其他用户拥有的文件。 sudoedit,或等效地sudo -e,是一个理想的替代方案。它会像您一样运行编辑器,您编辑文件的临时副本,并在您退出编辑器时更新文件。由于编辑器以您的身份运行,它会自动使用您的配置和插件,并且不会有任何以不透明和意外方式失败并导致权限被拒绝错误或使您无法访问主目录中的文件的风险。编辑file:
sudoedit fileRun Code Online (Sandbox Code Playgroud)
要file使用editor而不是默认编辑器进行编辑:
SUDO_EDITOR=editor sudoedit fileRun Code Online (Sandbox Code Playgroud)
例如,SUDO_EDITOR=vim sudoedit /etc/apt/sources.list编辑/etc/apt/sources.list用vim。
要决定使用什么编辑器,请sudoedit查阅环境变量 $SUDO_EDITOR;如果未设置,则进行咨询$VISUAL;如果未设置,则进行咨询$EDITOR;如果未设置,它会尝试来自硬编码列表的编辑器命令,这在 Ubuntu 中实际上意味着它使用editor. 通常解析为/usr/bin/editor,这是一个符号链接。如果要更改系统范围内的默认编辑器,则可以/usr/bin/editor通过运行sudo update-alternatives --config editor. 您还可以设置这三个环境变量中的一个,这是一种sudoedit仅为一个用户更改编辑内容的好方法。
使您只能以 root 身份运行的程序使用特定的配置文件。如果您以 root 身份运行的程序查找$HOME其配置,那么您只需将该配置放入(或将该配置移动到)root 的主目录/root.
$HOME当您不知道您使用的是哪个版本时重置您有时可能会编写一个命令,但不知道它将在什么版本的 Ubuntu(或除 Ubuntu 之外的操作系统)上运行。例如,您可能正在编写将在多台机器上运行的脚本。
sudo继续接受该-H选项,效果与以往相同。碰巧的是,从 19.10 开始,sudowithout-H与sudo -H.
要编写可移植的sudoreset 命令$HOME,您可以继续使用:
sudo -H commandRun Code Online (Sandbox Code Playgroud)
(和以前一样,如果脚本中执行的所有操作都需要以 root 用户身份完成,最好不要sudo在脚本中使用,而只使用sudo.以 root 用户身份运行脚本。)
sudo和$HOME:过去的 20 年世纪之交,上游 sudo项目引入了env_reset选项,可以sudo重置大多数环境变量。除非在sudoers文件中明确禁用,否则启用此选项。(可以显式启用它,这Defaults env_reset在 Debian 和 Ubuntu 的/etc/sudoers文件中是这样做的,但这实际上不是必需的。)在sudohad之前env_reset,所有环境变量都保持不变。使用env_reset,只保留了少数变量。这包括$HOME.
2010 年 7 月,$HOME从那个小白名单中删除,因此默认情况下不再保留。
2010 年 9 月,提交了一份关于记录sudoDebian 软件包中的错误报告。据我所知,Debian 开发人员对更改本身没有争议或反对。(但见下文。)
2011年二月,变化已经到来进一步下游从Debian时讨论它是否是可取的Ubuntu和Ubuntu的开发者。
2011 年 4 月,该更改被报告为错误,引用了该讨论。(由于更改导致的一些行为在前一天被报告为错误。)至少在当时,这被认为是一个回归(“Debian 维护者已经尝试过一次修复这个问题,但似乎修复不完整”)。我还没有发现任何这样的 Debian 错误报告,但这并不意味着没有;此外,没有一个也可以做出改变。不过,我怀疑它可能是对该文档 bug的错误引用。
第二天,Ubuntu 的开发版本更新了一个下游的、仅限 Ubuntu 的补丁,重新添加$HOME到sudo默认保留的环境变量列表中。我相信这是很快完成的,以便将其纳入 Ubuntu 11.04 的发行版。效果是sudo在 11.04 中,与以前的 Ubuntu 版本一样,$HOME默认情况下保留。
2011 年 11 月,报告了一个关于如何重置sudoUbuntu 中的文档的错误$HOME。也就是说,Ubuntu 中的联机帮助页正确描述了上游的行为,sudo但没有正确描述 Ubuntu 中的修补行为。
在2014年9月,一个bug报告指出的一些问题具有sudo保存$HOME在默认情况下,并争辩说,与正常运行的图形程序的问题sudo不在于它的内在的危险(经常被引用到这个wiki页面),但sudo的不寻常$HOME在 Ubuntu 中的处理使其变得危险,应该被视为一个错误。似乎对这个错误报告有很大的兴趣,包括来自 Ubuntu 开发人员的,尽管它需要一段时间才能得到修复。
2016 年 3 月,报告了后来成为sudo保留问题的主要参考的错误$HOME。最初,此错误报告专门针对安全问题,即非管理员用户(即,不能以 root 身份运行任意命令)但被允许使用 运行特定命令的sudo用户可以恶意更改某些程序的行为,并且在有些情况下甚至可以完全控制系统。它建议进行狭窄的更改,尝试专门解决这种情况,同时仍$HOME保留当sudo组成员以 root 或其他用户身份运行命令时。
| 归档时间: |
|
| 查看次数: |
5360 次 |
| 最近记录: |