/etc/resolv.conf加固需设权限644且属主root,防动态覆盖需结合systemd-resolved或networkmanager配置并用chattr +i锁定,限制resolvconf命令权限,审计写入行为,容器中挂载为只读,最后验证解析正常。

/etc/resolv.conf 是 Linux 系统中 DNS 客户端解析的核心配置文件,其内容直接影响域名查询行为。若该文件权限宽松或被恶意篡改,可能导致 DNS 劫持、域名污染或服务中断。加固重点在于控制写入权限、防止覆盖,并确保配置来源可信。
确认当前文件权限与属主
执行 ls -l /etc/resolv.conf 查看实际权限。正常应为 -rw-r--r-- 1 root root(即 644),且属主属组均为 root。若出现 world-writable(如 666、777)或属主非 root(如属普通用户),存在明显风险。
- 临时修复命令:sudo chown root:root /etc/resolv.conf && sudo chmod 644 /etc/resolv.conf
- 注意:部分系统(如使用 systemd-resolved 或 NetworkManager)会动态管理该文件,直接修改可能被覆盖,需结合后续机制加固
防止被网络管理服务自动覆盖
NetworkManager、systemd-resolved、dhcpcd 等服务默认会重写 /etc/resolv.conf,导致手动加固失效。需明确 DNS 配置的权威来源并锁定文件:
- 若使用 systemd-resolved:启用其 stub 模式后,让 /etc/resolv.conf 指向 /run/systemd/resolve/stub-resolv.conf,再用 sudo chattr +i /etc/resolv.conf 锁定(需 root 权限,+i 后连 root 也无法修改,解除用 chattr -i)
- 若使用 NetworkManager:在 /etc/NetworkManager/NetworkManager.conf 的 [main] 段添加 dns=none,再手动配置 /etc/resolv.conf 并设为不可变
- 验证是否生效:重启对应服务(如 sudo systemctl restart NetworkManager),再检查 /etc/resolv.conf 是否仍保持预期内容与权限
限制对 resolv.conf 的写入能力
除文件权限外,还需从进程和策略层面收窄写入通道:
- 禁止普通用户调用 resolvconf 命令(如存在):sudo chmod 750 /usr/bin/resolvconf,或将该命令移出 PATH
- 审计写入行为:用 auditctl -w /etc/resolv.conf -p wa -k dns_resolv 监控所有写/属性变更,日志可通过 ausearch -k dns_resolv 查看
- 容器或受限环境中,挂载 /etc/resolv.conf 为只读(如 Docker 中加 --read-only --tmpfs /etc/resolv.conf:ro)
验证 DNS 解析行为是否受控
加固后必须验证实际解析是否按预期工作,避免误锁导致网络异常:
- 运行 nslookup example.com 127.0.0.53(针对 systemd-resolved)或 dig @8.8.8.8 google.com 绕过本地配置直连上游,确认基础连通性
- 执行 cat /etc/resolv.conf 和 systemd-resolve --status(或 resolvectl status)比对 DNS 服务器列表是否一致
- 尝试以普通用户执行 echo "nameserver 1.1.1.1" | sudo tee /etc/resolv.conf,应因权限或 chattr 失败,表明写入已受限










