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
然后
:r /etc/sudoers
注意:除非受 SELinux 限制,否则用户可以通过这种方式读取任何文件!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
手册还有一整节如何使用和选项提供有限的外壳逃逸保护。RESRICT
NOEXEC
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
具有 root 权限的编辑器。
一旦vim
命令被启动,用户可以做任何他喜欢与编辑。- 他可以打开一个不同的文件,甚至可以从 vim 中启动一个 shell。
因此,用户现在可以查看和编辑任意文件并在您的系统上运行任意命令。
小智 5
安全锁
一些程序,例如less
, vi
,vim
和more
,允许其他程序从 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)