Bash 스크립트에서 암호화된 암호를 사용하는 방법

게시 됨: 2022-01-29
Ubuntu 스타일의 Linux 노트북.
Fatmawati achmad zaenuri/Shutterstock.com

Linux 스크립트를 사용하여 암호로 보호된 리소스에 연결해야 하는 경우 스크립트에 해당 암호를 넣는 것이 불편할 것입니다. OpenSSL이 그 문제를 해결해 드립니다.

암호 및 스크립트

쉘 스크립트에 암호를 넣는 것은 좋은 생각이 아닙니다. 사실, 그것은 정말 나쁜 생각입니다. 스크립트가 엉뚱한 손에 들어가면 그것을 읽는 모든 사람이 암호가 무엇인지 알 수 있습니다. 그러나 스크립트를 사용해야 한다면 다른 무엇을 할 수 있습니까?

프로세스가 해당 지점에 도달하면 암호를 수동으로 입력할 수 있지만 스크립트가 무인으로 실행될 경우 작동하지 않습니다. 고맙게도 암호를 스크립트에 하드 코딩하는 대안이 있습니다. 반 직관적으로, 강력한 암호화와 함께 이를 달성하기 위해 다른 암호를 사용합니다.

예제 시나리오에서는 Ubuntu 컴퓨터에서 Fedora Linux 컴퓨터에 원격으로 연결해야 합니다. 우리는 Bash 쉘 스크립트를 사용하여 Fedora 컴퓨터에 SSH 연결을 만들 것입니다. 스크립트는 자동으로 실행되어야 하며 스크립트에 원격 계정의 암호를 입력하고 싶지 않습니다. 이 경우에는 SSH 키를 사용할 수 없습니다. Fedora 컴퓨터에 대한 제어 또는 관리자 권한이 없는 것처럼 가장하기 때문입니다.

암호화를 처리하기 위해 잘 알려진 OpenSSL 툴킷을 사용하고 SSH 명령에 비밀번호를 제공하기 위해 sshpass 라는 유틸리티를 사용할 것입니다.

관련: Linux 셸에서 SSH 키를 만들고 설치하는 방법

OpenSSL 및 sshpass 설치

다른 많은 암호화 및 보안 도구가 OpenSSL을 사용하기 때문에 컴퓨터에 이미 설치되어 있을 수 있습니다. 그러나 그렇지 않은 경우 설치하는 데 잠시 시간이 걸립니다.

Ubuntu에서 다음 명령을 입력합니다.

 sudo apt는 openssl을 얻습니다. 

sshpass 를 설치하려면 다음 명령을 사용하십시오.

 sudo apt 설치 sshpass 

Fedora에서는 다음을 입력해야 합니다.

 sudo dnf 설치 openssl 

sshpass 를 설치하는 명령은 다음과 같습니다.

 sudo dnf 설치 sshpass 

Manjaro Linux에서 다음을 사용하여 OpenSSL을 설치할 수 있습니다.

 sudo pacman -Sy openssl 

마지막으로 sshpass 를 설치하려면 다음 명령을 사용하십시오.

 sudo pacman -Sy sshpass 

명령줄에서 암호화

스크립트와 함께 openssl 명령을 사용하기 전에 명령줄에서 사용하여 익숙해지도록 합시다. 원격 컴퓨터에 있는 계정의 비밀번호가 rusty!herring.pitshaft . openssl 을 사용하여 해당 비밀번호를 암호화할 것입니다.

그럴 때 암호화 암호를 제공해야 합니다. 암호화 암호는 암호화 및 암호 해독 프로세스에 사용됩니다. openssl 명령에는 많은 매개변수와 옵션이 있습니다. 잠시 후에 각각에 대해 살펴보겠습니다.

 echo 'rusty!herring.pitshaft' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'pick.your.password' 

우리는 파이프를 통해 openssl 명령으로 원격 계정 비밀번호를 보내기 위해 echo 를 사용하고 있습니다.

openssl 매개변수는 다음과 같습니다.

  • enc -aes-256-cbc : 인코딩 유형입니다. 우리는 암호 블록 체인과 함께 고급 암호화 표준 256비트 키 암호를 사용하고 있습니다.
  • -md sha512 : 메시지 다이제스트(해시) 유형입니다. 우리는 SHA512 암호화 알고리즘을 사용하고 있습니다.
  • -a : 암호화 단계 이후와 복호화 단계 이전에 base-64 인코딩을 적용하도록 openssl 에 지시합니다.
  • -pbkdf2 : 암호 기반 키 파생 기능 2(PBKDF2)를 사용하면 무차별 대입 공격이 암호를 추측하는 데 성공하기가 훨씬 더 어려워집니다. PBKDF2는 암호화를 수행하기 위해 많은 계산이 필요합니다. 공격자는 이러한 모든 계산을 복제해야 합니다.
  • -iter 100000 : PBKDF2가 사용할 계산 횟수를 설정합니다.
  • -salt : 무작위로 적용된 솔트 값을 사용하면 일반 텍스트가 같더라도 암호화된 출력이 매번 다르게 됩니다.
  • -pass pass:'pick.your.password' : 암호화된 원격 암호를 해독하는 데 사용할 암호입니다. pick.your.password 를 선택한 강력한 암호로 대체하십시오.

rusty!herring.pitshaft 암호의 암호화된 버전이 터미널 창에 기록됩니다.

터미널 창에 쓰여진 암호화된 비밀번호

이를 해독하려면 암호화에 사용한 것과 동일한 매개변수를 사용하여 암호화된 문자열을 openssl 에 전달해야 하지만 -d (암호 해독) 옵션을 추가합니다.

 echo U2FsdGVkX19iiiRNhEsG+wm/uKjtZJwnYOpjzPhyrDKYZH5lVZrpIgo1S0goZU46 | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'pick.your.password' 

광고

문자열이 해독되고 원격 사용자 계정의 암호인 원래 텍스트가 터미널 창에 기록됩니다.

터미널 창에 쓴 암호 해독

이는 원격 사용자 계정 암호를 안전하게 암호화할 수 있음을 증명합니다. 암호화 단계에서 제공한 암호를 사용하여 필요할 때 암호를 해독할 수도 있습니다.

그러나 이것이 실제로 우리의 상황을 개선합니까? 원격 계정 암호를 해독하기 위해 암호화 암호가 필요한 경우 반드시 암호 해독 암호가 스크립트에 있어야 합니까? 네, 그렇습니다. 그러나 암호화된 원격 사용자 계정 암호는 다른 숨겨진 파일에 저장됩니다. 파일에 대한 권한은 당신과 분명히 시스템의 루트 사용자 이외의 다른 사람이 파일에 액세스하는 것을 방지합니다.

암호화 명령의 출력을 파일로 보내기 위해 리디렉션을 사용할 수 있습니다. 파일 이름은 ".secret_vault.txt"입니다. 암호화 암호를 보다 강력한 것으로 변경했습니다.

 echo 'rusty!herring.pitshaft' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password' > .secret_vault.txt 

아무 일도 일어나지 않지만 암호가 암호화되어 ".secret_vault.txt" 파일로 전송됩니다.

숨겨진 파일의 암호를 해독하여 작동하는지 테스트할 수 있습니다. 여기서 echo 가 아닌 cat 을 사용하고 있다는 점에 유의하세요.

 고양이 .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password' 

광고

파일의 데이터에서 암호가 성공적으로 해독되었습니다. 다른 사람이 액세스할 수 없도록 chmod 를 사용하여 이 파일에 대한 권한을 변경합니다.

 chmod 600 .secret_vault.txt
 ls -l .secret_vault.txt 

권한 마스크 600을 사용하면 파일 소유자 이외의 모든 액세스 권한이 제거됩니다. 이제 스크립트 작성으로 넘어갈 수 있습니다.

관련: Linux에서 chmod 명령을 사용하는 방법

스크립트에서 OpenSSL 사용

스크립트는 매우 간단합니다.

 #!/bin/bash

# 원격 계정의 이름
REMOTE_USER=괴짜

# 원격 계정의 비밀번호
REMOTE_PASSWD=$(cat .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password')

# 원격 컴퓨터
REMOTE_LINUX=fedora-34.local

# 원격 컴퓨터에 연결하고 script.log라는 파일에 타임스탬프를 넣습니다.
sshpass -p $REMOTE_PASSWD ssh -T $REMOTE_USER@$REMOTE_LINUX << _remote_commands
echo $USER "-" $(날짜) >> /home/$REMOTE_USER/script.log
_remote_commands
  • REMOTE_USER 라는 변수를 "geek"으로 설정했습니다.
  • 그런 다음 잠시 전에 사용한 것과 동일한 명령을 사용하여 ".secret_vault.txt" 파일에서 가져온 해독된 암호 값으로 REMOTE_PASSWD 라는 변수를 설정합니다.
  • 원격 컴퓨터의 위치는 REMOTE_LINUX 라는 변수에 저장됩니다.

해당 정보로 ssh 명령을 사용하여 원격 컴퓨터에 연결할 수 있습니다.

  • sshpass 명령은 연결 라인의 첫 번째 명령입니다. -p (암호) 옵션과 함께 사용합니다. 이를 통해 ssh 명령에 보내야 하는 암호를 지정할 수 있습니다.
  • 원격 컴퓨터에서 의사 TTY를 할당할 필요가 없기 때문에 ssh 와 함께 -T (의사 터미널 할당 비활성화) 옵션을 사용합니다.
Linux의 Bash에서 "Here Documents"를 사용하는 방법
관련 Linux의 Bash에서 "Here Documents"를 사용하는 방법

우리는 원격 컴퓨터에 명령을 전달하기 위해 짧은 here 문서 를 사용하고 있습니다. 두 _remote_commands 문자열 사이의 모든 것은 원격 컴퓨터의 사용자 세션에 대한 지침으로 전송됩니다. 이 경우에는 Bash 스크립트의 한 줄입니다.

원격 컴퓨터로 전송된 명령은 단순히 사용자 계정 이름과 타임스탬프를 "script.log"라는 파일에 기록합니다.

스크립트를 복사하여 편집기에 붙여넣고 "go-remote.sh"라는 파일에 저장합니다. 자신의 원격 컴퓨터 주소, 원격 사용자 계정 및 원격 계정 암호를 반영하도록 세부 정보를 변경하는 것을 잊지 마십시오.

chmod 를 사용하여 스크립트를 실행 가능하게 만드십시오.

 chmod +x go-remote.sh 

광고

남은 것은 그것을 시도하는 것입니다. 스크립트를 실행해 보겠습니다.

 ./go-remote.sh 

우리의 스크립트는 무인 스크립트를 위한 최소한의 템플릿이기 때문에 터미널에 출력이 없습니다. 그러나 Fedora 컴퓨터에서 "script.log" 파일을 확인하면 원격 연결이 성공적으로 이루어졌고 "script.log" 파일이 타임스탬프로 업데이트되었음을 ​​알 수 있습니다.

 고양이 스크립트.로그 

귀하의 비밀번호는 비공개입니다

원격 계정 암호는 스크립트에 기록되지 않습니다.

그리고 암호 해독 암호 스크립트에 있지만 다른 사람은 암호를 해독하고 원격 계정 암호를 검색하기 위해 ".secret_vault.txt" 파일에 액세스할 수 없습니다.