질문 :Linux 환경에서 bash 쉘 스크립트를 어떻게 암호화합니까? 셸 스크립트에는 암호가 포함되어 있으며 실행 액세스 권한이 있는 다른 사람이 셸 스크립트를 보고 암호를 얻는 것을 원하지 않습니다. 내 셸 스크립트를 암호화하는 방법이 있습니까?
A: 첫째, 가장 좋은 방법은 셸 스크립트를 암호화하지 않는 것입니다. 셸 스크립트를 보는 사람이 정확히 무엇을 하는지 이해할 수 있도록 셸 스크립트를 제대로 문서화해야 합니다. 비밀번호와 같은 민감한 정보가 포함된 경우 암호화하지 않고 셸 스크립트를 작성하는 다른 접근 방식을 찾아야 합니다.
그럼에도 불구하고 여전히 쉘 스크립트 암호화를 주장한다면 아래 설명된 대로 SHC 유틸리티를 사용할 수 있습니다. shc에 의해 생성된 암호화된 쉘 스크립트는 일반 사용자가 읽을 수 없습니다. 그러나 이것이 어떻게 작동하는지 이해하는 사람은 shc에 의해 생성된 암호화된 바이너리에서 원본 쉘 스크립트를 추출할 수 있습니다.
SHC는 쉘 스크립트 컴파일러를 나타냅니다.
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. 샘플 셸 스크립트 만들기
테스트 목적으로 shc를 사용하여 암호화하려는 샘플 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 소스 코드입니다. 이 C 소스 코드는 위의 암호화된 random.sh.x 파일을 생성하기 위해 컴파일됩니다. shc 이면의 전체 논리는 random.sh 셸 스크립트를 random.sh.x.c C 프로그램으로 변환하는 것입니다(물론 이를 컴파일하여 random.sh.x 실행 파일을 생성함).
$ 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를 실행하는 것을 원하지 않는다고 가정해 보겠습니다(테스트 목적으로 작년 날짜를 사용했습니다).
만료 날짜를 지정하는 "shc -e" 옵션을 사용하여 새 암호화된 셸 스크립트를 만듭니다. 만료 날짜는 dd/mm/yyyy 형식으로 지정됩니다.
$ ./shc -e 31/12/2011 -f random.sh
이 예에서 누군가 random.sh.x를 실행하려고 하면 2011년 12월 31일 이후에 아래와 같이 기본 만료 메시지를 받게 됩니다.
$ ./random.sh.x ./random.sh.x: has expired! Please contact your provider
사용자 정의 만료 메시지를 지정하려면 -m 옵션을 사용하십시오(아래 표시된 것처럼 -e 옵션과 함께).
$ ./shc -e 31/12/2011 -m "Contact [email protected] for new version of this script" -f random.sh $ ./random.sh.x ./random.sh.x: has expired! Contact [email protected] for new version of this script
6. 재배포 가능한 암호화된 셸 스크립트 만들기
-e 및 -m(만료용) 외에도 다음 옵션을 사용할 수도 있습니다.
- -r은 컴파일된 운영 체제와 동일한 운영 체제를 실행하는 다른 시스템에서 실행되는 재배포 가능한 바이너리를 생성하기 위해 보안을 완화합니다.
- -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에 의해 생성된 암호화된 바이너리에서 원래 셸 스크립트를 생성할 수 있음을 기억하십시오.