避免使用`sudo su`被认为是好习惯吗?

默认情况下禁用root密码,因此任何人都无法直接登录root帐户。

但是我仍然可以通过sudo su和输入我自己的密码以另一种方式登录root,因为我是/etc/group中的sudo组的成员(据我所知这是唯一必要的条件)。

通过使用sudo su将这种方式“后门”进入root帐户被认为是一种不好的做法吗? 是否需要避免,而是依赖于使用sudo command

最好避免以root身份执行更多操作。 sudo通过允许您以root身份运行单个命令而不必以 root 身份登录并且不需要交互式root shell来执行您不会运行shell的任务来促进这一点。 但sudo su不是一个“ 后门 ”,它只是一种不那么优雅的方式来做sudo旨在让你做sudo -s 。 类似地 , sudo -i是实现sudo su -会得到你的更优雅的方式:一个模拟的初始登录shell,其环境就像你可以在命令行以root用户身份登录一样。 见man sudo

因此,它取决于您何时选择运行交互式root shell以及如何选择使用它。 如果你正在使用它来避免决定是否以root身份运行命令,那就太糟糕了。 如果您发现其中运行的许多命令不需要root权限,那么您应该考虑在非特权shell中运行这些命令,或者如果您确实需要root shell,则重新考虑。 但是使用root shell没有任何根本性的错误。

无论是否打开root shell,都可能以损害安全性的方式使用sudo 。 例如,请不要使用sudo运行Firefox或LibreOffice。 运行root shell的潜在问题主要是你可能最终不必要地以root身份执行操作,并且在这样做的过程中可能会犯错误,当root用户执行时会更加有害。 因此,仅仅决定“我完全不通过运行root shell来避免这个问题”是不够的。 避免运行root shell是相当合理的,但是当你使用sudo时,这种一揽子选择仍然不需要注意。


关于sudo的Ubuntu帮助wiki页面列出了使用sudo九个好处 。 大多数但并非所有这些好处都完全适用于使用sudo来打开shell,前提是你要小心你在shell中所做的事情,就像你在sudo使用的各个命令一样。 这些是例外 – 当你用它来打开root shell时你并不完全享受sudo好处:

  1. sudo添加了命令运行的日志条目(在/var/log/auth.log )。 如果你陷入困境,你可以回去查看运行的命令。

另见bodhi.zazen的回答 。 用于打开该shell的一个命令仍然记录到auth.log ,但是它运行的命令不是。

  1. 身份validation会在短时间后自动过期(可以设置为所需的最小值或0); 因此,如果您在使用sudo以root身份运行命令后离开终端,则不会无限期地打开根终端。

虽然在有活动的sudo时间戳时你应该始终注意你(或其他人)可能运行的sudo ,但是使用交互式root shell会提升这种需求,因为在你退出shell之前运行的任何命令都将以root身份运行没有提示您输入密码。

此外,当您使用根shell时,其中一个好处会略微减弱,但仍然基本完整:

  1. 它默认情况下避免了“我可以做任何事情”的交互式登录。 在发生重大更改之前,系统会提示您输入密码,这会让您考虑到您正在做的事情的后果。

如果您在使用此root shell时假装自己是root并且没有其他用户帐户,那么您当然会完全失去这个好处。 但是,当你运行sudo -ssudo -i或其他命令给你一个shell时,你已经进入非root登录(除非你从恢复模式执行或者已经启用了root登录),所以这种诱惑更容易避免。

也就是说,如果您以root用户身份登录,那么您可能会因为需要执行只有root才能执行的操作而这样做。 使用root shell开始自己,不必要地使用它,因为对于一些命令,使用sudo单独运行它们实际上更容易 – 因为你已经以自己的身份登录了。

还有一个sudo好处是人们有时会认为在运行root shell时会丢失, 但他们完全错误地认为是这样

  1. sudo可以使用更细粒度的安全策略进行设置。

运行root shell根本不会降低此优势,因为它只能由配置为能够执行任何操作的用户完成,因此不允许您在设计之前执行任何以前无法执行的操作。 (这是另一个原因, 比仅仅存在-s-i选项更深入 , sudo su根本不像后门。)

从技术上讲,它可以由您在sudoers配置的用户“仅”允许运行root shell而不是其他任何东西! 但这将是一个非常愚蠢的配置,因为如果用户可以以root身份运行shell,他们可以以root身份执行任何操作。 (您必须采取特定的操作来为您打算实际限制的用户创建这种愚蠢和危险的情况。)有许多命令意外危险,允许任何不完全信任的用户以root身份运行 – 超过只是shell和文本编辑器。 任何将在用户指定的位置生成输出文件的命令都可用于执行权限提升攻击,如果它可以由您不打算已经能够以root身份执行的任何操作的用户运行。


如果您选择以root身份运行交互式shell,请务必小心。 考虑一下这是否真的对你有帮助,如果你最终会以root身份做更多的事情。 请记住,即使在只有一个人类用户的系统上,即使你可以在使用sudo 情况下删除所有个人文件这样的糟糕事情,以root身份执行操作也不仅仅会让你损害你的Ubuntu系统。更多方法。 如果你以root身份执行不需要以root身份完成的事情,那么就更难以说明可能发生的危害(或已经发生)。

话虽如此,使用同样或更危险的根壳有许多常见的替代方法。 例如,您可能运行没有sudo ,但它失败了,因为您需要以root身份运行它,然后使用历史记录扩展来使用sudo运行它。 但你确定你运行了正确的命令吗? 有了复杂的历史扩展结构,比如希望sudo !f将运行你的最后一个foo命令,错误非常容易。 但即使有基本!! 运行最后一个命令,会发生错误。 如果你跑foo; bar foo; bar然后运行sudo !! ,是以root身份运行的foo还是bar ? 如果您要使用sudo进行历史扩展,那么仅仅知道答案是不够的 – 每次执行此操作时都必须成功地记住它。

在大多数情况下,我建议你在向sudo添加sudo时避免重新输入的方式就是按下向上箭头,直到你找到运行sudo所需的sudo ,按Home键开始命令, 仔细阅读命令确保它真的是你想要做的 ,然后输入sudo和空格。 如果诱使你运行root shell的情况 – 或者使用更危险的方法 – 在这样的情况下,这样做是相当方便的,那么你不需要root shell。 如果你发现自己忘记输入sudo (我们很多人有时会这样做,包括我自己),请记住,你可能也会忘记其他事情,这些事情会让你高兴忘记以root身份运行命令。

你的问题比其他任何问题都更具意义。

IMO的最佳做法是每次使用sudo,因为sudo会记录你的命令,而sudo su则不会(一旦你是root用户)。

如果这太繁琐了,我建议使用sudo -i来更好地隔离用户和root帐户(环境变量)

请参阅https://help.ubuntu.com/community/RootSudo#Special_notes_on_sudo_and_shells