普通用户默认无防火墙修改权限,关键在于严格管控sudo权限、移除非必要组成员身份、禁用直接调用防火墙命令,并锁定配置文件与运行时状态。

普通用户默认就没有修改防火墙规则的权限,真正需要做的是防止他们通过 sudo 或其他方式越权操作。核心思路不是“封住所有入口”,而是“只给必要能力”——重点控制 sudo 权限、移除非必要组成员身份、并确保防火墙服务本身不被普通用户直接调用。
禁止用户通过 sudo 修改防火墙
绝大多数越权修改都源于 sudo 权限配置不当。关键操作如下:
- 用 visudo 编辑
/etc/sudoers,检查是否存在类似%wheel ALL=(ALL) ALL或%sudo ALL=(ALL:ALL) ALL的宽泛授权;若有,应删除或注释掉 - 若必须保留部分用户提权能力,只允许其执行明确白名单命令,例如:
deployer ALL=(root) NOPASSWD: /usr/bin/firewall-cmd --reload, /usr/bin/firewall-cmd --list-all
注意:不要写NOPASSWD: ALL,也不要漏掉--permanent等关键参数(它们属于命令的一部分) - 检查
/etc/sudoers.d/下的额外配置文件,确保文件名不含.或~(如firewall.conf合法,firewall.conf.bak会被忽略),且权限为0440
移除用户对防火墙服务的隐式控制权
有些用户可能不属于 sudo 组,但仍能间接影响防火墙——比如通过重启 firewalld 服务来重载规则。需切断这类路径:
- 确认用户不在
firewalld或root组中:groups username;若在,用sudo gpasswd -d username firewalld移除 - 限制对 systemd 的控制:运行
sudo systemctl edit firewalld创建覆盖配置,加入:[Service]<br>PermissionsStartOnly=true<br>RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6
再加一行ProtectSystem=strict可进一步隔离服务环境 - 禁用普通用户调用
iptables命令:可将/sbin/iptables权限设为750并归属root:iptables组,然后确保普通用户不在该组
锁定防火墙配置文件与运行时状态
即使无法执行命令,用户若能编辑配置文件或干扰 socket,仍可能间接生效:
- 设置
/etc/firewalld/目录及其下所有*.xml文件为只读:sudo chmod -R 644 /etc/firewalld/*.xml,目录权限设为755 - 防止覆盖 runtime 规则:firewalld 默认允许 root 和 firewalld 组用户操作 D-Bus 接口,运行
sudo getent group firewalld查看组成员,清空无关用户 - 验证是否生效:切换到目标用户,执行
sudo -l -U username,确认输出中不包含任何firewall-cmd、iptables或systemctl * firewalld相关条目
补充:让防火墙自身更“抗干扰”
系统级加固能降低误操作或绕过风险:
- 启用
firewalld的 lockdown 模式(需配置/etc/firewalld/firewalld.conf中Lockdown=yes),启用后仅允许白名单应用通过 D-Bus 调用 - 若使用 iptables 直接管理,可将
/etc/sysconfig/iptables设为不可修改:sudo chattr +i /etc/sysconfig/iptables(需 root 才能解除) - 定期审计:用
sudo journalctl -u firewalld --since "1 week ago" | grep -i "command.*by"查看是否有异常调用记录











