企业运维案例:Linux Shell脚本安全加固(可执行不可读权限落地方案)
一、案例背景与业务需求
1.1 业务场景
服务器存在业务脚本 hello.sh,需要交付普通用户(test05)日常执行使用,但禁止任何普通用户查看、复制、篡改脚本源码,防止核心业务逻辑泄露。
1.2 核心技术需求
-
普通用户:拥有脚本执行权限,可正常运行业务逻辑
-
普通用户:无脚本读取权限,无法查看、复制、解析源码
-
禁止通过
sh hello.sh、cat hello.sh等方式窃取脚本内容
1.3 原生Linux权限痛点(核心问题)
Linux原生权限体系下,Shell解释型脚本无法实现「只执行不读取」:
-
脚本运行依赖系统读取源码解释执行,仅有执行权限无读取权限时,脚本无法运行
-
赋予读取权限后,用户可直接查看源码,存在安全风险
解决方案:采用 SHC****脚本加密编译工具,将Shell脚本编译为二进制可执行文件,脱离源码依赖,实现权限隔离。
二、环境信息
-
操作系统:CentOS 系列
-
操作用户:root(管理员)
-
业务脚本:
/opt/quanxain/hello.sh -
操作用户:普通用户 test05
三、部署全过程(企业标准步骤)
3.1 依赖环境部署(解决yum找不到、编译报错问题)
问题前置:CentOS默认源无SHC工具,官方GitHub源无法直接访问、源码编译缺失依赖报错,采用国内镜像+全套编译依赖部署。
步骤1:安装全套编译构建依赖
bash
yum install gcc make automake autoconf -y
步骤2:国内镜像下载SHC 源码**(规避****GitHub****访问失败)**
bash
git clone https://gitcode.com/gh_mirrors/sh/shc.git /root/shc
cd /root/shc
步骤3:修复编译缺失配置文件报错
报错现象:config.guess、config.sub 文件缺失,编译中断
修复命令:
bash
autoreconf -ivf
automake --add-missing --copy
步骤4:编译安装SHC工具
bash
mkdir -p /usr/local/man/man1
./configure && make && make install
步骤5:验证安装成功
bash
shc --version
3.2 脚本标准化修复(解决shc: invalid first line报错)
报错原因:原始脚本无Shell解释器头部声明,SHC工具无法识别合法脚本格式
错误脚本内容:直接书写业务代码,无头部
修复步骤:标准化重写脚本
bash
cat > /opt/quanxain/hello.sh <<'EOF'
#!/bin/bash
echo "hello"
EOF
赋予脚本基础执行权限:
bash
chmod +x /opt/quanxain/hello.sh
3.3 SHC加密编译(核心加固步骤)
进入脚本目录,执行加密编译命令,将Shell脚本转为二进制文件:
bash
cd /opt/quanxain
shc -f hello.sh
编译后生成文件说明:
-
hello.sh.x:加密二进制可执行文件(生产使用文件) -
hello.sh.x.c:临时C语言源码文件(可直接删除)
3.4 企业级权限配置(最终安全权限)
实现效果:root全权管理,普通用户仅可执行、无任何读取权限
bash
# 二进制文件归属root,权限711(所有者rwx,其他用户仅x执行)
chown root:root hello.sh.x
chmod 711 hello.sh.x
# 原始源码脚本锁定权限,普通用户完全无法访问
chmod 700 hello.sh
四、全程报错汇总与排错方案(生产避坑)
| 报错现象 | 报错原因 | 解决方案 |
|---|---|---|
| yum install shc 提示无匹配包 | 默认源无SHC工具,未安装EPEL源 | 放弃yum安装,使用国内镜像源码编译安装 |
| git clone GitHub地址访问失败、robots.txt拦截 | 国内网络无法访问GitHub官方仓库 | 替换为GitCode国内镜像地址克隆 |
| configure报错:config.guess、config.sub缺失 | 系统缺少automake自动构建依赖文件 | 执行 autoreconf -ivf && automake --add-missing --copy |
| shc: invalid first line in script | 脚本首行无 #!/bin/bash 解释器声明 | 重写脚本,补充标准Shell头部声明 |
五、业务效果验证(生产验收标准)
切换普通用户 test05 测试:
5.1 功能验证
bash
./hello.sh.x
# 正常输出 hello,业务执行正常
5.2 安全验证
-
cat hello.sh:权限拒绝,无法查看原始源码 -
cat hello.sh.x:显示二进制乱码,无法解析业务代码 -
无法复制、篡改、逆向脚本核心逻辑
六、生产环境规范总结
-
脚本规范 :所有待加密Shell脚本必须首行配置
#!/bin/bash标准头部,否则SHC加密失败 -
权限规范 :加密后二进制文件固定权限
711,原始源码固定权限700 -
文件规范 :编译产生的
.c临时文件及时删除,减少安全暴露面 -
用户规范:业务脚本归属root用户,普通用户仅持有执行权限,最小权限原则落地
七、备选兜底方案(SHC编译失败时应急)
若服务器编译环境异常,可使用中转脚本方案,无需任何工具,效果一致:
bash
# 1. 锁定原始脚本
chmod 700 hello.sh
# 2. 创建中转执行脚本
cat > run.sh <<'EOF'
#!/bin/bash
/opt/quanxain/hello.sh
EOF
# 3. 配置安全权限
chown root:root run.sh
chmod 711 run.sh