强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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-second0(禁用)同一客户端每秒最大相同响应数
window15速率计算窗口(秒)
slip2丢弃/截断比例
ipv4-prefix-length24IPv4 聚合网段长度
ipv6-prefix-length56IPv6 聚合网段长度
max-table-size20000限速表最大条目

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 53DNS 查询客户端查询
TCP 53DNS 区域传输主从同步、大响应
TCP 953rndc 管理远程管理(仅限管理网络)

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/容器进程隔离
日志审计检测异常行为
防火墙网络层防护

💡 小技巧

  1. 最小权限原则:只开放必要的访问权限。
  2. 多层防护:ACL + 防火墙 + 容器化。
  3. 定期安全审计:检查配置和日志。
  4. 使用 TSIG 保护所有管理操作
  5. 监控异常查询模式:可能是攻击前兆。

📖 扩展阅读