在不使用sudo的情况下,将一组命令授予非root用户

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

现在每次他必须执行一个命令,

sudo rndc reload 

有没有一种方法可以摆脱这个sudo,但只能在一组特定的命令(并且只能用于dns-manager)?

如果我正确理解你的评论,这里的问题是,命令将通过一个连接发出,不能inputsudo默认要求的密码。 另外,在许多操作系统发行版中,sudo将默认需要一个TTY–这个程序可能没有。

但是,sudo能够拥有一个非常细致的权限结构,使得可以允许一个或多个用户发出一个没有密码和TTY的特定命令。 下面,我将展示三种方法来configuration您的需求。 无论您select哪一个,用户现在都可以发出命令sudo rndc reload而不必input密码。

(另外,这可能是不必要的,但是…… 记住在编辑sudoers文件之前先备份一下,保留一个你打开根目录的shell,以防需要恢复备份,并编辑它使用visudo而不是sudo vi /etc/sudoers 。希望这些预防措施是不必要的,但是…更好地拥有它们,不需要它们而不是相反!)

1.如果您不想要TTY任何请求

摆脱TTY要求(如果存在的话)最简单的方法是确保/etc/sudoers中以Defaults开头的行不包含单词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文件的语法,这有点复杂。 您需要为该命令创build命令别名,然后为该命令别名设置默认值,如下所示:

 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 

是。 sudo可以非常灵活地configuration。 即使如此,我也要提一下:这些types的解决scheme不应该被认为是非常安全的,只能在一个合作的环境中使用,在这个环境中,其他的控制已经到位(因此,你可以给你的忠实的下属提供这些增强的特权,但是不应该这样做,只能从网上知道的客户)。

在大多数系统中,sudoconfiguration位于/etc/sudoers中。 你可以通过谷歌search或一个man sudo命令找出它的语法。

你不应该直接编辑这个文件。 这样做可能会导致安全竞争条件。 相反,使用visudo命令(这是$EDITOR环境variables的包装)。


在configuration完sudo之后,你可以很容易地把它包装在可见的命令中。 这很简单:

  1. 为sudo包装脚本(fe /usr/local/dnsadmin/bin )创build一个目录
  2. 创build一个包装脚本,您可以在不使用sudo的情况下让它们变得可用。 这将是一个非常简单的命令,例如, /usr/local/dnsadmin/bin/rndc将会是:

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

  3. 获取这个目录到他们的PATH环境variables(例如通过系统范围或他们的本地.profile )。

虽然在rndc的特定情况下这不是一个通用的解决scheme,但根本不需要sudo

rndc可以通过本地套接字或远程端口与任何已named进程进行通信,使用密钥进行身份validation。 默认情况下(或者至less对于debian来说,这是我使用的发行版),这个文件可以在/etc/bind/rndc.keyfind,通常只有用户bind和组bind是可读的。

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

一些普通的守护进程有一些类似的设置(我个人仍然在计算这方面powerdns的可能性,但目前看起来很有希望)。 如果你不想做sudo你将不得不根据具体情况来检查你想要达到的目标。

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