Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

LinuxでSHCを使ってBashシェルスクリプトを暗号化する方法

質問: Linux環境でbashシェルスクリプトを暗号化するにはどうすればよいですか?スクリプト内にパスワードが含まれており、実行権限を持つ他のユーザーにスクリプトの中身やパスワードを読まれたくありません。シェルスクリプトを暗号化する方法はありますか?

回答: まず最初にお伝えしたいのは、ベストプラクティスとしてはシェルスクリプトを暗号化すべきではないという点です。本来はスクリプトをきちんとドキュメント化し、誰が見ても内容を正確に理解できるように書くのが理想です。パスワードなどの機密情報が含まれる場合は、暗号化に頼らなくても済む別の設計方法(設定ファイルの分離やアクセス権限の管理など)を検討しましょう。

とはいえ、それでもどうしてもシェルスクリプトを暗号化したい場合は、SHCというユーティリティを利用できます。ただし注意が必要です。shcが生成した暗号化スクリプトは一般ユーザーには読めませんが、仕組みを理解している人であれば、暗号化されたバイナリから元のシェルスクリプトを復元できる可能性があります。

SHCは「Shell Script Compiler(シェルスクリプトコンパイラ)」の略称です。

1. shcのダウンロードとインストール

以下の手順でshcをダウンロードしてビルドします。

# wget https://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.7.tgz
# tar xvfz shc-3.8.7.tgz
# cd shc-3.8.7
# make

shcが正しくインストールされたか確認します。

$ ./shc -v
shc parse(-f): No source file specified

shc Usage: shc [-e date] [-m addr] [-i iopt] [-x cmnd] [-l lopt] [-rvDTCAh] -f script

2. テスト用サンプルシェルスクリプトの作成

まず、暗号化のテストに使用するサンプルのbashスクリプトを作成します。

ここでは、指定した個数の乱数を生成する random.sh というスクリプトを作成します。実行時に生成する乱数の個数を入力として受け取ります。

$ vi random.sh
#!/bin/bash

echo -n "How many random numbers do you want to generate? "
read max

for (( start = 1; start <= $max; start++ ))
do
echo -e $RANDOM
done

$ ./random.sh
How many random numbers do you want to generate? 3
24682
1678
491

3. shcでシェルスクリプトを暗号化する

-f オプションで対象スクリプトを指定して、random.sh を暗号化します。

$ ./shc -f random.sh

このコマンドを実行すると、次の2つのファイルが生成されます。

$ ls -l random.sh*
-rwxrw-r--. 1 ramesh ramesh 149 Mar 27 01:09 random.sh
-rwx-wx--x. 1 ramesh ramesh 11752 Mar 27 01:12 random.sh.x
-rw-rw-r--. 1 ramesh ramesh 10174 Mar 27 01:12 random.sh.x.c
  • random.sh: 元の暗号化されていないシェルスクリプト
  • random.sh.x: バイナリ形式に変換された暗号化済みシェルスクリプト
  • random.sh.x.c: random.sh から生成されたC言語ソースコード。このCコードをコンパイルすることで上記の random.sh.x が作られます。つまりshcの仕組みは、シェルスクリプトをCプログラムに変換し、それをコンパイルして実行ファイルを生成するというものです。
$ file random.sh
random.sh: Bourne-Again shell script text executable

$ file random.sh.x
random.sh.x: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped

$ file random.sh.x.c
random.sh.x.c: ASCII C program text

4. 暗号化されたシェルスクリプトを実行する

暗号化後のスクリプトを実行して、正常に動作するか確認してみましょう。

$ ./random.sh.x
How many random numbers do you want to generate? 3
7489
10494
29627

なお、生成されたバイナリ自体は依然としてシェル(random.sh の先頭行で指定した /bin/bash など)に依存しています。実行環境にそのシェルが存在している必要がある点に注意してください。

5. シェルスクリプトに有効期限を設定する

shcでは、スクリプトに有効期限を設定することもできます。期限を過ぎた後に誰かがスクリプトを実行しようとすると、エラーメッセージが表示されるようになります。

例えば、2011年12月31日以降は random.sh.x を実行できないようにしたい場合(ここではテスト用に過去の日付を使用)、-e オプションで有効期限を指定して新しい暗号化スクリプトを作成します。日付は dd/mm/yyyy 形式で指定します。

$ ./shc -e 31/12/2011 -f random.sh

この状態で2011年12月31日以降に random.sh.x を実行すると、デフォルトの期限切れメッセージが表示されます。

$ ./random.sh.x
./random.sh.x: has expired!
Please contact your provider

独自のカスタムメッセージを表示したい場合は、-m オプションを併用します。

$ ./shc -e 31/12/2011 -m "Contact admin@thegeekstuff.com for new version of this script" -f random.sh

$ ./random.sh.x
./random.sh.x: has expired!
Contact admin@thegeekstuff.com for new version of this script

6. 再配布可能な暗号化シェルスクリプトを作成する

有効期限関連の -e および -m 以外にも、以下のようなオプションが用意されています。

  • -r: セキュリティ制限を緩和し、コンパイルしたマシンと同じOS上であれば他のシステムでも実行できる、再配布可能なバイナリを生成します。
  • -T: strace や ltrace などのトレースツールでバイナリを解析・追跡できるようにします。
  • -v: 詳細情報を表示する冗長モードです。

通常は、再配布性と追跡可能性の両方を持たせるために、-r と -T を組み合わせて使うとよいでしょう。

$ ./shc -v -r -T -f random.sh
shc shll=bash
shc [-i]=-c
shc [-x]=exec '%s' "$@"
shc [-l]=
shc opts=
shc: cc random.sh.x.c -o random.sh.x
shc: strip random.sh.x
shc: chmod go-r random.sh.x

$ ./random.sh.x
How many random numbers do you want to generate? 3
28954
1410
15234

まとめ

最後にもう一度強調しておきます。そもそもシェルスクリプトを暗号化すべきではありません。しかし、shcを使って暗号化することに決めた場合は、知識のある人であればshcが生成した暗号化バイナリから元のシェルスクリプトを復元できてしまうという点を忘れないでください。shcによる暗号化はあくまで簡易的な隠蔽手段であり、本格的なセキュリティ対策ではないと認識しておきましょう。

  1. Windows 10にLinux Bashシェルをインストールする方法【WSL設定ガイド】

    Bashシェルとは?Windows 10でLinuxが動く仕組み Bashシェルは、長年にわたりLinuxに搭載されてきたコマンドラインユーティリティです。そして現在、MicrosoftはこのBashシェルをWindows 10に直接組み込みました。これは仮想マシンでも、コンテナでも、Windows向けにコンパイルされたソフトウェアでもありません。実態は、Linuxソフトウェアを実行するための「Windows Subsystem for Linux(WSL)」というサブシステムであり、AndroidアプリをWindows上で動かすために開発されていた(後に中止された)Project Asto

  2. BashのPS1変数を極める:機能的でおしゃれなLinuxプロンプトを作る10の実例

    Photo courtesy of f1r3storm85 前回の記事では、Linuxの環境変数であるPS[1-4]とPROMPT_COMMANDについて解説しました。PS1を効果的に活用すれば、コマンドプロンプト上に直接、有用な情報を表示させることができます。 映画『トゥームレイダー』のアンジェリーナ・ジョリーは、謎をスタイリッシュに解き明かすために、あらゆるガジェットや武器を自由に操ります。彼女の装備やスタイルに完全に匹敵するのは難しいとしても、せめて普段使いのLinuxプロンプトくらいは、この記事で紹介する10の実例を使って、高機能かつおしゃれにカスタマイズしてみてはいかがでしょうか。