在没有sudo的情况下向非root用户授予一组命令的访问权限


13

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

现在,每次他必须执行命令时,他都会输入

sudo rndc reload

有什么办法可以摆脱此sudo的困扰,但只能在特定的一组命令上使用(并且仅适用于dns-manager)?


5
像这样的自由访问控制几乎就是sudo它的用途。您sudo对此有何异议?
MadHatter

1
@peterh我重复我的问题:自由访问控制(即部分sysadm委派)是的角色sudo。有什么异议?
MadHatter

3
sudo那么无密码呢?或使用密码sudo 运行DNS管理工具,然后可以named根据需要使用组或用户特权或root特权进行操作。
MadHatter

4
@peterh“这样做的一个很好的理由”将是缺少的地方。通常,类似这样的问题实际上是变相的XY问题,而且我发现了解基本问题是全面,专业地回答问题的关键。
MadHatter

2
@peterh我想我们彼此同意。我也希望看到OP改善他的问题;深入研究它对我来说是一种很好的方式,可以帮助作者在自己周围建立的框框之外思考。他可能有充分的理由要避免sudo。在试图向我们表达它时,他可能会消除我们的困惑,或者消除他自己的困惑,或者同时消除两者!
MadHatter

Answers:


31

如果我正确理解了您的评论,那么这里的问题是该命令将通过没有输入sudo默认请求密码的能力的连接发出。同样,在许多OS发行版中,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

当然,这可以与使用sudo调用命令的包装器脚本结合使用,如果由于某种原因即使没有密码也无法直接使用sudo。
珍妮·D

4

是。sudo可以非常灵活地配置。即使这样,我也必须提到:这些类型的解决方案不应被认为是非常安全的,它们只能在具有其他控件的合作环境中使用(因此,您可以将这些增强的特权授予忠实的下属,但是不应该对仅通过网络认识的客户这样做)。

/etc/sudoers在大多数系统中都使用sudo配置。您可以通过谷歌搜索或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环境变量中(例如,通过系统范围或它们的local .profile)。


出于好奇-为什么要exec在shell脚本中使用而不是直接调用命令?(我并不是说这是错误的,我只是想知道您为什么要这样做,这样我才可以学习一些东西)
珍妮·D

2
我完成了无密码的sudo位,包装脚本的想法很棒。
Anss

2
@JennyD :-)因为稳定性和性能。在的情况下exec,被调用的命令将代替shell。外壳会消失。如果没有exec,shell将启动该命令,然后等待其终止,然后退出。第二个,无执行程序意味着不需要多个协作过程。但是并没有什么大的区别,没有exec的话,这项工作就不会那么好。
彼得-恢复莫妮卡

@JennyD我的请求:-)
peterh-恢复莫妮卡2015年

@Snowbody非常感谢您的指导!这是一个很大的荣誉。
peterh-恢复莫妮卡2015年

2

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

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

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

数量惊人的常见守护程序都进行了类似的设置(我个人仍在弄清powerdns在这方面的可能性,但到目前为止看起来很有希望)。如果您不想这样做sudo,则必须逐案检查您是否想完成什么。


-1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.