我有一个权威 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
。
如何允许用户重新加载他们的区域文件而不授予他们其他管理权限?
此时,我正在思考,我可以使用sudo
或command
选项来.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 上运行。每个用户都有自己的绑定实例。向他们提供各自实例的凭据。