BIND DNS 服务器搭建完全教程 / 第 12 章:安全加固
本章概述
DNS 服务器是互联网基础设施的关键部分,也是攻击者的主要目标。本章全面讲解 BIND 的安全加固措施,包括 ACL 配置、TSIG 认证、速率限制、版本隐藏、chroot 隔离等。
12.1 安全威胁概览
12.1.1 DNS 常见攻击类型
| 攻击类型 | 描述 | 影响 |
|---|
| DNS 放大攻击 | 利用开放递归服务器进行 DDoS | 带宽耗尽 |
| 缓存投毒 | 注入虚假 DNS 记录 | 流量劫持 |
| 区域传输泄露 | 未授权获取区域数据 | 信息泄露 |
| DNS 隧道 | 利用 DNS 协议传输数据 | 数据泄露 |
| NXDOMAIN 攻击 | 大量查询不存在域名 | 缓存污染 |
| 重绑定攻击 | 绕过同源策略 | 内网访问 |
12.2 ACL 访问控制
12.2.1 分层 ACL 策略
// 定义信任级别
acl "trusted" {
localhost;
localnets;
192.168.0.0/16;
10.0.0.0/8;
};
acl "monitoring" {
10.0.0.50;
10.0.0.51;
};
acl "secondary-servers" {
192.168.1.11;
192.168.2.10;
};
acl "bad-actors" {
// 已知恶意 IP
185.220.101.0/24;
185.220.102.0/24;
};
options {
// 查询控制
allow-query { trusted; };
allow-query-cache { trusted; };
// 递归控制
allow-recursion { trusted; };
// 区域传输控制
allow-transfer { secondary-servers; };
// 完全封锁恶意 IP
blackhole { bad-actors; };
};
12.2.2 ACL 层次结构
客户端查询
├── blackhole? → 直接丢弃(不响应)
├── allow-query? → 是否允许查询
│ ├── allow-query-cache? → 是否允许查询缓存
│ │ └── allow-recursion? → 是否允许递归
│ └── 权威数据查询
└── REFUSED
12.3 隐藏版本信息
12.3.1 版本隐藏配置
options {
// 隐藏 BIND 版本
version "not disclosed";
// 隐藏主机名
hostname "not disclosed";
// 隐藏服务器 ID
server-id "not disclosed";
};
12.3.2 验证隐藏
# 查询版本
dig @127.0.0.1 version.bind txt chaos
# 应返回 "not disclosed" 而非实际版本
# 查询主机名
dig @127.0.0.1 hostname.bind txt chaos
# 查询服务器 ID
dig @127.0.0.1 id.server txt chaos
12.4 速率限制(RRL)
12.4.1 什么是 RRL
RRL(Response Rate Limiting)限制相同响应的发送速率,防止 DNS 放大攻击。
options {
// 启用响应速率限制
rate-limit {
responses-per-second 10; // 相同响应每秒最多 10 个
referrals-per-second 5; // 推荐响应每秒 5 个
nodata-per-second 5; // NODATA 响应每秒 5 个
nxdomains-per-second 5; // NXDOMAIN 响应每秒 5 个
errors-per-second 5; // 错误响应每秒 5 个
all-per-second 20; // 所有响应每秒 20 个
window 15; // 速率计算窗口(秒)
slip 2; // 每 2 个丢弃的响应中返回 1 个截断响应
// slip 1 = 100% 截断响应
// slip 2 = 50% 截断响应,50% 丢弃
// slip 0 = 100% 丢弃(不推荐,会导致客户端重试)
ipv4-prefix-length 24; // IPv4 聚合前缀长度
ipv6-prefix-length 56; // IPv6 聚合前缀长度
max-table-size 20000; // 限速表最大条目数
min-table-size 500; // 限速表最小条目数
qps-scale 250; // QPS 缩放因子
};
};
12.4.2 RRL 参数说明
| 参数 | 默认值 | 说明 |
|---|
responses-per-second | 0(禁用) | 同一客户端每秒最大相同响应数 |
window | 15 | 速率计算窗口(秒) |
slip | 2 | 丢弃/截断比例 |
ipv4-prefix-length | 24 | IPv4 聚合网段长度 |
ipv6-prefix-length | 56 | IPv6 聚合网段长度 |
max-table-size | 20000 | 限速表最大条目 |
12.4.3 RRL 排除白名单
acl "rate-limit-whitelist" {
localhost;
192.168.1.0/24; // 内网不限速
10.0.0.0/8;
};
options {
rate-limit {
responses-per-second 10;
// 不在白名单中的客户端受速率限制
};
};
// 注意:RRL 不支持直接排除,需要通过 allow-query 控制
// 或使用 views 区分内外网
12.5 TSIG 认证
12.5.1 TSIG 使用场景
| 场景 | 用途 |
|---|
| 区域传输 | 保护主从数据同步 |
| 动态更新 | 认证 DDNS 更新请求 |
| rndc 管理 | 认证远程管理操作 |
| 视图匹配 | 基于密钥区分视图 |
12.5.2 生成强密钥
# 生成 256 位 HMAC-SHA256 密钥
tsig-keygen -a hmac-sha256 my-key
# 输出格式
# key "my-key" {
# algorithm hmac-sha256;
# secret "base64encodedstring==";
# };
12.5.3 最佳实践
// 为不同用途使用不同密钥
key "transfer-key" { // 区域传输
algorithm hmac-sha256;
secret "...";
};
key "update-key" { // 动态更新
algorithm hmac-sha256;
secret "...";
};
key "rndc-key" { // 管理操作
algorithm hmac-sha256;
secret "...";
};
12.6 chroot 隔离
12.6.1 chroot 概述
chroot 将 BIND 进程限制在特定目录中,即使被攻破也无法访问系统其他部分。
12.6.2 RHEL/CentOS chroot 配置
# 安装 chroot 包
sudo yum install bind-chroot
# 启动 chroot 模式
sudo systemctl enable named-chroot
sudo systemctl start named-chroot
# chroot 目录结构
/var/named/chroot/
├── etc/
│ └── named.conf
├── var/
│ ├── named/
│ └── log/named/
└── run/named/
12.6.3 Docker 中的安全隔离
// 使用最小权限运行
// Dockerfile 中使用非 root 用户
// USER bind
详见 第 13 章 Docker 部署。
12.7 DNSSEC 安全
12.7.1 签名区域安全
zone "example.com" {
type primary;
file "primary/example.com.zone";
// DNSSEC 自动签名
inline-signing yes;
auto-dnssec maintain;
key-directory "primary/keys";
// 密钥文件权限
// 600 for private keys
// 644 for public keys
};
12.7.2 递归服务器 DNSSEC 验证
options {
// 启用 DNSSEC 验证(默认 auto)
dnssec-validation auto;
// 信任锚文件
bindkeys-file "/etc/bind/bind.keys";
};
12.8 日志安全
12.8.1 安全审计日志
logging {
channel security_audit {
file "/var/log/named/security.log" versions 10 size 100m;
severity info;
print-time yes;
print-severity yes;
print-category yes;
};
// 安全相关日志
category security { security_audit; };
category update-security { security_audit; };
category rate-limit { security_audit; };
};
12.8.2 监控异常查询
# 临时开启查询日志
rndc querylog on
# 分析异常查询
# 查找 NXDOMAIN 查询(可能是扫描)
grep "NXDOMAIN" /var/log/named/query.log | awk '{print $NF}' | sort | uniq -c | sort -rn | head
# 查找高频查询
awk '{print $NF}' /var/log/named/query.log | sort | uniq -c | sort -rn | head
12.9 防火墙配置
12.9.1 必要端口
| 协议 | 端口 | 用途 |
|---|
| UDP 53 | DNS 查询 | 客户端查询 |
| TCP 53 | DNS 区域传输 | 主从同步、大响应 |
| TCP 953 | rndc 管理 | 远程管理(仅限管理网络) |
12.9.2 iptables 规则
# 允许 DNS 查询(限制来源)
iptables -A INPUT -p udp --dport 53 -s 192.168.0.0/16 -j ACCEPT
iptables -A INPUT -p tcp --dport 53 -s 192.168.0.0/16 -j ACCEPT
# 允许区域传输(仅限从服务器)
iptables -A INPUT -p tcp --dport 53 -s 192.168.1.11 -j ACCEPT
# 允许 rndc 管理(仅限管理网络)
iptables -A INPUT -p tcp --dport 953 -s 10.0.0.0/8 -j ACCEPT
# 丢弃其他 DNS 流量
iptables -A INPUT -p udp --dport 53 -j DROP
iptables -A INPUT -p tcp --dport 53 -j DROP
12.9.3 firewalld 规则
# 限制 DNS 访问来源
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.0.0/16" service name="dns" accept'
sudo firewall-cmd --reload
12.10 系统安全加固
12.10.1 运行用户
# 确保 BIND 以非特权用户运行
# named 用户(默认)
ps aux | grep named
# named 1234 /usr/sbin/named -u named
12.10.2 文件权限
# 配置文件权限
sudo chmod 640 /etc/named.conf
sudo chown root:named /etc/named.conf
# 区域文件权限
sudo chmod 640 /var/named/primary/*.zone
sudo chown named:named /var/named/primary/*.zone
# 密钥文件权限
sudo chmod 600 /var/named/primary/keys/*.private
sudo chown named:named /var/named/primary/keys/*.private
# 日志目录权限
sudo chmod 750 /var/log/named
sudo chown named:named /var/log/named
12.10.3 SELinux/AppArmor
# SELinux (RHEL/CentOS)
# 检查 SELinux 状态
getenforce
# 允许 BIND 访问自定义目录
sudo semanage fcontext -a -t named_zone_t "/var/cache/bind/primary(/.*)?"
sudo restorecon -Rv /var/cache/bind/primary
# AppArmor (Ubuntu/Debian)
# 配置文件:/etc/apparmor.d/usr.sbin.named
12.11 安全检查清单
| 检查项 | 状态 | 配置 |
|---|
| 隐藏版本信息 | ✅/❌ | version "not disclosed" |
| 限制递归 | ✅/❌ | allow-recursion { trusted; } |
| 限制查询 | ✅/❌ | allow-query { trusted; } |
| 区域传输控制 | ✅/❌ | allow-transfer { secondary; } |
| 速率限制 | ✅/❌ | rate-limit { ... } |
| TSIG 密钥 | ✅/❌ | key "..." { algorithm hmac-sha256; ... } |
| DNSSEC 验证 | ✅/❌ | dnssec-validation auto |
| chroot 隔离 | ✅/❌ | 使用 chroot 或容器 |
| 文件权限 | ✅/❌ | 640/600 权限 |
| 防火墙规则 | ✅/❌ | 限制来源 IP |
| 日志审计 | ✅/❌ | 安全日志开启 |
12.12 本章小结
| 安全措施 | 作用 | 优先级 |
|---|
| ACL 访问控制 | 限制谁能查询/递归 | 高 |
| 隐藏版本 | 防止信息泄露 | 中 |
| RRL 速率限制 | 防止放大攻击 | 高 |
| TSIG 认证 | 保护管理操作和传输 | 高 |
| DNSSEC | 防止缓存投毒 | 高 |
| chroot/容器 | 进程隔离 | 中 |
| 日志审计 | 检测异常行为 | 高 |
| 防火墙 | 网络层防护 | 高 |
💡 小技巧
- 最小权限原则:只开放必要的访问权限。
- 多层防护:ACL + 防火墙 + 容器化。
- 定期安全审计:检查配置和日志。
- 使用 TSIG 保护所有管理操作。
- 监控异常查询模式:可能是攻击前兆。
📖 扩展阅读