如何让用户在Linux上使用sudoedit安全地编辑文件

假设你是一个公司的系统管理员,其中团队主要使用有限权限的Linux。现在想象一种情况,成员的...

假设您是一个公司的系统管理员,其中大多数团队都在有限权限的Linux上工作。 现在想象一种情况,其中一个团队的成员 - 作为一些新工作的一部分 - 需要频繁地编辑一个需要超级用户权限的文件。 你会怎么做?

一个选择是让他们获得“sudo”访问权限,但这就像让一个陌生人访问你完整的家庭,当他们需要的只是一个房间 - 我的意思是,默认的“sudo”访问将让他们做任何需要root权限的东西,当所需要的是能够编辑某个系统文件的时候。

鉴于“sudo”提供的灵活性,您可以使用另一个选项来调整“sudo”策略,只有授予相关文件编辑权限的权限。 例如,这样的东西:

%newsudo ALL = vim /path/to/file

虽然这无疑是一个比提供完整的sudo访问更好的解决方案,但仍然有一个漏洞可以利用。

要了解我在说什么,请考虑一种情况,其中 - 在上述有限访问权限中提供给组,有人使用'sudo'命令打开有问题的文件进行编辑。

现在,一个对vim具有良好了解的聪明才智将知道他们可以在编辑器中启动一个新的shell - 他们所要做的就是运行以下vim命令:

:shell

这将立即将您置于交互式外壳中。 如果您正在机器上执行这些步骤,只需执行'whoami'命令即可了解我所说的漏洞 - 是的,您以root身份登录在shell中。

下面是一个截图示例:

不用说,只提供对单个文件的编辑访问的目的被击败,用户现在可以做任何事情。

我们来看看有没有别的选择。 您可以在您的sudoers条目中使用NOEXEC标签:

%newsudo ALL = NOEXEC: vim /path/to/file

NOEXEC基本上允许您防止由 sudo 运行的程序执行 任何其他程序。 那么这是最终的解决方案吗? 不好意思 由于原因, sudoers手册如何解释这个标签:

noexec

Many systems that support shared libraries have the ability to override default library functions by pointing an environment variable (usually LD_PRELOAD) to an alternate shared library. On such systems, sudo's noexec functionality can be used to prevent a program run by sudo from executing any other programs. Note, however, that this applies only to native dynamically-linked executables. Statically-linked executables and foreign executables running under binary emulation are not affected.

The noexec feature is known to work on SunOS, Solaris, *BSD, Linux, IRIX, Tru64 UNIX, MacOS X, HP-UX 11.x and AIX 5.3 and above.
...
...
...
To enable noexec for a command, use the NOEXEC tag as documented in the User Specification section above. Here is that example again:

aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi

This allows user aaron to run /usr/bin/more and /usr/bin/vi with noexec enabled. This will prevent those two commands from executing other commands (such as a shell). If you are unsure whether or not your system is capable of supporting noexec you can always just try it out and check whether shell escapes work when noexec is enabled.

Note that restricting shell escapes is not a panacea. Programs running as root are still capable ofmany potentially hazardous operations (such as changing or overwriting files) that could lead to unintended privilege escalation.
...
...
...

如果仔细阅读以粗体突出显示的文本,您将知道NOEXEC有其自己的限制。

那么那么最可靠的解决方案呢? 嗯,这是sudoedit 。 甚至sudoers手册也推荐这个工具:

In the specific case of an editor, a safer approach is to give the user permission to run sudoedit.

Sudoedit

Sudoedit是一个内置命令,允许用户安全地编辑文件。 根据sudo手册页, 'sudoedit'等效于使用'-e'命令行选项执行'sudo'。

为什么会更好

使用'sudoedit',用户可以选择使用他们首选的编辑器 - 这与本教程开头讨论的解决方案不同 - 在用户被迫使用Vim编辑器 - 允许他们享受自己的定制。 而最大的原因,用'sudoedit',用户将自己编辑文件,而不是'root'。

Sudoedit如何工作

要使用sudoedit,sudoers中的条目应该是,例如,这样的东西:

%newsudo ALL = sudoedit /path/to/file

而“newsudo”组的一部分用户将能够通过运行以下命令来编辑该文件:

sudoedit /path/to/file

那么这个命令会做什么呢,它会首先创建你要编辑的文件的临时副本。 然后,命令将搜索SUDO_EDITOR,VISUAL和EDITOR环境变量(按此顺序),以确定应调用哪个编辑器来打开刚刚创建的临时副本。 用户完成修改工作后,更改将复制回原始文件。

以下是“sudo”命令手册页的详细说明:

-e, --edit 
Edit one or more files instead of running a command. In lieu of a path name, the string "sudoedit" is used when consulting the security policy. If the user is authorized by the policy, the followingsteps are taken:

1. Temporary copies are made of the files to be edited with
the owner set to the invoking user.

2. The editor specified by the policy is run to edit the
temporary files. The sudoers policy uses the
SUDO_EDITOR, VISUAL and EDITOR environment variables (in
that order). If none of SUDO_EDITOR, VISUAL or EDITOR
are set, the first program listed in the editor
sudoers(5) option is used.

3. If they have been modified, the temporary files are
copied back to their original location and the temporary
versions are removed.

If the specified file does not exist, it will be created. Note that unlike most commands run by sudo, the editor is run with the invoking user's environment unmodified. If, for some reason, sudo is unable to update a file with its edited version, the user will receive a warning and the edited copy will remain in a temporary file.

结论

现在,你应该有一个关于'sudoedit'的基本思想,包括什么时候使用它,以及为什么当你想要的是编辑一个文件或一些文件时,它们比使用'sudo'更好。 当然,像任何其他安全相关的工具一样,'sudoedit'已经有了很多漏洞,但在许多用例中仍然是一个推荐的解决方案。