Computer >> 컴퓨터 >  >> 프로그래밍 >> Bash 프로그래밍

리눅스에서 SHC로 Bash 셸 스크립트 암호화하는 방법

셸 스크립트 암호화, 정말 필요한가?

질문: 리눅스 환경에서 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 -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로 셸 스크립트 암호화하기

아래와 같이 shc로 random.sh 스크립트를 암호화합니다.

$ ./shc -f random.sh

명령 실행 후 다음 두 개의 파일이 생성됩니다.

$ 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 소스 코드. shc의 핵심 원리는 셸 스크립트를 C 프로그램으로 변환한 뒤, 이를 컴파일해서 실행 파일(random.sh.x)을 만드는 것입니다.

각 파일의 유형을 file 명령으로 확인하면 다음과 같습니다.

$ 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

주의할 점은, 생성된 바이너리도 여전히 셸에 의존한다는 것입니다. 즉, 스크립트 첫 줄(shebang)에 지정된 /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

직접 만든 사용자 지정 메시지를 표시하고 싶다면, 아래와 같이 -e 옵션과 함께 "-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 : 보안 수준을 완화하여, 컴파일된 시스템과 동일한 운영체제를 사용하는 다른 시스템에서도 실행할 수 있는 재배포용 바이너리를 생성합니다.
  • -T : strace, ltrace 같은 추적 도구로 생성된 바이너리를 분석할 수 있도록 허용합니다.
  • -v : 상세 정보(verbose)를 출력합니다.

일반적으로는 재배포 가능하고 추적 가능한 암호화 스크립트를 만들기 위해 -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가 만든 암호화 바이너리에서 언제든 원본 스크립트를 복원해낼 수 있다는 사실을 반드시 기억하세요.