셸 스크립트 암호화, 정말 필요한가?
질문: 리눅스 환경에서 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가 만든 암호화 바이너리에서 언제든 원본 스크립트를 복원해낼 수 있다는 사실을 반드시 기억하세요.