--作者:飛翔的小胖豬
--創建時間: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效驗結果