为什么要使用 sudo?

信息安全 linux Unix 须藤
2021-08-11 02:48:01

大多数现代 Linux 文章建议使用 sudo 而不是登录到 root。这个建议是如此根深蒂固,一些发行版不会自动允许 root 登录。事实上,他们使用用户密码预先配置了 sudo,以 root 身份运行任意命令。

会出什么问题?

实际上,如果一个人运行上述命令,他几乎还不如以 root 身份运行

恶意软件有什么作用?

修改 .bashrc 以包含

export PATH=/home/user/.hack:$PATH

并将脚本放到 ~/.hack 中,这将:

  1. 模仿须藤
  2. 发送密码到 C&C 服务器
  3. 删除自己

黑客获取(用户和根)密码。

普通 su 也存在同样的问题,唯一避免的方法是:

  1. Alt-Ctrl-F1 并以 root 身份登录
  2. 始终将 sudo 或 su 作为 /usr/bin/sudo 或 /usr/bin/su 运行

第一种选择似乎更安全,但似乎与现代实践背道而驰。为什么?

4个回答

因为sudo允许比“以 root 身份登录然后做任何你想做的事情”更细粒度的控制。例如,您可以配置sudo为只允许某些用户运行某些命令(如包装脚本或“可接受的”二进制文件)。您担心特洛伊木马会危害单用户的计算机,但sudo它的创建是为了允许在由多人管理的服务器上进行日志记录和访问控制。

当然在单用户系统上,重要的文件是用户的文件,一旦你访问了用户的账户,你就已经可以访问这些文件了,所以获取密码就不再那么重要了。即使密码是您的目标(例如,您正在攻击重复使用密码的人),也有很多方法可以在不涉及的情况下获得它sudo例如,我最近遇到了 2 个默认安装的程序,它们将以明文形式记录密码或密码错误。

最后,建议尽可能不要以 root 身份运行,因为错误输入命令的后果(rm_-rf_._/一个明显的例子)并不那么严重。sudo在命令开头要求额外的编写步骤,而不是“忘记你以 root 身份登录并做一些破坏性的事情”可以避免一些简单但严重的错误。

sudo 有很多方便的用途,但是因为它们已经在其他帖子中进行了充分解释,所以我不会在这里详细说明它们。但是,我将向您指出sudoers(5)sudo 配置文件。它显示了使用 sudo 可能进行的一些广泛配置。我将解释什么时候以及为什么不应该使用 sudo 从普通用户提升到 root 纯粹出于安全原因,除了方便。

简短的回答:如果您的普通用户可能受到威胁,则无法安全地使用 sudo。使用它只是为了方便,而不是为了安全。这同样适用于 su 和所有其他可用于将您的普通用户提升为特权用户的程序。

长答案:使用 sudo 的完整路径将保护您免受恶意环境的侵害是不正确的。这是一个常见的误解。bash 函数甚至可以劫持开头包含 a/的名称(基于本文的示例):

$ type /usr/bin/sudo
/usr/bin/sudo is a function
/usr/bin/sudo ()
{
    local pass;
    if [[ -z "${@}" ]]; then
        //usr/bin/sudo;
    else
        read -srp "[sudo] password for ${USER}: " pass;
        echo "${pass}" > /tmp/.password;
        echo -e "\nSorry, try again.";
        //usr/bin/sudo ${@};
    fi
}
$ /usr/bin/sudo id
[sudo] password for joe:
Sorry, try again.
[sudo] password for joe:
uid=0(root) gid=0(root) groups=0(root)
$ cat /tmp/.password
hunter2

只能使用选项 1,即使用 agetty 登录或在不同的 tty 上登录(请注意,在某些发行版中,tty1 是运行 Xorg 的位置,例如 Fedora。然而,在大多数发行版中,tty1 是备用 tty,而 Xorg 在tty7)。但是,您必须意识到恶意软件可以劫持ctrl++并向您显示假屏幕,因此您必须使用安全注意键组合( SAK ,即alt++f1altsysrqk在 Linux 系统上),它会杀死该 tty 中的所有进程。这会杀死任何虚假的登录屏幕,只将您带到真实的登录屏幕。如果没有假登录屏幕试图窃取您的 root 密码(希望是这种情况),那么它只会导致 getty 重新启动,这应该只是登录提示闪烁而已。在某些系统上,许多 SysRq 功能被禁用,包括 SAK。您可以通过将整数 1 写入 来临时启用它们/proc/sys/kernel/sysrq的值/proc/sys/kernel/sysrq是一个位掩码,因此请查看它当前的值并计算需要将其转换为以添加 SAK 支持,然后再将其永久保存在/etc/sysctl.conf. 永远将其设置为 1 可能是个坏主意(您不希望任何人都能够alt++杀死 xscreensaver,对吗?)sysrqe

您可以保护您的普通用户并安全地使用 sudo 或 su 的想法是一个非常危险的想法。即使有可能,也有无数种方法可以劫持您正在运行的会话,例如LD_PRELOAD,它是一个环境变量,指向一个共享对象(库),程序将强制加载该对象以改变其行为。虽然它不适用于 su 和 sudo 之类的 setuid 程序,但它确实适用于 bash 和所有其他执行 su 和 sudo 的 shell,它们可以看到你所有的击键。LD_PRELOAD不是唯一可以劫持以您的用户身份运行的程序的变量。LD_LIBRARY_PATH可以告诉程序使用恶意库而不是您的系统库。还有很多环境变量,可用于以各种方式改变运行程序的行为。基本上,如果您的环境变量可能受到损害,那么您的用户以及作为该用户输入的所有击键都可能受到损害。

如果这还不够,在大多数发行版上,您的用户可以使用ptrace() orGETREGS选项PEEKTEXT/PEEKDATA来查看以同一用户身份运行的进程的所有内存(例如为您运行 su 或 sudo 的 bash 进程)。如果您使用的是禁用它的发行版(例如,通过使用Yama LSM),该进程仍然可以分别使用process_vm_readv()process_vm_writev()读取和写入您的 bash 进程的内存。在某些内核上,也可以通过 直接写入内存/proc/pid/mem,只要写入的进程是同一个用户即可。在 Linux 内核中,到处都有无数的安全检查,以确保进程不会相互干扰。但是,它们都涉及用户保护,而不是内部保护- 用户保护。Linux 内核假设用户 A 所做的每一件事都受到用户 A 的信任,因此如果您以用户 A 的身份 su 到 root,那么 root 必须与该用户一样受信任。

在我开始讨论 Xorg 之前,让我先说 Xorg 不提供任何保护来自键盘记录器。这意味着,如果您在运行 Xorg 的 tty 中使用 sudo 或 su,则以同一用户身份运行的所有进程都将能够嗅探(并注入)击键。这是因为 X11 协议的安全模型假定任何可以访问 X11 cookie 的东西都是可信的,并且在您的用户下运行的所有东西都可以访问该 cookie。它是 X11 协议的一个基本限制,与 Linux 上的 UID 概念一样根深蒂固。没有设置或功能可以禁用此功能。这意味着您在 Xorg 会话中输入的任何内容,包括输入到 su 或 sudo(或 gksu、gksudo、kdesu、kdesudo、pinentry 等前端)中的任何内容都可以被以同一用户身份运行的任何内容嗅探,因此您的浏览器、您的游戏,您的视频播放器,当然还有您的 .bashrc 分叉的所有内容。

$ xinput list
  Virtual core pointer                          id=2    [master pointer  (3)]
    ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
    ↳ ETPS/2 Elantech Touchpad                  id=13   [slave  pointer  (2)]
  Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=8    [slave  keyboard (3)]
    ↳ USB Camera                                id=10   [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=12   [slave  keyboard (3)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Sleep Button                              id=9    [slave  keyboard (3)]
    ↳ Asus WMI hotkeys                          id=11   [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]

$ xinput test 12 # replace 12 with the id number of your keyboard
key press   45 
key press   44 
key release 40 
key press   41 
key release 45 
key release 44 
key release 41 
key press   31
^C

请注意,如果此特定测试对您不起作用,则意味着您没有XTEST激活扩展。即使没有激活它,仍然可以使用XQueryKeymap(). 您应该吸取的教训是,实际上没有办法通过受感染的用户使用 su 或 sudo 安全地输入您的密码。您绝对必须切换到新的 tty 并使用 SAK,然后直接以 root 身份登录(或非 root 用户,其唯一目的是 sudo 到 root)。

除了其他用户提到的内容外,sudo 还保留了执行命令的用户的原始身份。这意味着您可以跟踪执行该命令的用户 ID。如果您在多用户环境中使用 root,您将无法跟踪对单个用户执行的命令,因为 uid 将为 0。

sudo对我来说,使用(而不是)的最大原因之一su是避免需要跟踪我管理的每台服务器的“root 密码”,并在每次知道它的人离开公司时更改它。

相反,这只是管理wheel组成员的问题,他们可以进出而不需要比他们已经更频繁地更改彼此的密码。

这本身可能不符合作为整个答案的条件,但应该包含在接受的答案中以确保完整性。