0

0

LinuxShell脚本安全实践_权限与环境控制解析【教程】

冰川箭仙

冰川箭仙

发布时间:2026-01-06 18:48:08

|

528人浏览过

|

来源于php中文网

原创

脚本执行权限必须设为750且组严格限定,禁止755;需用set -euo pipefail、IFS=、引号化变量、重置PATH、校验二进制完整性、mktemp创建临时文件并设600权限。

linuxshell脚本安全实践_权限与环境控制解析【教程】

脚本执行权限设置必须用 chmod 750 而非 755

如果脚本含敏感操作(如修改系统配置、读取 /etc/shadow),执行权限开放给“其他用户”(o+r-x)等于默认放行任意本地账户调用。实际中 chmod 750 确保仅属主+同组可执行,且组应严格限定(如新建专用组 adminscripts,仅加入必要账号)。755 常见于 Web 可读目录,但 Shell 脚本一旦被普通用户执行,可能绕过 sudo 策略或触发环境变量污染。

  • 检查当前权限:ls -l /path/to/script.sh,确认输出第三段不含 x(如 -rwxr-x--- 合规,-rwxr-xr-x 不合规)
  • 设权后立即验证:sudo -u nobody /path/to/script.sh 应报 Permission denied,而非静默失败或意外执行
  • 避免在 /tmp/var/tmp 中存放带执行权限的脚本——这些目录通常设了 sticky bit,但不阻止同组用户覆盖或重命名

set -euo pipefail 是基础安全开关,但需配合 IFS= 和引号化

仅加 set -euo pipefail 不足以防御路径遍历或空格分词攻击。例如 for file in $(ls *.log) 在文件名含空格时会崩,而 find ... -print0 | while IFS= read -r -d '' f 才可靠。关键点在于:IFS= 阻止 read 自动裁剪首尾空白,read -r 禁用反斜杠转义,所有变量引用必须用 "$var"

  • set -u 会让未定义变量(如 $USER_HOME 拼写错成 $USER_HOMR)直接退出,避免静默使用空值
  • set -o pipefail 使管道中任一命令失败即整体失败,否则 grep xxx /etc/passwd | head -1 可能因 grep 无匹配而返回 1,但 head 仍成功,脚本误判为“找到结果”
  • 禁止裸写 cp $src $dst,必须写成 cp "$src" "$dst";若 $src/tmp/my file.txt,不加引号会拆成两个参数

PATH 和 LD_LIBRARY_PATH 必须显式重置,不能依赖用户环境

脚本启动时若继承用户 PATH(如含 ~/bin/usr/local/bin),攻击者可通过篡改其中的 lsawk 等命令劫持执行流。正确做法是开头就覆盖:PATH="/usr/bin:/bin:/usr/sbin:/sbin",并用 command -v 校验关键工具存在。

PHP 网络编程技术与实例(曹衍龙)
PHP 网络编程技术与实例(曹衍龙)

PHP网络编程技术详解由浅入深,全面、系统地介绍了PHP开发技术,并提供了大量实例,供读者实战演练。另外,笔者专门为本书录制了相应的配套教学视频,以帮助读者更好地学习本书内容。这些视频和书中的实例源代码一起收录于配书光盘中。本书共分4篇。第1篇是PHP准备篇,介绍了PHP的优势、开发环境及安装;第2篇是PHP基础篇,介绍了PHP中的常量与变量、运算符与表达式、流程控制以及函数;第3篇是进阶篇,介绍

下载
  • 清除危险变量:unset LD_PRELOAD LD_LIBRARY_PATH PYTHONPATH PERL5LIB,这些可被用于动态库/解释器注入
  • 用绝对路径调用核心命令更稳妥(如 /bin/cp 而非 cp),但前提是已确认该路径在目标系统存在(CentOS 和 Alpine 的 /bin 内容差异大)
  • 若脚本需调用自定义二进制,应先 sha256sum -c checksums.sha256 校验完整性,再加入 PATH

临时文件必须用 mktemp 创建,且禁止 /tmp 下硬编码路径

写死 /tmp/myscript.pid/tmp/output.log 是典型竞争条件漏洞:攻击者可在 if [ ! -f /tmp/myscript.pid ]; then touch /tmp/myscript.pid 的间隙创建符号链接,指向 /etc/passwd。必须用 mktemp 生成唯一路径,并立即 chmod 600

  • 正确模式:
    tmpdir=$(mktemp -d) || exit 1
    chmod 700 "$tmpdir"
    trap 'rm -rf "$tmpdir"' EXIT
  • 单文件也需 mktemptmpfile=$(mktemp) && chmod 600 "$tmpfile",不可用 $$(进程号)拼接,因 PID 可预测
  • 避免 mktemp /tmp/myapp.XXXXXX —— 这种用法在旧版 mktemp 中不安全,现代应只用无参数形式或 -t 指定模板前缀
脚本里最易被忽略的不是语法错误,而是对环境变量和临时资源的假设——它们在开发机上总“恰好工作”,一到生产环境就因权限收紧、路径变更或并发访问暴露问题。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

737

2023.08.22

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

85

2023.09.25

centos
centos

PHP中文网为大家提供centos相关信息,CentOS(Community Enterprise Operating System,中文意思是社区企业操作系统)是Linux发行版之一,是免费的、开源的、可以重新分发的开源操作系统,PHP中文网提供centos相关文章,以及安装教程。

431

2023.06.16

常见的linux系统有哪些
常见的linux系统有哪些

linux系统有Ubuntu、Fedora、CentOS、Debian、openSUSE、Arch Linux、Gentoo、Slackware、Linux Mint、Kali Linux。更多关于linux系统的文章详情请阅读本专题下面的文章。php中文网欢迎大家前来学习。

800

2023.10.27

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

34

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

14

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

33

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

18

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

12

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.1万人学习

Git 教程
Git 教程

共21课时 | 2.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号