我如何允许用户重新加载区域文件?

我如何允许用户重新加载区域文件?

我有一个权威 DNS 服务器池,这些服务器必须为 5 个用户托管区域,每个用户有 2 到 10 个区域。

每个用户都可以使用公钥身份验证 ssh 到服务器。我面临的要求是只要用户能够连接到服务器上的 ssh 端口,他们就必须能够更新自己的区域,而无需依赖任何其他网络通信

到目前为止,我所做的是将每个区域配置为从拥有该区域的用户的主目录加载,如以下示例所示:

zone "example.com" {
     type master;
     file "/home/example/zones/example.com";
};

我不知道是否有关于直接从用户主目录加载区域文件的建议。我尝试了几次搜索,没有找到支持或反对这种做法的建议。

它似乎可以工作,但只有在我重新启动或重新加载绑定后,更改才会生效,而我目前必须以 root 身份执行此操作。

我使用的发行版为 BIND 9.8 提供了安全补丁。因此我下载了 9.8 版的“BIND 9 管理员参考手册”,以查找用户指示 bind 重新加载区域的方法。

我找到了该rndc命令,但 BIND 上的访问控制似乎不够精细,无法仅允许使用密钥来重新加载特定区域。我可以指定允许访问的 IP 地址和 HMAC-MD5 密钥组合,但任何允许访问的此类组合都将被允许通过 调用所有命令rndc

如何允许用户重新加载他们的区域文件而不授予他们其他管理权限?

此时,我正在思考,我可以使用sudocommand选项来.ssh/authorized_keys授予用户调用特定rndc命令的权限。

这是一个可取的方法还是我应该做其他的事情?

我也考虑过使用区域传输。但我对区域传输工作原理的理解是,接收 DNS 服务器在区域传输中充当客户端,发送 DNS 服务器充当服务器。如果我的理解正确,则意味着无法让客户端向服务器提供区域的新版本。因此,如果我要采用这种方法,似乎我必须使用隐藏的主服务器设置,并且该隐藏的主服务器在 VPN 客户端上运行,出于我无法完全阐明的原因,这感觉不对。

答案1

我会通过sudo

user1    ALL=(root)    /usr/sbin/rndc reload user1.domain1.com, /usr/sbin/rndc reload user1.domain2.com
user2    ALL=(root)    /usr/sbin/rndc reload user2.domain1.com, /usr/sbin/rndc reload user2.domain2.com

答案2

您可以要求您的客户使用 git 之类的 rcs 工具来更新他们的区域文件并将其推送到主目录。在那里,创建一个带有 post 接收钩子的 git 存储库,该钩子使用 user1700494 指示的 sudo 规则运行这些命令(我还会添加 named-checkzone 和 named-checkconf)。

为了完整起见,以下是 user1700494 建议的 sudo 规则

user1    ALL=(root)    /usr/sbin/rndc reload user1.domain1.com, /usr/sbin/rndc reload user1.domain2.com
user2    ALL=(root)    /usr/sbin/rndc reload user2.domain1.com, /usr/sbin/rndc reload user2.domain2.com

这样,您就可以将所有内容保存在版本控制中,以便在必要时轻松返回,并且您的用户无需登录并修改服务器上的文件,一切都可以在他们自己的环境中完成。此外,您只需在验证文件正确后重新加载服务器即可。

答案3

我建议每个绑定实例都在 LXC 上运行。每个用户都有自己的绑定实例。向他们提供各自实例的凭据。

相关内容