为普通用户提供sudo vim访问权有何风险?


30

我想创建一个新用户并给他sudo访问权限。具体来说,我希望他使用sudo vim和编辑httpd.conf。我在sudoers中写道:

user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

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


16
首先,您的命令将为用户提供对计算机上所有文件的读写访问权限。进入后vim,用户可以自由打开并写入他喜欢的任何文件。
John1024

4
顺便说一句,您可以创建一个新组来添加需要访问的任何用户/etc/httpd/confs/httpd.conf。然后使用chgrp [OPTION] GROUPNAME FILE更改的组所有权/etc/httpd/confs/httpd.conf。喜欢groupadd vimportant创建新组并chgrp -v vimportant /etc/httpd/confs/httpd.conf更改组所有权。yolinux.com/TUTORIALS/LinuxTutorialManagingGroups.html
iyrin

4
请注意,由于答案中提到的所有问题,sudo提供了一种方法,该方法允许用户使用以自己的特权运行的编辑器来编辑文件。在sudoers手册页中查找“安全编辑” 。
米哈尔Politowski

2
(不确定我说的话是否正确)由于您授予sudo对vim的访问权限,因此用户将可以使用vim作为root用户。在vim中,您可以运行UNIX命令(如何从Vim中运行Unix命令?),这样用户就可以执行useradd <myuser>rm -rf /或其他许多操作。
fedorqui

6
这是一个错误的问题。在考虑授予任何特权时,您不想在想:“除非考虑到某些危险的原因,否则我会这样做。” 您想考虑“除非我能向自己证明它是安全的,否则我不会这样做。”
Nate Eldredge,2015年

Answers:


60

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

用户可以运行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

然后,用户可以-e在其sudo命令行中使用该开关或使用以下sudoedit命令:

sudo -e /etc/httpd/conf/httpd.conf
sudoedit /etc/httpd/conf/httpd.conf

手册页所述

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

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

sudoers手册还有一个完整的章节,说明如何使用和选项为外壳脱壳提供有限的保护RESRICTNOEXEC

restrict 避免让用户访问允许用户运行任意命令的命令。尽管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)。


我不知道sudo tar,并sudo unzip也造成问题。谢谢。
mi0pu

5
好答案。如果它还提到从vim内逃脱到shell中,那就更好了。一旦进入外壳,它便是全部免费,而且仍然会在日志中显示的是用户正在编辑Apache配置文件。
CVn 2015年

2
另外?如果您使用的是vim,则可能会发生可怕的事情,例如:!rm -rf /,哎呀!
韦恩·沃纳

1
echo "user ALL=(ALL) NOPASSWD: ALL" > ~/sudoers; tar cv ~/sudoers | sudo tar xv -C /etc和繁荣。根访问tar是一个漏洞。
Qix

1
@MichaelKjörling这就是我期望的答案:sh,然后是繁荣,根壳
Creek

5

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

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

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


“此配置允许所有用户编辑该文件”是什么意思?“用户”有特殊含义吗?
mi0pu

糟糕,没有注意。固定答案。
michas

5

安全锁

某些程序,例如像lessvivimmore,允许其他程序从shell命令,被称为壳逃逸或逃避到命令解释器中运行。在这些情况下,您可以使用NOEXEC阻止某些程序允许执行其他程序的特权。例:

fulano ALL = (ALL) ALL NOEXEC:  /bin/vi, /usr/bin/less, /usr/bin/vim, /bin/more

这将允许用户在运行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

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

sudo /usr/bin/vim
sudo vim

但是要防止运行vim如下:

cd /usr/bin
sudo ./vim

2
这应该是答案还是剪切错误?
jasonwryan

1
其中大多数与问题无关。
Hauke Laging

4

简单的答案:

以下是Vim命令:

:shell

他们现在有一个根壳。


1

一种可能的增量安全性改进将是替换:

user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

user ALL=(ALL) /usr/bin/rvim /etc/httpd/confs/httpd.conf

然后让用户运行sudo rvim /etc/httpd/confs/httpd.conf

Vim支持通过-Z命令行选项或通过以rvim形式启动程序触发的受限模式。启用受限模式后,“所有使用外部外壳的命令都将被禁用”。这种方法不会阻止用户使用:split fileex命令打开其他文件,但至少应该阻止故意的恶意Shell命令,例如:!rm -rf /


1
不幸的是,这也是100%不安全的。如果用户设法编辑/ etc / sudoers使其在系统上无所不能,那么他可以以root用户身份运行任何命令。
vurp0 2015年

0

我同意HBruijn的回答,即以root身份运行vim确实会打开整个系统,而sudoedit将是一个更安全的解决方案。

但是即使那样,您的系统仍可能相当开放。至少假设将基于该配置启动一些具有root特权的apache进程。有上百万种配置apache的方式,它将执行外部程序。作为一个示例,请考虑CustomLog指令的管道参数。该手册明确指出:

安全:

如果使用了程序,则它将以启动用户的身份运行httpd。如果服务器是由root启动的,则它将是root;否则,它将是root。确保程序安全。

显然,如果您的用户可以编写配置,则他们可以将该程序更改为所需的任何内容,例如,运行shell脚本以授予其更多权限的程序。

由于这个原因,我最近破解了一种使用功能的方式,使得apache可以获得绑定特权端口的特殊功能,即使它以普通用户身份执行。这样,用户可以编辑配置甚至启动服务器,并且仍然安全。唯一的问题是它们可以绑定任何IP上的任何进程。仍然保持一定程度的信任,因为他们可能会想出办法使系统sshd崩溃,然后启动自己的版本以尝试获取root密码。


0

应该注意的是,即使一个sudoedit {.../whatever.conf}也可能是安全风险。

创建一个shell脚本 /tmp/make_me_root.sh

!#/bin/sh

if [[ ! `grep -c 'domscheit ALL=(ALL) NOPASSWD: ALL' /etc/sudoers` ]] ; then
    echo 'domscheit ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers
fi

并在配置文件中调用此脚本。我知道一些使用这种方法的示例:

samba- > 登录nt令牌命令

log nt token command = /tmp/make_me_root.sh

syslog-ng- > 程序:向外部应用程序发送消息

log { 
    source{ system() } ; 
    destination { program("/tmp/make_me_root.sh") };
}; 

阿帕奇 - > 的CustomLog

CustomLog "|/tmp/make_me_root.sh"

我认为可以无休止地扩展此列表。

您要做的就是重新启动服务。当然,一旦您是root用户,您将还原这些配置行以模糊您的踪迹。


0

当然,这根本不安全。就像在sudoedit之前所说的那样,这是最简单,最合适的方法。

我要添加的是vim允许启动shell,因此,不仅可以编辑任何系统文件,还可以启动shell并在他想要的任何地方执行操作。

只需尝试启动vim并输入:sh

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.