sudo 命令尝试搜索主机名

sudo 命令尝试搜索主机名

最近,我通过 /etc/hostname 更改了 sudoers 文件和主机名。更改这些文件后,我的 sudo 命令花费了大量时间。此外,它显示 sudo 无法解析主机 kaagini(我的机器的主机名)。

为什么 sudo 必须知道主机名才能提供某些权限?

我的 sudoers 文件有一个命令“Defaults env_reset”。我看到了一些类似的问题,但这里的上下文不是远程登录。错误显示在本地主机上。

最初在谷歌上搜索该问题时,我发现 /etc/hosts 文件必须包含 127.0.0.1 的实际主机名。这解决了我的问题。但我真正的问题是:为什么我们需要 sudo 这样做?无论登录位置如何,sudo 都应该正常工作吗?

答案1

/etc/sudoers文件旨在能够分布在多个服务器之间。为了实现这一点,文件中的每个权限都有一个主机部分。

这通常设置为ALL=意味着权限对任何服务器都有效,但是可以设置为特定主机:

%sudo    kaagini=(ALL) ALL

为了让 sudo 知道是否应该应用此规则,它需要查找它正在运行的主机。它使用依赖于/etc/hosts正确的调用,这就是为什么如果不正确它就会失败。

有人可能会争辩说,sudo如果主机部分设置ALL=为所有权限,则不需要费心进行名称查找,但它就是不起作用——它似乎在处理规则之前就确定了它的运行位置。

这实际上是为了便于维护,因为 sudo 仅读取 /etc/sudoers 来查看用户可以在当前机器上执行的操作。但是,作为拥有 100 台服务器的管理员,这可能需要维护 100 个不同的 /etc/sudoers 文件。由于 sudoers 在权限中有一个主机部分,因此您可以维护单个 sudoers 文件并将其分发到所有机器,同时仍然可以精确控制用户可以在每台机器上执行的操作。

答案2

感谢链接错误报告由 Matthias Urlichs 在另一条评论中提出,以下命令为我解决了该问题:

Defaults !fqdn

将此行放入/etc/sudoers文件中

答案3

木偶是一款配置管理软件,能够通过读取 Puppet Manifests 文件自动配置一组服务器。此类文件可能包含 /etc/sudoers 文件的定义,然后可以从 Puppet“主机”推送到所有 Puppet“代理”。然后,所有主机都将获得相同的 /etc/sudoers 文件副本,该文件可以(并且应该)包含 HOST 定义,因此您可以授予某些用户一些命令一些主持人(但对其他人则不然)。

相关内容