シェルスクリプト単体で外部に漏れても、すぐには中身が見れないようにする方法をについて、バイナリ化の他に、難読化…というか、スクリプトの中身がスグには見えないようにする方法がないか調べてみた。
で、以下のようにbase64やgpgを利用する事で対応出来たので、備忘として残しておく。
まず、以下のようなスクリプトを用意しておく。
●test.sh
#!/bin/sh
echo "test"
mkdir ./test
touch ./test/test
1.base64で難読化する
base64で難読化するには、以下のようにコマンドを実行して難読化したファイルを生成する。
echo "echo $(base64 スクリプトファイルPATH" > 難読化したスクリプトPATH
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test.sh
#!/bin/sh
echo "test"
mkdir ./test
touch ./test/test
[root@BS-PUB-CENT7-01 ~]# echo "echo $(base64 /tmp/test.sh)" > /tmp/test_obsf.sh
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test_obsf.sh
echo IyEvYmluL3NoCmVjaG8gInRlc3QiCm1rZGlyIC4vdGVzdAp0b3VjaCAuL3Rlc3QvdGVzdApscyAt
bGEgLi90ZXN0Cg==
で、この難読化させたスクリプトファイルを利用するには、以下のようにコマンドを実行すればよい。
sh 難読化したスクリプトPATH | base64 -d | sh
[root@BS-PUB-CENT7-01 ~]# sh /tmp/test_obsf.sh | base64 -d
#!/bin/sh
echo "test"
mkdir ./test
touch ./test/test
[root@BS-PUB-CENT7-01 ~]# sh /tmp/test_obsf.sh | base64 -d | sh
test
[root@BS-PUB-CENT7-01 ~]# ls -la test/test
-rw-r--r--. 1 root root 0 4月 10 20:50 test/test
ただ、base64で読み取りにくくさせているだけなので、この難読化したスクリプトを他のサーバに持って行っても、同じようにコマンドを実行することで読み取れてしまうし、「-」付きのスクリプトの場合はそこで途切れてしまう。「-」を含まない、非常に単純なスクリプトで無いと実用は難しいだろう。
2.gpgで暗号化する
スクリプトをgpgで暗号化しておき、実行時に復号化するようにしてみる。
今回の場合はパスワードでの暗号化・復号化を行う。
まず、以下のコマンドでスクリプトを暗号化する。
gpg --yes --batch --passphrase=パスワード-c -o 暗号化したスクリプトの出力PATH 暗号化するスクリプトのPATH
[root@BS-PUB-CENT7-01 ~]# gpg --yes --batch --passphrase=test1234 -c -o /tmp/test.sh.gpg /tmp/test.sh
[root@BS-PUB-CENT7-01 ~]# ls -la /tmp/test.sh.gpg
-rw-r--r--. 1 root root 85 4月 10 21:31 /tmp/test.sh.gpg
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test.sh.gpg
?エキュT[ムモルD5Nキ・・ミ
oUュロ]:|・fmfュ「ネPハ
;麭ノL#cu・
ネ,>
で、この暗号化したスクリプトファイルを実行する場合は、以下のようにコマンドを実行すれば良い。
gpg --yes --batch --passphrase=パスワード -d -o - 暗号化したスクリプトのPATH 2>/dev/null | sh
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test.sh
#!/bin/sh
echo "test"
mkdir ./test
touch ./test/test
[root@BS-PUB-CENT7-01 ~]# gpg --yes --batch --passphrase=test1234 -d -o - /tmp/test.sh.gpg 2>/dev/null
#!/bin/sh
echo "test"
mkdir ./test
touch ./test/test
[root@BS-PUB-CENT7-01 ~]# gpg --yes --batch --passphrase=test1234 -d -o - /tmp/test.sh.gpg 2>/dev/null | sh
test
う~ん、正直、こっちの方がセキュリティレベルは高いし扱いやすいかも…
実際に運用に組み込むなら、パスワードではなく鍵ファイルで対応した方がいいかも知れない。