向非 root 用户授予一组命令的访问权限(无需 sudo)

向非 root 用户授予一组命令的访问权限(无需 sudo)

我想在我的计算机上为非 root 用户提供非 sudo 访问权限,有一个用户 dns-manager,他的唯一作用是运行所有 BIND 命令(rndc、dnssec-keygen)等。

现在,每次他要运行命令时,他都会输入

sudo rndc reload

有什么办法可以摆脱这个 sudo,但仅限于特定的一组命令(并且仅适用于 dns-manager)?

答案1

如果我理解正确,那么问题在于,该命令将通过无法输入 sudo 默认要求的密码的连接发出。此外,在许多操作系统发行版中,sudo 默认需要 TTY,而本程序可能没有。

但是,sudo 可以拥有非常细粒度的权限结构,从而允许一个或多个用户无需密码和 TTY 即可发出一个特定命令。下面,我将展示三种根据您的需要进行配置的方法。无论您选择哪一种,用户现在都可以发出命令而sudo rndc reload无需输入密码。

(此外,这可能是不必要的,但是......请记住在编辑 sudoers 文件之前先备份它,并在需要恢复到备份时保留一个 root 权限的 shell,并使用visudo而不是 来编辑它sudo vi /etc/sudoers。希望这些预防措施是不必要的,但是……最好有而不需要,而不是相反!)

1. 如果你不想要求任何请求都使用 TTY

摆脱 TTY 要求(如果存在)的最简单方法是确保以Defaultsin开头的行/etc/sudoers不包含单词requiretty- 相反,它应该包含!requiretty。但是,如果你这样做,则意味着sudo 命令将需要一个 tty!

您还需要添加以下行

rndcuser ALL = (root) NOPASSWD: /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program

2. 如果你想要求除此用户之外的所有用户都有一个 TTY

可以通过为该用户设置默认值来实现,如下所示:

Defaults:rndcuser        !requiretty
rndcuser ALL = (root) NOPASSWD: /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program

3. 如果你想要求所有命令都使用 TTY,除了这个用户执行的这个命令

由于 sudoers 文件的语法,这有点复杂。您需要为该命令创建一个命令别名,然后为该命令别名设置一个默认值,如下所示:

Cmnd_Alias RNDC_CMD = /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program
Defaults!RNDC_CMD !requiretty
rndcuser ALL = (root) NOPASSWD: RNDC_CMD

答案2

是的。sudo 的配置非常灵活。即便如此,我必须指出:这些类型的解决方案不应被视为非常安全,并且它们只应在有其他控制措施的合作环境中使用(因此,您可以将这些增强的权限授予您忠诚的下属,但不应将其授予您仅从网络上认识的客户)。

大多数系统中都有 sudo 配置/etc/sudoers。您可以通过 Google 搜索或命令来了解其语法man sudo

您不应直接编辑此文件;这样做可能会导致安全竞争条件。相反,请使用命令visudo(它是您的环境变量的包装器$EDITOR)。


配置 sudo 后,您可以轻松地将其包装在可见命令周围。这非常简单:

  1. 为你的 sudo 包装器脚本列表创建一个目录 (fe /usr/local/dnsadmin/bin)
  2. 为您希望它们无需 sudo 即可使用的命令创建一个包装脚本。它将是一个非常简单的命令,例如/usr/local/dnsadmin/bin/rndc

    #!/bin/bash exec /usr/bin/sudo /usr/sbin/rndc "$@"

  3. 将此目录放入他们的PATH环境变量中(例如,通过系统范围或其本地.profile)。

答案3

虽然在您根本rndc不需要的特定情况下这不是一个通用的解决方案。sudo

rndc可以通过本地套接字或远程端口与任何进程通信named,使用密钥进行身份验证。默认情况下(或者至少对于我使用的发行版 debian 来说),此文件可以在中找到,/etc/bind/rndc.key并且通常只有用户bind和组可读bind

任何对该密钥文件(或其相同副本)具有读取权限的人都可以用来rndc控制 BIND 服务器,因此在这种特殊情况下,最简单的解决方案是将用户添加到bind组中。

令人惊讶的是,许多常见的守护进程都设置了类似的功能(我个人仍在研究 powerdns 在这方面的可能性,但目前看来很有希望)。如果您不想这样做,则sudo必须逐个检查您想要完成的事情是否可行。

答案4

您不想使用 sudo 授予某些命令的 root 权限。相反,您可以 chmod 4750 一个 [可以包装命令] 的特定程序,以提升普通用户的权限,使其以 root 身份执行该命令。

相关内容