背景:
在企业和开发环境中,经常需要通过Shell脚本自动化管理任务,包括数据库操作。这些脚本可能会包含敏感信息如数据库登录凭证,如果这些脚本被未授权的人访问,可能会导致安全风险。因此,保护这些脚本中的敏感信息是至关重要的。
正文:
为了增强Shell脚本的安全性,可以使用SHC(Shell Script Compiler)工具。SHC是一种将Shell脚本编译成C源代码,再编译为可执行的二进制文件的工具。这一处理不仅可以防止敏感信息泄露,还能防止脚本被轻易修改。然而,这种编译实际上不是将脚本转换成真正的二进制代码,而是将脚本加密后附加到一个解释器上。这使得 SHC 编译的文件仍然可以被反编译或解密。
尽管如之前所述,这个工具提供的加密容易被破解,但它依然是一个快速隐藏脚本内容的选项。
下面以Oracle数据库的管理脚本为例,管理员可能需要编写脚本来自动执行数据库查询或其他操作。考虑下面的脚本 scott.sh,它连接到数据库并执行一个查询:
#!/bin/bash
sqlplus -s /nolog<<EOF
conn scott/tiger
set line 200 pages 2000
select * from emp;
exit;
EOF
编译为二进制文件:
安装sch
# Ubuntu/Debian
sudo apt-get install shc
# CentOS/RedHat
sudo yum install shc
# Fedora
sudo dnf install shc
使用shc,可以将上述脚本编译成二进制文件,从而隐藏内部逻辑和凭证信息:
[oracle@oradb ~]$ shc -f scott.sh -o scott
[oracle@oradb ~]$ ll scott*
-rwxrwxr-x 1 oracle oinstall 11296 Apr 25 18:00 scott
-rw-r--r-- 1 oracle oinstall 167 Apr 25 14:28 scott.sh
-rw-r--r-- 1 oracle oinstall 18151 Apr 25 18:00 scott.sh.x.c
[oracle@oradb ~]$ file scott
scott: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=cdd9e20dc6b3fa250571082eaf62cdd6afeaeb68, stripped
scott.sh.x.c
这个文件是 shc 生成的 C 源代码文件,其内容是对原始 Shell 脚本的加密表示。shc 使用这个 C 文件作为一个中间步骤,通过将其编译成可执行文件来“隐藏”Shell 脚本的内容。这个 C 文件包含了:
一个将 Shell 脚本内容加密的字符数组。
一个在运行时解密并执行这个加密脚本的程序。
该文件对于了解 shc 的工作原理很有教育意义,但通常在部署时不需要它。
二进制文件 scott
这个文件是编译后的可执行文件,它可以在不需要原始 Shell 脚本的情况下运行。尽管这个文件以二进制形式存在,它本质上并不是一个从头编写的机器码程序,而是一个封装了原始脚本的 Shell 脚本解释器。因此,它的安全性主要取决于 shc 的加密强度。
执行生成的二进制文件:
[oracle@oradb ~]$ ./scott
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20
7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30
7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30
7566 JONES MANAGER 7839 1981-04-02 00:00:00 2975 20
7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30
7698 BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30
7782 CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10
7788 SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20
7839 KING PRESIDENT 1981-11-17 00:00:00 5000 10
7844 TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30
7876 ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20
7900 JAMES CLERK 7698 1981-12-03 00:00:00 950 30
7902 FORD ANALYST 7566 1981-12-03 00:00:00 3000 20
7934 MILLER CLERK 7782 1982-01-23 00:00:00 1300 10
执行该二进制文件将连接到数据库并显示结果,就如同直接运行脚本一样,但关键差别在于脚本的内容不再以文本形式存储,减少了泄露风险。
总结:
通过使用SHC编译Shell脚本到二进制文件,我们不仅保护了脚本中包含的敏感信息,如数据库凭证,还增加了脚本的安全性,防止未授权修改。这为处理敏感操作提供了一个更安全的方法,是数据库管理员和系统管理员保护自动化脚本的有效手段。定期更新和监控这些二进制文件的安全状态,以及保持SHC工具的更新,将进一步加强安全防护。
「欢迎关注我们的公众号,获取更多技术分享与经验交流。」




