shell脚本权限管理核心是“最小权限原则”,即严格限制文件权限、按需降权运行、用sudo细粒度控制、校验完整性防篡改。

Shell脚本运行权限管理的核心,是让脚本只在必要时、以必要身份、访问必要资源。它不是靠“加更多权限”来保障功能,而是靠“减掉所有多余权限”来守住安全底线。
严格限制脚本文件自身权限
脚本文件一旦可被任意用户读取或修改,就等于把钥匙交到了别人手上。敏感逻辑(如路径拼接、密码处理片段)、配置结构甚至注释里的调试信息,都可能被利用。
- 默认使用 chmod 700 script.sh:仅所有者可读、写、执行;若脚本不需修改(如部署后只运行),用 chmod 500 script.sh(仅所有者可读、执行)更稳妥
- 绝对避免 chmod 777 或把脚本放在
/tmp、/var/tmp等全局可写目录中长期运行 - 检查父目录权限:即使脚本是 500,若所在目录权限为 777,攻击者可删除原脚本并新建同名恶意版本劫持执行
按需降权运行,拒绝全程 root
绝大多数运维类脚本(日志清理、配置校验、服务状态检查)根本不需要 root 权限。高权限运行会将一个逻辑小错放大成系统级风险。
- 优先用 sudo -u nobody ./script.sh 或创建专用低权限用户(如
svc-backup)运行 - 若必须由 root 启动(如监听特权端口),脚本内应尽早切换:可用 exec su -c "./real_work.sh" -s /bin/bash nobody,或借助
setuidgid工具完成降权 - 禁用未加防护的
eval、未引号包裹的变量(如rm -rf $DIR),防止命令注入后借高权限横向提权
用 sudo 实现细粒度执行控制
sudo 不仅是提权工具,更是权限分发与审计入口。它能精确控制“谁能在哪台机器上、以什么身份、运行哪个脚本、带哪些参数”。
- 在
/etc/sudoers中用 Cmnd_Alias 定义可信脚本路径,再通过 Runas_Spec 限定执行身份(如ALL=(backup) /opt/scripts/rotate-logs.sh) - 配合 requiretty 和 noexec 选项,防止通过重定向或子 shell 绕过限制
- 启用 sudoers 日志(
Defaults logfile="/var/log/sudo.log"),所有脚本调用均有迹可循
校验脚本完整性,防篡改即防失控
运行一个被篡改过的脚本,和运行攻击者写的脚本没有区别。完整性校验是生产环境不可跳过的环节。
- 发布前生成 SHA256 摘要:sha256sum script.sh > script.sh.sha256
- 运行前强制校验:sha256sum -c script.sh.sha256 2>/dev/null || { echo "哈希校验失败"; exit 1; }
- 对关键脚本使用 GPG 签名:gpg --clearsign script.sh,运行时用预置公钥验证:gpg --verify script.sh.asc script.sh











