尽管您限制了命令行参数,但是没有什么可以阻止用户使用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
手册还有一个完整的章节,说明如何使用和选项为外壳脱壳提供有限的保护。RESRICT
NOEXEC
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)。
vim
,用户可以自由打开并写入他喜欢的任何文件。