使用普通用户管理DNS服务器

使用 Bind 提供的 DNS 服务器,要想配置和管理,默认情况下需要求以 root 身份进行。如果是多人维护的情况,root 用户权限过高,这导致如果有人做了误操作将会产生十分严重的后果。并且一旦 DNS 服务器被入侵,黑客将有可能直接获取到 root 用户权限,安全代价太高。

Linux 系统规定非 root 用户一般无法启动小于 1024 的端口,而 DNS 服务器使用 named 进程默认监听于 udp 协议的 53 号端口,如果我们将其服务的端口改为非默认的大于 1024 的,就需要修改大量的配置文件,并且影响很大。

普通用户用 passwd 命令修改自己的密码,实际上最终更改的是 /etc/passwd 文件,此文件是用户管理配置文件,并且只有 root 用户才能更改。既然是 root 用户才拥有此权限,为什么我们可以通过 passwd 命令来修改密码呢,那这就要归功于 passwd 设置了 SUID 权限位了。

因此,我们完全可以对启用 DNS 服务的命令 /usr/sbin/named 也添加一个 SUID 权限,这样普通用户就能实现启动一个只有 root 才能启用小于 1024 的端口了。

1
2
3
4
5
6
[root@bogon ~]# useradd user1  
[root@bogon ~]# echo 'user1' | passwd user1 --stdin
Changing password for user user1.
passwd: all authentication tokens updated successfully.
[root@bogon ~]# chmod u+s /usr/sbin/named
[root@bogon ~]# su - user1

创建好普通用户和密码,对 named 命令添加 s 位权限后,就使用普通用户启动一个进程。

1
2
3
4
[user1@bogon ~]$ /usr/sbin/named -c /var/named/named.conf          
[user1@bogon ~]$ ps -ef | grep named
root 7320 1 4 11:33 ? 00:00:00 /usr/sbin/named -c /var/named/named.conf
user1 7325 7237 0 11:33 pts/1 00:00:00 grep --color=auto named

一旦配置文件更新了,普通用户也可以使用 pkill -1 PID 来重载对应的进程了。

1
[user1@bogon ~]$ kill -1 7320

一切都配置完成后,使用 dig 命令测试并验证结果。

1
[user1@bogon ~]$ dig -t A www.baidu.com @192.168.127.136
有钱任性,请我吃包辣条
0%