备份脚本加固需严格限制权限、隔离路径、防范注入:脚本权限设750、属主backup、存放于只读目录;备份目录挂载禁exec/nosuid、权限750;路径全用绝对路径并引号包裹变量;禁用eval,参数转义或数组传参;重置path等环境变量;校验脚本完整性;日志写入/var/log/backup.log并审计关键路径。

系统备份脚本若权限宽松或路径可被普通用户写入,极易被篡改、注入恶意代码,甚至提权执行。核心加固点在于:限制执行权限、隔离脚本与数据路径、消除隐式依赖风险。
执行权限必须严格最小化
备份脚本不应以 root 权限直接运行,更不能赋予 world-writable 或 group-writable 权限。
- 脚本文件权限设为 750(属主 rwx,属组 rx,其他无权限),属主为专用备份账户(如
backup),属组为管理组(如sysadmin) - 避免使用
sudo chmod 777或将脚本放在/tmp、/var/tmp等全局可写目录 - 若需 root 权限访问某些受保护路径(如
/etc/shadow),应通过sudo限定命令白名单,例如在/etc/sudoers.d/backup中配置:backup ALL=(root) NOPASSWD: /bin/tar -cf /backup/etc.tar /etc
脚本路径与备份目标路径须物理隔离且不可控于用户
攻击者常利用路径遍历(如 ../)、符号链接或环境变量劫持(如 PATH)绕过限制。
- 脚本自身存放于只读目录,如
/usr/local/sbin/backup.sh,属主 root:root,权限 755;执行时由专用账户调用,不改变其所在目录权限 - 备份输出目录(如
/backup)应挂载为独立分区或使用mount -o noexec,nosuid,nodev,relatime选项,目录权限设为 750,属主backup,禁止普通用户写入或创建符号链接 - 脚本中所有路径使用绝对路径,禁用
$HOME、~、未引号包裹的变量(如$DEST必须写成"$DEST"),防止空格或换行导致命令截断
规避 shell 注入与环境污染风险
备份脚本常调用 tar、rsync、mysqldump 等外部命令,若参数拼接不当,易触发命令注入。
- 禁用
eval和反引号命令替换;对动态路径使用printf '%q'转义,或改用数组传参(Bash):cmd=(tar -cf "$ARCHIVE" -C "$SRC_DIR" .); "${cmd[@]}" - 显式重置关键环境变量,开头加入:
unset PATH LD_LIBRARY_PATH IFS; PATH=/usr/bin:/bin:/usr/sbin:/sbin - 敏感操作前校验关键文件完整性,例如用
sha256sum -c /etc/backup-script.sha256 2>/dev/null验证脚本未被篡改
日志与执行上下文需可审计
仅防住入侵不够,还要确保异常行为可追溯。
- 所有执行记录写入专用日志(如
/var/log/backup.log),权限 640,属主backup:adm;启用logger同步写入 syslog,防止本地日志被删 - 脚本启动时记录 UID/GID、有效用户、当前工作目录、完整命令行(
ps -o pid,ppid,euid,ruid,comm,args -p $$) - 配合 auditd 监控关键路径:
-w /usr/local/sbin/backup.sh -p wa -k backup_script-w /backup/ -p wa -k backup_target










