shell脚本加密方式
--作者:飞翔的小胖猪
--创建时间:2021年5月17日
--修改时间:2021年5月17日
说明
shell作为Linux操作系统中原生的语言环境,由于其简单、便捷、可以移植等特性常被运维人员作为工作用来维护操作系统。
但是由于shell脚本是可读写的、并且以明文的方式存储,则会存在较大的安全隐患。如其可读写的特点可能会被动机不纯的份子利用修改其内容改变其本身的真实用途;其明文的存储方式则会泄露敏感信息,,如用户名,密码,路径,IP等。在生产环境中该是完全不能被接受的。
文档结合生产环境中的实际情况,针对生产中安全要求规范。总结整理针对shell脚本加密的相关规范。
方式
针对shell的脚本的特点,作者总结并梳理3种机制来保障shell脚本在生产环境中的安全运行。
- 使用加密工具对shell脚本进行加密。
- 对shell脚本添加特殊文件属性,限制shell脚本文件写功能。
- 使用校验码校验shell脚本的完整性。
ps:较高的安全机制会在一定程度上增加维护成本,请君谨慎选择。不是任何一个脚本都需要加密了!一般生产环境中选择以上的一种方式进行安全管控即可,在安全等级较高的环境中可以采取多种机制组合的放肆进行安全保障。作者建议先加密文件再设置文件不可更改。
题外话:这就和selinux的作用一样,都知道selinux很安全,真正使用的又有几人?尤其对于现在的运维人员而言,开篇第一手就是设置其为disabled。所以安全固然重要,但是相信不会有人专门买个保险箱来存放空白A4纸吧。
原shell脚本文件
文章中使用的shell脚本文件展示如下:
[root@135 62_encryption_note]# cat test1.sh #!/bin/bash printf "\e[33m姓名:\e[0m大高个 \n" printf "\e[33m年纪:\e[0m很年轻\e[m\n" printf "\e[33m电话:\e[0m12345678901\n" printf "\e[33m身份证号:\e[0m510502192102108274\n" printf "\e[33m家庭住址:\e[0m四川省泸州市江阳区某某小区aa栋bb单元cc号\n" #键入多种字符格式测试加密效果 #以下的内容不想其他人看到。 password='123456' check='aBcyysSLJAO#!' string_i='测试加密中文字符' special_i='!@#$%^&*()~":?>,.-=+~`'
一、加密机制
1.1 gzexe加密
gzexec命令比较简单,没有其他的参数选项,其本质是一个压缩软件。在其压缩的过程中会改变部分文件内容的显示,有一定的安全管控作用。
执行gzexe命令过后会在原文件目录下自动生成一个名为${file_name}~的备份文件。加密过后的文件依然可以运行。
1.1.1 gzexe语法
gzexe [-d][执行文件...]
-d 解开压缩文件。
加密
# gzexe test1.sh
1.1.2 gzexe加密后文件
1.1.3 gzexe加密后执行结果
1.2 shc加密
shc是一个专业加密shell脚本的工具.它的作用是把shell脚本转换为一个可执行的二进制文件。Shc的主要目的是保护shell脚本不被修改或检查。
shc不是系统自带的工具,需要用户自行下载,官网地址:http://www.datsi.fi.upm.es/~frosal/sources/。
shc可以编译任何类型的shell脚本,但是您需要提供有效的-i、-x和-l选项。
使用-f指定的脚本创建一个剥离的二进制可执行版本,二进制版本会附加.x扩展名,通常比原始ascii码的大小要大一些。
生成的C源代码保存在一个扩展名为.x.c的文件中。shc使用-e选项可以为文件设置过期时间,过期后会提示对应信息,信息使用-m指定。
在执行时,编译后的二进制文件将解密并使用shell -c选项执行代码,由于需要先解密再执行则经过shc加密过后,脚本的执行时间将会有所增加。
官网已经断更了,版本停留在3.8.9,文档所用版本为3.8.9。
1.2.1 shc安装
软件地址:http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.9.tgz
安装命令:
1.解压文件准备环境 # wget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.9.tgz # tar -zxvf shc-3.8.9.tgz # cd shc-3.8.9/ # mkdir -p /usr/local/man/man1 2.安装验证结果 # make install # which shc
1.2.2 shc语法
shc [ -e date ] [ -m addr ] [ -i iopt ] [ -x cmnd ] [ -l lopt ] [ -ACDhTv ] -f script OPTIONS The command line options are: -e date Expiration date in dd/mm/yyyy format [none] -m message message to display upon expiration ["Please contact your provider"] -f script_name File name of the script to compile -i inline_option Inline option for the shell interpreter i.e: -e -x comand eXec command, as a printf format i.e: exec(\\'%s\\',@ARGV); -l last_option Last shell option i.e: -- -r Relax security. Make a redistributable binary which executes on different systems running the same operating system. -v Verbose compilation -D Switch on debug exec calls -T Allow binary to be traceable (using strace, ptrace, truss, etc.) -C Display license and exit -A Display abstract and exit -h Display help and exit
加密
# shc -r -f test1.sh
命令会生成两个文件,${file_name}.x 和 ${file_name}.x.c。
${file_name}.x是C语言源文件,可以删除。
1.2.3 shc加密后文件
1.2.4 shc加密后执行结果
二、添加特殊属性
生产环境中的脚本一半情况上上线后不会进行修改,使用chattr命令为脚本添加只读和只执行权限。
2.1 chattr
Linux chattr命令用于改变文件属性。
2.1.1 chattr语法
chattr [-RV][-v<版本编号>][+/-/=<属性>][文件或目录...] 参数: -R 递归处理,将指定目录下的所有文件及子目录一并处理。 -v<版本编号> 设置文件或目录版本。 -V 显示指令执行过程。 +<属性> 开启文件或目录的该项属性。 -<属性> 关闭文件或目录的该项属性。 =<属性> 指定文件或目录的该项属性。 属性: a:让文件或目录仅供附加用途。 b:不更新文件或目录的最后存取时间。 c:将文件或目录压缩后存放。 d:将文件或目录排除在倾倒操作之外。 i:不得任意更动文件或目录。 s:保密性删除文件或目录。 S:即时更新文件或目录。 u:预防以外删除。
设置属性
# chattr +i test1.sh_bak # lsattr test1.sh_bak
2.1.2 权限设置后结果
三、效验码检查
同等与设置脚本的不可更改属性,使用校验码检查脚本是否被更改过后。
3.1 md5sum
通过md5sum来校验生成文件校验码,来发现文件传输(网络传输、复制、本地不同设备间的传输)异常造成的文件内容不一致的情况。
- md5sum 是校验文件内容,与文件名是否相同无关。
- md5sum值逐位校验,所以文件越大,校验时间越长。
- md5sum的效验文件一定要保存到其他专用文件夹中。同时需要设置md5sum效验文件设置为不可更改。
3.1.1 md5sum语法
md5sum [OPTION]... [FILE]... DESCRIPTION Print or check MD5 (128-bit) checksums. With no FILE, or when FILE is -, read standard input. -b, --binary read in binary mode -c, --check read MD5 sums from the FILEs and check them --tag create a BSD-style checksum -t, --text read in text mode (default) Note: There is no difference between binary and text mode option on GNU system. -z, --zero end each output line with NUL, not newline, and disable file name escaping The following five options are useful only when verifying checksums: --ignore-missing don't fail or report status for missing files --quiet don't print OK for each successfully verified file --status don't output anything, status code shows success --strict exit non-zero for improperly formatted checksum lines -w, --warn warn about improperly formatted checksum lines --help display this help and exit --version output version information and exit
3.1.2 生产效验文件
# md5sum test1.sh > check_file.txt
# chattr +i check_file.txt # md5sum -c check_file.txt
3.1.3 md5效验结果