Linux Shell脚本安全需严控执行与修改权限、校验完整性并确保环境可信:用chmod 700/500限制文件权限,避免全局可写目录;非必要不以root运行,可用sudo -u或降权处理;部署前生成SHA256或GPG签名,运行时校验;显式清理环境变量,严格校验输入参数与配置。

Linux Shell 脚本安全不能只靠“写对逻辑”,更关键的是控制谁可以运行、谁可以修改,以及脚本自身是否被篡改。权限设置和内容校验是两道最基础也最有效的防线。
严格限制脚本文件权限
脚本文件本身若被未授权用户读取、写入或执行,就可能泄露敏感逻辑(如密码拼接、路径结构)或被恶意替换。默认不应给组和其他用户任何权限。
- 用 chmod 700 script.sh 仅允许所有者读、写、执行;若只需执行,用 chmod 500 script.sh
- 避免使用 chmod 777 或把脚本放在全局可写目录(如 /tmp)中长期运行
- 检查父目录权限:即使脚本是 500,若所在目录是 777,攻击者仍可删除后重建同名脚本劫持执行
运行时降权:不以 root 执行,除非绝对必要
多数脚本只需完成特定任务(如日志轮转、配置检查),没必要全程 root。高权限运行会放大漏洞影响范围。
- 用 sudo -u nobody ./script.sh 或创建专用低权限用户(如 svc-backup)运行
- 如必须用 root 启动,脚本内尽早调用 setuidgid(需提前安装)或 su -c 切换到普通用户处理非特权操作
- 禁用脚本中无防护的 eval、$(...) 或未引号包裹的变量(如 rm -rf $DIR),防止命令注入提升权限
脚本完整性校验:防止被篡改
生产环境脚本一旦部署,应确保内容未被意外或恶意修改。SHA256 校验 + 签名验证是最实用组合。
- 发布时生成签名:gpg --clearsign script.sh,或计算摘要:sha256sum script.sh > script.sh.sha256
- 运行前校验:sha256sum -c script.sh.sha256 2>/dev/null || { echo "校验失败,退出"; exit 1; }
- 关键脚本建议用 GPG 私钥签名,启动时用预置公钥验证:gpg --verify script.sh.asc script.sh
环境与输入可信性控制
脚本行为不仅取决于代码,还受环境变量、参数、外部文件影响。忽略这些等于留后门。
- 显式清理或锁定关键变量:unset $(env | grep -E '^(PATH|LD_|BASH_FUNC_).*' | cut -d= -f1),再设最小 PATH(如 PATH=/usr/bin:/bin)
- 所有外部输入($1、$2、配置文件内容)必须校验格式与范围,禁止直接拼入命令;用 case 或正则过滤,而非简单 if [ "$1" = "start" ]
- 敏感操作前加人工确认开关(如 -y 参数),或要求指定 --env=prod 明确上下文,防误触发










