Keepalived ≥2.0.20 支持 script_user 为各 vrrp_script 指定低权限用户,需新建受限系统用户、正确设置脚本属主与权限,并在对应 script 块内配置,启动时校验用户存在性。

Keepalived 默认以 root 权限运行所有脚本(包括 vrrp_script 中定义的监控脚本),这存在安全风险。从 Keepalived 2.0.20 开始,支持通过 script_user 指令为每个 vrrp_script 单独指定运行用户,从而避免监控脚本以 root 身份执行敏感操作。
确认 Keepalived 版本并启用 script_user
该功能仅在 Keepalived ≥ 2.0.20 中可用。运行以下命令确认版本:
keepalived --version
若版本过低,请先升级。旧版本不识别 script_user,配置后会报错或静默忽略。
创建专用低权限用户
不要复用系统已有服务用户(如 www-data、nobody),应新建受限用户,仅授予脚本所需最小权限:
- 使用
useradd -r -s /usr/sbin/nologin -d /var/empty keepalived-check创建无登录能力的系统用户 - 确保脚本文件(如
/opt/scripts/check_mysql.sh)属主为该用户,且权限为750或更严格(如700) - 若脚本需访问数据库 socket、API 端口或配置文件,用
setfacl或加入对应组(如mysql组)授权,而非放宽全局权限
在 vrrp_script 中正确配置 script_user
注意:script_user 必须写在对应 vrrp_script 块内,不能放在全局或 vrrp_instance 中:
vrrp_script chk_mysql {
script "/opt/scripts/check_mysql.sh"
interval 5
timeout 3
fall 2
rise 2
script_user keepalived-check
}
Keepalived 启动时会校验该用户是否存在,若不存在则报错并拒绝加载配置。可通过 journalctl -u keepalived -f 查看启动日志确认是否生效。
脚本内部避免提权操作
即使指定了低权限用户,脚本自身仍可能触发权限问题。需注意:
- 禁用
sudo、su、pkexec等提权调用;Keepalived 不会为脚本提供 sudoers 权限上下文 - 避免写入系统路径(如
/etc、/var/log),改用/var/lib/keepalived/或用户家目录下可写路径 - 若需执行网络探测(如 curl、nc),确保该用户有对应二进制文件的执行权限(通常默认有),但无权读取其他用户敏感数据
不复杂但容易忽略:script_user 是 per-script 的独立设置,不同检查脚本可指定不同用户,适合混合环境精细化管控。

















