企业运维案例:Linux Shell脚本安全加固(可执行不可读权限落地方案)

企业运维案例:Linux Shell脚本安全加固(可执行不可读权限落地方案)

一、案例背景与业务需求

1.1 业务场景

服务器存在业务脚本 hello.sh,需要交付普通用户(test05)日常执行使用,但禁止任何普通用户查看、复制、篡改脚本源码,防止核心业务逻辑泄露。

1.2 核心技术需求

  • 普通用户:拥有脚本执行权限,可正常运行业务逻辑

  • 普通用户:无脚本读取权限,无法查看、复制、解析源码

  • 禁止通过 sh hello.shcat 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:显示二进制乱码,无法解析业务代码

  • 无法复制、篡改、逆向脚本核心逻辑

六、生产环境规范总结

  1. 脚本规范 :所有待加密Shell脚本必须首行配置 #!/bin/bash 标准头部,否则SHC加密失败

  2. 权限规范 :加密后二进制文件固定权限 711,原始源码固定权限 700

  3. 文件规范 :编译产生的 .c 临时文件及时删除,减少安全暴露面

  4. 用户规范:业务脚本归属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