如果用户被授予对所有命令的访问权限,那么 sudo 比直接使用 su 更安全吗?

bmc*_*148 42 security command-line sudo administrator

因此,我一直在研究使用su和之间的差异sudo,并且每个人似乎都同意这种sudo方法比允许访问 root 帐户本身更安全。他们说,使用 root 帐户,您只需一个命令就可以破坏整个系统。这个我明白。但是在系统上创建的初始用户也可以使用 sudo 访问所有命令。这我可以通过运行找到su -l。如果是这种情况,那么我可以简单地运行sudo <game-ending command>以破坏我的系统。那么,与允许我直接访问超级用户帐户相比,这种方法如何更好或更安全?我可以运行所有相同的命令...

是不是因为sudo在命令行上使用我明确地告诉计算机我认为我知道我在做什么?他们是否认为人们会忘记他们在超级用户帐户下,除非他们明确说明?

人们还表示,如果系统被外国人入侵并进入,在 root 帐户下将允许他们对我的系统做可怕的事情。但在我看来,如果他们已经可以访问我的帐户并知道我的密码,他们可以通过使用 sudo 并输入我的密码来做同样可怕的事情,因为他们甚至不需要知道超级用户的密码。我没有得到什么?

Pan*_*her 42

就我个人而言,我不一定认为它更安全,而且(sudo 的)大部分好处都在多用户系统上。在单用户系统上,它可能是一个清洗。

好处是(排名不分先后):

  • sudo 具有卓越的日志记录。sudo 记录每个命令。
  • sudo 允许更精细的粒度控制。可以配置 sudo 以授予对某些但不是所有命令的 root 访问权限。
  • sudo 使用登录密码。这可以防止必须提供 root 密码(就像使用 su 一样),并且与上面关于更细粒度的控制/访问 root 的点有关。
  • 在 Ubuntu 中,默认情况下,root 帐户是锁定的。这阻止了破解者登录(通过 ssh 远程登录),他们必须猜测用户名和密码。如果root账户没有被锁定,就像su一样,那么他们只需要破解root的密码。
  • sudo -i可能是将 root 的环境变量与用户隔离的最佳方法。这不时出现,但比较深奥。请参阅https://help.ubuntu.com/community/RootSudo#Special_notes_on_sudo_and_shells
  • 有些人认为必须在他们希望以 root 身份运行的每个命令之前输入 sudo 或让 sudo 超时允许他们停下来思考更清晰,并减少他们的错误或运行错误的命令。如果这样做对您有帮助,那也将是一个好处。

可能有更多的好处,但是,恕我直言,这些是主要的好处。

另见 - https://help.ubuntu.com/community/RootSudo

尝试回答您的其他一些想法:

  • 只要您知道密码,su 或 sudo 都不会阻止您运行恶意代码。两者都不是更安全或更好。
  • Crackers 可以通过多种方法获得 shell 访问权限。当您在安全通知中看到“运行任意代码” - https://usn.ubuntu.com/usn/ - 这意味着破解者可以运行 /bin/bash 或任何其他代码。因此,破解者可以通过各种漏洞利用,在不知道您的登录名或密码的情况下获得 shell 访问权限。sudo 或 su 都没有帮助。
  • 如果破解者有 shell 访问权限,他们可以在没有 root 访问权限的情况下造成很多损害。例如,加密您所有个人数据的勒索软件。
  • 如果破解者通过 su 或 sudo 对具有 root 访问权限的帐户具有 shell 访问权限,则破解者可以通过本讨论范围之外的多种方法获得 root 访问权限。sudo 或 su 在这方面都没有优势。

因此,虽然您观察到 sudo 的问题或缺陷,但 su 具有完全相同的漏洞,并且 su 在这些方面并不优于 sudo,恕我直言

  • 不破坏 root 密码可能是 sudo 的最大优势。您可以在不泄露任何秘密的情况下授予 root 权限。 (14认同)
  • 我相信最大的优势是必须证明每个命令都需要超级用户权限。我在早期使用 Linux 的经验中发现,当我对系统进行修补时,我倾向于在至少一个终端中以 root 用户身份运行。不幸的是,很容易通过误解或输入错误在终端发出破坏性命令。如果那是在“根终端”中,则可能会导致从备份中恢复或重新安装。sudo 多次保护我免受伤害! (8认同)

dij*_*uis 10

想象一下,你有 20 分钟的时间来做一些复杂的事情。你有点宿醉,你必须赶路。“让我们使用 su”你说。“它会节省一些时间”是你的理由。

不小心打字

rm -rf /*
Run Code Online (Sandbox Code Playgroud)

代替

rm -rf ./*
Run Code Online (Sandbox Code Playgroud)

您的系统现在正在变砖,距离截止日期还有 10 分钟。

如果您明确选择何时需要 root,则可以最大程度地减少发生这种情况的机会。可能不需要 Rootrm -r ./*那么为什么要使用它呢?为什么要冒险?

这就是这里的“安全”的含义。最大限度地降低用户(所有用户,而不仅仅是初学者)犯致命错误的风险。

当然,这是一个极端的例子,不应该允许在生产环境中发生(我保证它已经发生在生产环境中)。

安全方面,有些东西 sudo 也更好。正如@Panther 所说- 日志记录、限制、root 密码是 SPOF 等)

  • 地狱,你不需要等待那么久,如果你只是做... *`chown -R nobody:nobody /`* 甚至 *`chown -R nobody ../`* 作为 root。*`chmod`* 在递归模式下当然也有类似的问题。但最好的一点是,只有在需要时才应该成为 root;您的登录权限越小,对正常使用越好。 (4认同)
  • 那么,这与 `sudo` 有何不同?你写了 `sudo rm -rf /*` 而不是 `sudo rm -rf ./*` 然后再次繁荣。 (4认同)
  • 不过,当你宿醉时编程 +1。 (2认同)
  • @ilkkachu 就实际命令而言,它对发生的事情的影响很小。但是您必须明确声明您希望以 root 身份执行此操作。这才是重点。安全关乎风险管理。当然,您仍然可以使系统变砖。但是您拥有 root 权限的时间越少,犯致命错误的机会就越少。安全就是把可能性降到最低。 (2认同)
  • @ilkkachu 因为你*不会*输入`sudo rm -rf ./*`。您可能对当前目录中的内容具有写访问权限,因此该命令不需要 sudo。所以输入的命令最终是 `rm -rf /*`,它会产生一长串“权限被拒绝”消息,让你知道你需要 `ctrl-c` 在它到达你可以实际删除的东西之前,而不是只是在你意识到有问题之前删除 `/bin`、`/boot`、`/dev` 和一半的 `/etc` 中的所有内容。 (2认同)

Dub*_*ubu 9

我想为其他答案添加一些历史观点。不幸的是,除了我自己对 Usenet 讨论和杂志文章的记忆之外,我没有任何可用的资源。

前段时间,在 1990 年代,即使没有多少计算机知识,发行版也让在您自己的硬件上安装 Linux 变得更加容易。一些 UN*X 方言。相反,许多人习惯于(单用户)系统,如 Windows 95/98。他们了解到大多数 Linux 系统管理任务都需要在那个奇怪的“root”帐户下工作。

因此,一些用户只是以root身份登录并使用该帐户进行所有日常工作。为什么他们应该有类型su一再或登录密码到一个新的tty只是一些管理命令?但是对所有事情都使用root当然不是一个好主意,因为在错误的地方使用一些不注意的命令可能会对您的系统造成更大的伤害。这甚至导致一些发行版(是 SuSE 吗?)修改root用户的桌面背景以显示一个大警告,您应该只将该帐户用于管理任务。

因此,Ubuntu 方式sudo有一些优点(除了Panther已经列出的那些)。

  • 您不能直接登录到root帐户。² :-)
  • 安装过程不会要求您提供(额外的)root 密码,您只需要一个(您的用户的)密码。
  • sudo缓存您的凭据,因此对于连续的多个管理命令,您只需输入一次密码(与 相比su)。这减少了只用root权限打开 shell 或新终端的冲动。
  • 并且可以更轻松地告诉用户在线和文档中哪些命令必须以管理员身份输入,哪些不需要。³

¹ 对于那些不敢自己动手的人,还有安装派对。
² 但是您可以在以普通用户身份登录后使用类似sudo -i或这样的命令sudo su - root获取root shell。
³ 但是您当然知道您不应该简单地从 Internet 复制和粘贴命令,对吗?

  • 当然有一个_root_帐户。我说你不能“直接登录”,这意味着你不能在登录提示或 X 登录对话框中输入用户 `root` 和密码并以 _root._ 启动你的会话。但你可以使用你的命令之一(我更喜欢`sudo -i` 因为它更短而且我很懒)来获取 root shell。 (2认同)