![向非 root 用户授予一组命令的访问权限(无需 sudo)](https://linux22.com/image/654306/%E5%90%91%E9%9D%9E%20root%20%E7%94%A8%E6%88%B7%E6%8E%88%E4%BA%88%E4%B8%80%E7%BB%84%E5%91%BD%E4%BB%A4%E7%9A%84%E8%AE%BF%E9%97%AE%E6%9D%83%E9%99%90%EF%BC%88%E6%97%A0%E9%9C%80%20sudo%EF%BC%89.png)
我想在我的计算机上为非 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 要求(如果存在)的最简单方法是确保以Defaults
in开头的行/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 后,您可以轻松地将其包装在可见命令周围。这非常简单:
- 为你的 sudo 包装器脚本列表创建一个目录 (fe
/usr/local/dnsadmin/bin
) 为您希望它们无需 sudo 即可使用的命令创建一个包装脚本。它将是一个非常简单的命令,例如
/usr/local/dnsadmin/bin/rndc
:#!/bin/bash exec /usr/bin/sudo /usr/sbin/rndc "$@"
将此目录放入他们的
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 身份执行该命令。