为什么让普通用户使用 sudo vim 会存在风险?

mi0*_*0pu 30 security vim sudo

我想创建一个新用户并授予他 sudo 访问权限。具体来说,我想让他使用sudo vim和编辑httpd.conf。我在 sudoers 中写了这个:

user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf
Run Code Online (Sandbox Code Playgroud)

然而,我听说这可能有风险。为什么这是有问题的?问题有多严重?

HBr*_*ijn 62

尽管您限制了命令行参数,但没有什么可以阻止用户在以 root 身份运行后使用 vim打开、编辑和覆盖任何随机文件

用户可以运行sudo vim /etc/httpd/conf/httpd.conf 然后

  • 清除编辑缓冲区中的所有文本
  • 然后为方便起见,提供一个现有文件(尽管这甚至不是必需的):例如 sudo 配置
    :r /etc/sudoers 注意:除非受 SELinux 限制,否则用户可以通过这种方式读取任何文件!
  • 授予自己更多的 sudo 权限 user ALL=(ALL) NOPASSWD: ALL
  • 覆盖旧配置 :w /etc/sudoers

我可以想象您的用户现在可以通过数十种类似的方式访问、修改或破坏您的系统。

您甚至不会有以这种方式更改文件的审计跟踪,因为您只会看到他在 sudo 日志消息中编辑您的 Apache 配置。这是授予sudo任何编辑者权限的安全风险。

这或多或少与授予 sudo 根级别权限的原因相同,tar并且unzip通常不安全,没有什么可以阻止您在存档中包含系统二进制文件或系统配置文件的替换。


正如许多其他评论者指出的那样,第二个风险是vim允许shell 转义,您可以从 vim 中启动一个子 shell,允许您执行任意命令。在您的 sudo vim 会话中,这些将以 root 身份运行,例如 shell 转义:

  • :!/bin/bash 会给你一个交互式的 root shell
  • :!/bin/rm -rf / 将成为酒吧里的好故事。

该怎么办?

您仍然可以使用sudo允许用户以安全的方式编辑不属于他们的文件。

在您的 sudoers 配置中,您可以设置一个特殊的保留命令,sudoedit后跟用户可以编辑的文件的完整(通配符)路径名:

user ALL=(ALL) sudoedit /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf
Run Code Online (Sandbox Code Playgroud)

然后用户可以-e在他们的 sudo 命令行中使用开关或使用以下sudoedit命令:

sudo -e /etc/httpd/conf/httpd.conf
sudoedit /etc/httpd/conf/httpd.conf
Run Code Online (Sandbox Code Playgroud)

手册页中所述

-e (edit)选项指示用户希望编辑一个或多个文件而不是运行命令。代替命令,在咨询安全策略时使用字符串“sudoedit”。
如果用户被策略授权,则采取以下步骤:

  • 临时副本由要编辑的文件组成,所有者设置为调用用户。
  • 运行策略指定的编辑器来编辑临时文件。sudoers 策略使用 SUDO_EDITOR、VISUAL 和 EDITOR 环境变量(按此顺序)。如果 SUDO_EDITOR、VISUAL 或 EDITOR 均未设置,sudoers则使用编辑器(5) 选项中列出的第一个程序。
  • 如果它们已被修改,则临时文件将复制回其原始位置并删除临时版本。
    如果指定的文件不存在,它将被创建。
    请注意,与 sudo 运行的大多数命令不同,编辑器在未修改调用用户环境的情况下运行。如果由于某种原因 sudo 无法使用其编辑后的版本更新文件,用户将收到警告并且编辑后的副本将保留在临时文件中。

sudoers手册还有一整节如何使用和选项提供有限的外壳逃逸保护RESRICTNOEXEC

restrict 避免让用户访问允许用户运行任意命令的命令。许多编辑器都具有禁用 shell 转义的受限模式,尽管 sudoedit 是通过 sudo 运行编辑器的更好解决方案。由于提供 shell 转义的程序很多,将用户限制在不提供的程序集通常是行不通的。

noexec
许多支持共享库的系统都能够通过将环境变量(通常是 LD_PRELOAD)指向备用共享库来覆盖默认库函数。在此类系统上,sudo 的 noexec 功能可用于阻止由 sudo 运行的程序执行任何其他程序。注意,... ...
要为命令启用 noexec,请使用NOEXEC上面“用户规范”部分中记录的标记。这又是一个例子:
aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi
这允许用户 aaron 运行/usr/bin/more/usr/bin/vi启用 noexec。这将阻止这两个命令执行其他命令(例如 shell)。

  • 很好的答案。如果它还提到从 vim 内部转义到 shell 中,那就更好了。一旦您进入 shell,它就可以免费使用,而且日志中仍然会显示用户正在编辑您的 Apache 配置文件。 (5认同)
  • 此外?如果你使用 vim,你可能会做一些可怕的事情,比如`:!rm -rf /`,哎呀! (2认同)

Wil*_*ard 6

简单的回答:

以下是 Vim 命令:

:shell
Run Code Online (Sandbox Code Playgroud)

他们现在有一个 root shell。


mic*_*has 5

此配置允许该用户编辑该文件。为此,他启动了一个vim具有 root 权限的编辑器。

一旦vim命令被启动,用户可以做任何他喜欢与编辑。- 他可以打开一个不同的文件,甚至可以从 vim 中启动一个 shell。

因此,用户现在可以查看和编辑任意文件并在您的系统上运行任意命令。


小智 5

安全锁

一些程序,例如less, vi,vimmore,允许其他程序从 shell 命令运行——这就是所谓的 Shell Escape 或转义到命令解释器。在这些情况下,您可以使用NOEXEC阻止某些程序允许其他程序执行的权限。例子:

fulano ALL = (ALL) ALL NOEXEC:  /bin/vi, /usr/bin/less, /usr/bin/vim, /bin/more
Run Code Online (Sandbox Code Playgroud)

这将允许用户在运行 vim 的系统上编辑或以特权查看任何文件等,但禁止使用来自转义命令解释器的特权运行其他程序的可能性vim

重要的是sudo包括几个安全锁(默认),可以防止危险任务,例如将程序执行的标准输出 ( STDOUT)重定向到用户主目录之外的文件。

如果在/etc/sudoers用户可以使用权限运行的文件中定义/usr/bin/vim,即类似于以下内容:

fulano ALL = (ALL) /bin/echo, NOEXEC: /bin/vi, /usr/bin/vim, /bin/more, /usr/bin/less
Run Code Online (Sandbox Code Playgroud)

sudo允许定义的普通用户可以/usr/bin/vim通过以下方式运行:

sudo /usr/bin/vim
sudo vim
Run Code Online (Sandbox Code Playgroud)

但是被阻止运行 vim 如下:

cd /usr/bin
sudo ./vim
Run Code Online (Sandbox Code Playgroud)

  • 这应该是答案还是剪切和粘贴错误? (2认同)