我最近遇到了一个高可用性场景,维护程序需要将虚拟 IP 绑定到它所在的服务器,然后通过网络广播它。为此,它分别运行ip
和arp
命令。但是,我注意到任何这样的维护程序都需要sudoer
特权才能运行ip
或arp
。我没有给root
它这样的特权,但希望它仍然能够运行这两个命令。那么有解决方案吗?提前致谢。
答案1
HA 场景需要对(虚拟)IP 地址进行故障转移并发送免费 arp 请求,以确保 LAN 了解已发生 IP 故障转移。
更改系统 IP 堆栈并发送免费 arp 请求需要特权/根级别访问。
当进行这些更改的工具已经以 root 身份运行时,当然已经具有足够的特权访问权限。
当工具不以 root 身份运行时A授予该特权访问权限的方法是必要的。 sudoers 策略是一种可以授予细粒度权限的方法。
编辑:这来自@symcbean 的回答让我意识到:因为许多示例只授予不受限制和无限的权限,你可能不知道这
sudo
是明确设计的授予限制权限。以下示例仅授予用户通过root 权限george
运行这三个命令(带参数)的权限sudo
# in /etc/sudoers or as a drop-in file /etc/sudoers.d/file-name # List of privileged commands Cmnd_Alias IPFAILOVER = /usr/sbin/ip, /usr/sbin/arp, /usr/sbin/arping # allow george to run the above commands as root without having to authenticate with a password george ALL=(root) NOPASSWD: IPFAILOVER
例如,另一种方法是在这些命令上设置 set-uid root 权限,但这允许任何和所有用户发送免费 arp 请求并修改相邻系统的 ARP 缓存和/或修改系统 IP 堆栈。这可能不太可取。
答案2
这主要是评论(但评论框中没有足够的空间)。
有没有解决方案可以在不提升权限的情况下运行需要提升权限的命令? - 没有
“我不会给予这样的特权”——如果你解释了你的保留意见,那么我们可能能够建议替代方案或减轻你的担忧,例如
maintenance ALL=(root) NOPASSWD: /usr/local/bin/your_provisioning_script
允许“维护”用户仅以 root 身份运行命名的脚本。
但我很难想象一个场景,即实现高可用性的服务需要手动启动。将其作为服务运行还可以确保服务持续运行 - 那么为什么不以 root 用户身份以这种方式配置它呢?不幸的是,删除了 root 权限需要额外的工具。因此,以非特权用户身份运行服务并使用 sudo 规则执行特权操作可能更有意义。
Linux 也具有被描述为功能的权限管理系统 - 但授予功能来解决这个问题可能会破坏您不使用 root 帐户所暗示的未定义的目标。
答案3
您可以允许用户以任何用户身份通过 sudo 执行特定命令,而不执行任何其他操作(类似于 Windows 中的“以 root 身份运行”)。没有义务授予完全 root 访问权限,sudo 可以非常细化。
请阅读 sudoers 的手册。
对于 HA 场景,这或多或少就是 VRRP 的描述