쉘 스크립트에서 비밀번호 숨기기


23

쉘 스크립트에서 비밀번호를 숨기려면 어떻게해야합니까? 데이터베이스에 액세스하는 많은 스크립트가 있습니다. 스크립트를 열면 다른 사람들도 사용자 이름과 비밀번호를 알고 있습니다. 숨길 방법을 아는 사람이 있으면 알려주세요.

한 가지 방법이 있습니다. 암호를 파일에 넣고 파일을 숨김으로 만들고 아무도 파일에 액세스하지 못합니다 (데이터베이스에 액세스하는 동안 권한을 변경하고 스크립트에서 파일을 사용하지 마십시오).

답변:


35

첫째 , 여러 사람들이 이미 말했듯이 자격 증명을 스크립트와 별도로 유지하는 것이 필수적입니다. (보안 강화 외에도 자격 증명이 다른 여러 시스템에서 동일한 스크립트를 재사용 할 수 있음을 의미합니다.)

둘째 , 자격 증명의 보안뿐만 아니라 자격 증명이 손상되었을 때의 영향도 고려해야합니다. 데이터베이스에 대한 모든 액세스에 암호가 하나만 있으면 안되며 액세스 수준이 다른 서로 다른 자격 증명이 있어야합니다. 예를 들어, 데이터베이스에서 검색을 수행 할 수있는 DB 사용자가 한 명있을 수 있습니다. 해당 사용자에게는 읽기 전용 액세스 권한이 있어야합니다. 다른 사용자는 새 레코드를 삽입 할 권한이 있지만 삭제할 수는 없습니다. 세 번째는 레코드를 삭제할 권한이있을 수 있습니다.

각 계정에 대한 권한을 제한 할뿐만 아니라 각 계정을 사용할 수있는 위치도 제한해야합니다. 예를 들어, 웹 서버에서 사용하는 계정은 웹 서버의 다른 IP 주소에서 연결해서는 안됩니다. 데이터베이스에 대한 전체 루트 권한이있는 계정은 실제로 연결될 수있는 위치와 관련하여 매우 제한적이어야하며 대화식 이외의 다른 방식으로 사용해서는 안됩니다. 데이터베이스에서 저장 프로 시저를 사용하여 각 계정으로 수행 할 수있는 작업을 정확하게 제한하는 것도 고려하십시오.

이러한 제한 사항은 시스템의 DB 서버 쪽에서 구현해야하므로 클라이언트 쪽이 손상 되더라도 제한 사항을 변경할 수 없습니다. (그리고 분명히 DB 서버는 DB 구성 외에도 방화벽 등으로 보호해야합니다 ...)

제한된 읽기 전용 액세스 만 허용되고 특정 IP 주소에서만 허용되는 DB 계정의 경우 데이터의 민감도 및 호스트의 보안 스크립트에 따라 그 이상의 자격 증명이 필요하지 않을 수 있습니다 에서 실행 중입니다. 하나의 예는 웹 사이트의 검색 양식 일 수 있으며, 웹 페이지에 표시 될 정보 만 추출하는 저장 프로 시저 만 사용할 수있는 사용자와 함께 실행할 수 있습니다. 이 경우 암호를 추가해도 추가 보안이 실제로 제공되지는 않습니다. 그 정보는 이미 공개 된 것이며 사용자는 더 민감한 다른 데이터에 액세스 할 수 없기 때문입니다.

또한 데이터베이스에 대한 연결이 TLS를 사용하여 이루어 지거나 네트워크에서 청취하는 사람이 자격 증명을 얻을 수 있는지 확인하십시오.

셋째 , 어떤 종류의 자격 증명을 사용할 것인지 고려하십시오. 비밀번호는 하나의 형태 일 뿐이며 가장 안전하지는 않습니다. 대신 어떤 형태의 공개 / 개인 키 쌍 또는 AD / PAM 등을 사용할 수 있습니다.

넷째 , 스크립트가 실행될 조건을 고려하십시오.

대화식으로 실행되는 경우 암호 또는 개인 키 또는 개인 키의 암호를 입력하거나 실행할 때 유효한 Kerberos 티켓으로 로그인해야합니다. 즉, 스크립트는 일부 파일에서 자격 증명을 읽지 않고 실행할 때 직접 자격 증명을 제공합니다.

웹 서버에서 실행하는 경우 웹 서버를 시작할 때 자격 증명을 설정하십시오. 여기에 좋은 예가 SSL 인증서입니다. 여기에는 공개 인증서와 개인 키가 있고 개인 키에는 암호가 있습니다. 웹 서버에 개인 키를 저장할 수 있지만 Apache를 시작할 때 여전히 암호를 입력해야합니다. 서버가 시작된 후 제거하거나 잠글 수있는 물리적 카드 나 HSM과 같은 하드웨어의 자격 증명을 가질 수도 있습니다. (물론이 방법의 단점은 문제가 발생하면 서버를 자체적으로 다시 시작할 수 없다는 것입니다. 시스템이 손상 될 위험이 있지만 마일리지가 다를 수 있습니다 ...)

스크립트가 cron에서 실행되는 경우 어려운 부분입니다. 누군가가 자격 증명에 액세스 할 수있는 시스템의 아무 곳에 나 자격 증명을 배치하고 싶지는 않지만 스크립트가 자격 증명에 액세스 할 수 있도록 자격 증명을 거짓말하고 싶습니까? 글쎄요. 스크립트가하는 일을 정확히 고려하십시오. 데이터베이스에 어떤 권한이 필요합니까? 잘못된 사람이 해당 권한에 연결하더라도 문제가되지 않도록 제한 할 수 있습니까? 대신 다른 사용자가있는 서버 대신 다른 사람이 액세스 할 수없는 DB 서버에서 스크립트를 직접 실행할 수 있습니까? 내가 생각할 수없는 어떤 이유로 , 안전하지 않은 서버에서 스크립트를 실행 해야 하고 스크립트가 있어야합니다 위험한 / 파괴적인 일을 할 수있게되었습니다 ... 이제는 아키텍처를 다시 생각할 좋은시기입니다.

다섯째 , 데이터베이스의 보안을 중요하게 생각한다면 다른 사람들이 액세스 할 수있는 서버에서이 스크립트를 실행해서는 안됩니다. 누군가가 시스템에 로그인 한 경우, 그들은 것입니다 자격 증명을 얻을 수있는 가능성을 가지고있다. 예를 들어 SSL 인증서가있는 웹 서버의 경우 누군가가 루트를 얻어 httpd 프로세스의 메모리 영역에 액세스하여 자격 증명을 추출 할 수있는 이론적 인 가능성이 있습니다. 최근 SSL을 통해이 작업을 수행 할 수있는 공격이 한 번 이상 있었으며 침입자가 로그인하지 않아도됩니다.

또한 SELinux 또는 의류 또는 시스템에서 사용 가능한 모든 것을 사용하여 어떤 사용자가 무엇을 할 수 있는지 제한하십시오. 자격 증명에 액세스 할 수있는 경우에도 사용자가 데이터베이스에 연결하지 못하도록 할 수 있습니다.

이 모든 것이 당신에게 과도하게 들리고 , 그것을 할 여유가 없거나 시간이 없다면, (오만하고 엘리트 주의자) 견해로는 데이터베이스에 중요하거나 민감한 것을 저장해서는 안됩니다. 중요하거나 민감한 것을 저장하지 않으면 자격 증명을 저장하는 위치도 중요하지 않습니다. 어떤 경우 암호를 사용합니까?

마지막으로 당신이 절대적으로 자격 증명의 어떤 종류를 저장하는 피할 수없는 경우, 당신은 (스크립트 요청에 의해 스크립트가해야하기 때문에 자격 증명이 대단히 일시적으로 소유권을 부여 할 수있는 읽기 전용 루트 및 루트가 소유 할 수 없는 일 꼭 필요한 경우가 아니면 루트로 실행하고 데이터베이스에 연결해도 필요하지 않습니다. 그러나 여전히 좋은 생각은 아닙니다.


9
거만하고 엘리트가 아닙니다. 그렇지 않으면 나도 마찬가지입니다. "도둑이 침입 할 경우 보석을 어떻게 보호 할 수 있습니까?" "볼트 / 용접이 고정 된 금고에 보관하십시오." "문제가 너무 심해서 휴대용 금고를 가져 와서 열쇠를 열쇠 고리에 걸어 두겠습니다." "그런 다음 금고를 사용하지 않아도됩니다." 현명한 조언.
와일드 카드

12

우선, 어떤 방법 으로든 암호를 스크립트 내부 또는 스크립트와 함께 저장하지 않아도되도록 변경할 수 있다면 모든 노력을 기울여야합니다. Jenny D의 답변 에는 그 효과에 대한 많은 좋은 조언이 포함되어 있습니다.

그렇지 않으면, 권한이 제한된 별도의 파일에 비밀번호를 배치하려는 생각은 그 정도입니다. 예를 들어 기본 스크립트에서 해당 파일을 소싱 할 수 있습니다.

. /usr/local/etc/secret-password-here

권한이있는 사람 만 실행할 수 있도록 기본 스크립트의 권한을 제한 할 수도 있지만 암호 자체 만 제한된 파일에 제안하고 저장하는 것이 좋습니다. 그렇게하면 코드 자체 (민감한 비밀)를 검사하고 버전을 제어하고 스크립트를 더 쉽게 복사 할 수 있습니다.


@BasileStarynkevitch 아 그러나 나는 또한 "에 /usr/local/etc대한 심볼릭 링크 "라고 말합니다 /etc/local. 나는 그것을 놓쳤다. 따라서 당신도 옳지 만, 그것은 선택 사항입니다. 그러나, 그것은 중요하지 않으며 개인적인 취향입니다.
Celada

1
나는을 backuping하고 것을 제외하고는 /etc/ 있지만 /usr/local/ (I 디스크 충돌 후 재 구축 할 수 있습니다 생각하는)
실레 Starynkevitch에게

백업에 대한 공정한 포인트
Celada

3

다른 답변은 그 방법 을 다루었 지만, 나는 그 여부를 고려할 것이다 . 사용자가 어떤 종류의 데이터베이스에 연결 하느냐에 따라 해당 클라이언트 프로그램에서 이미 사용중인 적절한 메커니즘이 이미있을 수 있습니다.이 경우 반드시 사용하십시오 ( ~/.mysqlrc또는 생각합니다 ~/.pgpass).

여러 사용자가 공유 계정을 사용하여 특정 쿼리를 수행하기 위해 데이터베이스에 액세스 할 수있는 기능을 제공하는 경우에는 안됩니다. 대신 데이터베이스에 계정이 있고 해당 계정에 필요한 것보다 더 많은 권한이 없는지 확인하십시오 (아마도 대부분의 읽기 권한과 쓰기 권한이 거의 없음). 액세스 할 수없는 특정 테이블에 대해 특정 쿼리를 작성해야하는 경우이를 위해 저장 프로 시저를 제공하십시오 SECURTY DEFINER.

위의 방법으로 자격 증명을 저장할 필요가 없으면 여기에서 다른 답변 읽으십시오.


1

액세스 할 수없는 곳에 암호를 숨기려는 상황은 상황에 따라 정상일 수 있습니다.

정보가 분리되어 있으면 파일을 간단하게 편집 할 수 있습니다. 예를 들어 동료와의 코드 검토 중에는 파일이 표시되지 않습니다. 그러나 귀하의 계정에 액세스 할 수있는 사람은 누구나 이러한 파일을 쉽게 찾을 수 있습니다. 에 ~/.ssh대한 ssh액세스 권한 ~/.ssh이 충분히 제한되지 않은 경우 불평 하는 단순한 이유 때문에 이러한 목적으로 하위 디렉토리를 사용했습니다 .

그러나 이와 같은 사용자 이름 및 / 또는 암호의 이탈을 방지하기 위해 수행 할 수있는 다른 작업이 있습니다.

난독 화 : 스크립트를 편집하는 동안 다른 사람이 사용자 이름이나 비밀번호를 읽지 못하게하려면 일반 텍스트가 아닌 난독 한 텍스트에 넣을 수 있습니다. 난독 처리 된 버전이 누군가를보고 암기하지 못하도록 충분히 길면 해독 방법과 키가 제대로 표시되어 있어도 알 수 없습니다. 물론 계정에 액세스 할 수있는 사람이 여전히 우회 할 수 있습니다.

GPG 사용 :

시스템의 루트 사용자에 의한 공격에 대한 약간의 개선은 여전히 ​​완전히 증명되지는 않지만 gpg공개 파일의 사용자 이름 / 비밀번호 쌍을 암호화 하고 스크립트가 파일의 내용을 검색하도록하는 것입니다 (암호를 묻는 메시지가 표시되지 않으면 캐시 / 만료). ggp-card를 사용하여 랩톱을 그대로두고 카드를 꺼내면 핀이 여전히 캐시되어 있어도 액세스 할 수 없습니다. 적어도 몇 분 안에 물건을 20 번 돌리면 핀을 한 번만 제공해야합니다.

보안은 항상 편의성 (설정 및 사용)과 반비례합니다.


0

bash 스크립트에 비밀번호를 저장하는 방법이 있지만 스크립트 를 실제로 읽고 난독 처리하여 아무도 실제로 어떤 작업을 수행하는지 확인하기 위해 스크립트를 읽거나 디버거를 실행할 수 없도록해야합니다. bash / shell 스크립트를 암호화하고 난독 화하고 실제로 실행 가능하게하려면 여기에 복사하여 붙여 넣으십시오.

http://www.kinglazy.com/shell-script-encryption-kinglazy-shieldx.htm

위의 페이지에서 스크립트를 제출하기 만하면됩니다 (심장을 위해 먼저 샘플 스크립트를 제출할 수 있습니다). zip 파일이 생성됩니다. 다운로드 링크를 마우스 오른쪽 버튼으로 클릭하고 제공된 URL을 복사하십시오. 그런 다음 UNIX 상자로 이동하여 다음 단계를 수행하십시오.

설치:

  1. zip 파일에 대한 wget 링크

  2. 새로 다운로드 한 zip 파일의 압축을 풉니 다

  3. cd / tmp / KingLazySHIELD

  4. ./install.sh / var / tmp / KINGLAZY / SHIELDX- (your-script-name) / home / (your-username) -force

위의 설치 명령은 다음과 같습니다.

  1. / var / tmp / KINGLAZY / SHIELDX- (your-script-name) 디렉토리에 스크립트의 암호화 된 버전을 설치합니다.

  2. / home / (your-username) 대신 지정한 디렉토리에이 암호화 된 스크립트에 대한 링크를 배치합니다. 이렇게하면 절대 경로를 입력하지 않고도 스크립트에 쉽게 액세스 할 수 있습니다.

  3. 아무도 스크립트를 수정할 수 없음-암호화 된 스크립트를 수정하려고하면 시도가 중지되거나 제거 될 때까지 스크립트를 사용할 수 없게됩니다. 누군가가 스크립트를 실행하는 것 이외의 다른 작업을 시도 할 때마다 해킹 또는 수정 시도와 같이 사용자에게 알리도록 구성 할 수도 있습니다.

  4. 아무도 복사 할 수 없도록합니다. 어느 누구도 스크립트를 한적한 위치에 복사 할 수 없으며 스크립트의 작동 방식을 알아볼 수 없습니다. 모든 스크립트 사본은 설치 중 지정한 원래 위치에 대한 링크 여야합니다 (4 단계).

노트:

나는 이것이 사용자에게 응답을 요구하는 대화 형 스크립트에서 작동하지 않는다고 생각합니다. 값은 스크립트에 하드 코딩되어야합니다. 암호화는 아무도 그 값을 실제로 볼 수 없도록 보장하므로 걱정할 필요가 없습니다.


0

보안에 관계없이 다른 해결책은 (다른 파일이나 데이터베이스에 자격 증명을 유지하는 것이 좋습니다) gpg를 사용하여 암호를 암호화하고 스크립트에 삽입하는 것입니다.

암호가없는 gpg 키 페어를 사용하여 USB에 보관합니다. (참고 :이 키 페어를 내보낼 때는 --armor를 사용하지 말고 이진 형식으로 내보내십시오.)

먼저 비밀번호를 암호화하십시오.

echo -n "pAssw0rd" | gpg --armor --no-default-keyring --keyring /media/usb/key.pub --recipient someone@mail.com --encrypt

표준 출력으로 gpg 암호화 된 비밀번호가 인쇄됩니다. 전체 메시지를 복사하여 스크립트에 추가하십시오.

password=$(gpg --batch --quiet --no-default-keyring --secret-keyring /media/usb/key.priv --decrypt <<EOF 
-----BEGIN PGP MESSAGE-----

hQEMA0CjbyauRLJ8AQgAkZT5gK8TrdH6cZEy+Ufl0PObGZJ1YEbshacZb88RlRB9
h2z+s/Bso5HQxNd5tzkwulvhmoGu6K6hpMXM3mbYl07jHF4qr+oWijDkdjHBVcn5
0mkpYO1riUf0HXIYnvCZq/4k/ajGZRm8EdDy2JIWuwiidQ18irp07UUNO+AB9mq8
5VXUjUN3tLTexg4sLZDKFYGRi4fyVrYKGsi0i5AEHKwn5SmTb3f1pa5yXbv68eYE
lCVfy51rBbG87UTycZ3gFQjf1UkNVbp0WV+RPEM9JR7dgR+9I8bKCuKLFLnGaqvc
beA3A6eMpzXQqsAg6GGo3PW6fMHqe1ZCvidi6e4a/dJDAbHq0XWp93qcwygnWeQW
Ozr1hr5mCa+QkUSymxiUrRncRhyqSP0ok5j4rjwSJu9vmHTEUapiyQMQaEIF2e2S
/NIWGg==
=uriR
-----END PGP MESSAGE-----
EOF)

이런 방식으로 USB가 시스템에 장착 된 경우에만 암호를 해독 할 수 있습니다. 물론 키를 시스템으로 가져 오거나 (보안 수준이 낮거나 전혀 보안되지 않음) 암호로 개인 키를 보호 할 수 있으므로 자동화 할 수 없습니다.


-2
#!/bin/bash
unset username
unset password
unset dbname
echo -n "username:"
read username
echo -n "dbname:"
read dbname
prompt="password:"

    while IFS= read -p "$prompt" -r -s -n 1 char
            do
                    if [[ $char == $'\0' ]]
                            then
                                    break
                    fi
                    prompt='*'
                    password+="$char"
            #       read -s -p "Enter Password: "  pswd
            #       echo -e "\nYour password is: " $pswd
            done

3
코드를 들여 쓰기했습니다. 어떻게하려고하는지 설명 할 수 있습니까?
Archemar

-6

비밀번호를 저장해야한다고 생각하지 않습니다. 나는 이것에 대한 하나의 좋은 이유를 생각할 수 없습니다. 오히려, 당신은 저장해야 소금에 절인 해시 원래 암호를 입력으로 전달,하지만 결코 될 때 일부 기능에 의해 안정적으로 생산되는 일부 문자열 -이 암호를 암호를 .


5
이것이 어떻게 a) 암호가 필요한 서비스에 연결할 수 있는지, b) 사용자가 스크립트를 볼 수 있는지, 그리고 암호인지 여부에 대한 인증 세부 정보를 파악할 수있는 문제를 어떻게 해결할 수 있는지 잘 모르겠습니다. 여부
Jenny D

1
내가 작성하기 전에 내 대답을 알고 있다고 주장합니다.
Jenny D

1
나는 지금 내 대답을 썼다. 자격 증명이 메모리에 저장되면 서버에 액세스 할 수있는 공격자로부터 완전히 안전하지 않습니다. 또한 귀하의 간결한 답변은 정확하지는 않지만 크게 도움이되지 않았습니다. 다음에 누군가가 ServerFault에서 우리가 Unix / Linux의 사람들만큼 좋지 않다고 불평 할 때 그것을 지적 할 생각입니다. :-)
Jenny D

2
@JennyD-일단 cred가 메모리에 있으면-거기에 머물 필요가 없습니다-어쨌든 w / hash를 대신 해야하는 아주 좋은 이유입니다. 그럼에도 불구하고, 나는 그 특성으로 매우 잘 알려진 im의 큰 예로써 커뮤니티의 예의 기준을 기쁘게 표현할 것입니다.
mikeserv

4
큰 토론을 한 후, 제니가 아니라 내가 공감 한 사람이라는 오해가있는 경우를 대비하여 언급하고 싶습니다. 그리고 그 이유는 인증서 및 개인 키 또는 대화식으로 입력 한 암호를 사용하거나 OP가 원하는 것을 수행하는 것이 좋은지 아닌지에 대한 의견이 아닙니다. 클라이언트 자격 증명으로 암호의 소금에 절인 해시를 저장하는 것은 중요하지 않습니다. 소금에 절인 해시는 연결이 아닌 인증을 확인하는 연결이 아닌 인증을 확인하는 것입니다. 그것을 제출하는 쪽.
Celada
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.