普通用户可无密码执行指定脚本:需在sudoers中精确授权绝对路径、设脚本属主为root且权限755;脚本开头校验SHA256哈希与外部命令路径;所有命令用绝对路径或预定义变量;限制环境变量并审计日志。

给特定脚本分配 sudo 权限,核心是让普通用户无需输入密码、仅能执行指定脚本,同时防止路径劫持或恶意替换。关键不在“加权限”,而在“控范围”和“锁路径”。
一、用 sudoers 精确授权脚本(不暴露 shell)
直接在 /etc/sudoers 中用 visudo 添加如下行(替换 /opt/bin/backup.sh 为你的脚本绝对路径):
- alice ALL=(root) NOPASSWD: /opt/bin/backup.sh
- 禁止通配符(如
/opt/bin/*.sh)和 shell 功能(如!/bin/bash),避免命令注入 - 确保脚本属主为 root,权限为
755,且普通用户无写权限:sudo chown root:root /opt/bin/backup.sh && sudo chmod 755 /opt/bin/backup.sh
二、强制校验脚本路径与完整性
仅靠路径授权不够——攻击者可能替换脚本内容。建议在脚本开头加入校验逻辑:
- 用 sha256sum 预先计算脚本哈希,存入只读文件(如
/etc/backup.sh.sha256),权限设为644且仅 root 可写 - 脚本启动时第一行执行:
[[ "$(sha256sum "$0" | cut -d' ' -f1)" == "$(cat /etc/backup.sh.sha256 2>/dev/null)" ]] || { echo "ERROR: script tampered"; exit 1; } - 若脚本依赖外部工具(如
rsync),也应在运行前检查其路径是否为预期值:command -v rsync | grep -q '^/usr/bin/rsync$' || exit 1
三、避免 PATH 依赖,显式调用绝对路径
sudo 环境默认重置 PATH,但脚本内若调用其他命令(如 date、cp),仍可能被恶意 PATH 劫持:
- 所有系统命令均使用绝对路径:
/bin/date、/usr/bin/rsync、/bin/cp - 可在脚本开头统一定义变量:
DATE=/bin/date; CP=/bin/cp; RSYNC=/usr/bin/rsync,后续统一用变量 - 禁用
env_reset不推荐;更安全做法是显式清理并重建 PATH:PATH="/usr/local/bin:/usr/bin:/bin"
四、补充防护:限制执行上下文
进一步缩小攻击面:
- 在 sudoers 中添加环境限制:alice ALL=(root) NOPASSWD: SETENV: /opt/bin/backup.sh,再于脚本中校验关键环境变量(如
LANG=C、IFS=) - 用 sudo -n 测试非交互式执行是否生效,避免意外触发密码提示
- 审计日志不可少:确认
/var/log/secure或/var/log/auth.log记录 sudo 调用,含用户、时间、命令全路径

















