我想创建一个新用户并授予他 sudo 访问权限。具体来说,我希望他使用sudo vim
和编辑httpd.conf。我在 sudoers 中写了这个:
user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf
然而,我听说这可能有风险。为什么这是有问题的?问题有多严重?
答案1
尽管您限制了命令行参数,但没有什么可以阻止用户使用 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
向任何编辑者授予权限时存在安全风险。
这或多或少与向诸如tar
和 等命令授予 sudo 根级别权限unzip
通常不安全的原因相同,没有什么可以阻止您在存档中包含系统二进制文件或系统配置文件的替换文件。
正如许多其他评论员指出的那样,第二个风险vim
是外壳逃逸,您可以在其中从 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
(5) 使用选项。- 如果它们已被修改,临时文件将被复制回其原始位置,并删除临时版本。
如果指定的文件不存在,则会创建该文件。
请注意,与 sudo 运行的大多数命令不同,编辑器在调用用户的环境未修改的情况下运行。如果由于某种原因 sudo 无法使用其编辑版本更新文件,用户将收到警告,并且编辑后的副本将保留在临时文件中。
这sudoers
手册还有一整节如何提供有限的防止外壳逃逸与RESRICT
和NOEXEC
选项。
restrict
避免授予用户访问允许用户运行任意命令的命令的权限。许多编辑器都具有禁用 shell 转义的受限模式,尽管 sudoedit 是通过 sudo 运行编辑器的更好解决方案。由于大量程序提供 shell 转义功能,将用户限制在不提供 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)。
答案2
简单的答案:
以下是 Vim 命令:
:shell
他们现在有了一个 root shell。
答案3
此配置允许该用户编辑该文件。为此,他启动了一个vim
具有 root 权限的编辑器。
命令启动后vim
,用户可以使用该编辑器做任何他喜欢做的事情。 - 他可以打开不同的文件,甚至可以从 vim 中启动 shell。
因此,用户现在可以在系统上查看和编辑任意文件并运行任意命令。
答案4
一种可能的增量安全改进是替换:
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 启动程序来触发的受限模式。启用限制模式后,“所有使用外部 shell 的命令都将被禁用”。这种方法不会阻止用户使用:split file
ex 命令打开其他文件,但至少应该阻止故意恶意的 shell 命令,例如:!rm -rf /
.