Bash는 환경 변수를 표준 입력으로 안전하게 파이프합니다.

Bash는 환경 변수를 표준 입력으로 안전하게 파이프합니다.

환경 변수에 비밀번호가 저장되어 있습니다.

read -s passwd
export passwd

단점: 사용echo $passwd

이제 이것을 비밀번호를 허용하는 명령 stdin(예: kinit)으로 파이프하고 싶습니다. 그러나 bash가 set -x활성화되면 비밀번호가 유출됩니다.

(warning: will leak password if set -x is enabled)
$ echo $passwd | kinit [email protected]

+ kinit [email protected]
+ echo secretpassword
...(kinit output)...

대안: 사용printenv passwd

printenv그래서 비밀번호를 stdin, 대신에 쓰곤 했습니다 echo.

(is this ok?)
$ printenv passwd | kinit [email protected]

+ kinit [email protected]
+ printenv passwd
...(kinit output)...

시도할 때 bash 출력에 비밀번호가 인쇄되지 않습니다.

Q: 사용할 수 있나요 printenv?

하지만 정말 안전한가요? 비밀번호를 유출할 수 있는 bash 구성이 어딘가에 있습니까?

set -x편집: stdout/stderr로 인쇄하는 것이 수정되었다고 생각하지 마세요 .

답변1

를 사용하면 printenv변수를 내보내야 합니다. 즉, 해당 변수를 스크립트의 다른 명령에 노출해야 누출될 수 있습니다. 그러나 변수를 내보내는 것과 입력으로 사용하는 것 사이에 다른 명령이 없고 사용 후 즉시 설정을 해제하면 실수로 로그에 덤프될 가능성이 줄어듭니다.

Bash를 사용하는 경우 다음 문자열을 사용할 수 있습니다.

kinit [email protected] <<<"$passwd"

여기에 있는 문자열은 set -x출력에 포함되지 않으며 변수를 내보낼 필요가 없습니다.

$ bar=abc
+ bar=abc
$ cat <<<"$bar"
+ cat
abc

하지만 여기 문자열은 임시 파일을 생성하므로 잠재적인 유출 원인으로 간주될 수 있습니다.

답변2

sshpass임시 fd를 사용하여 stdin 대신 매개변수로 비밀번호를 사용하는 예를 들어 보겠습니다 set -x. 이를 사용하면 비밀번호가 인쇄되지 않습니다.

#Set the password as an environment variable
export password=MyPassword
#Create the file descriptor 3 and link it to /tmp/pwd, you can use one from 3 to 9.
exec 3<> /tmp/pwd
#Copy the content of password  env variable to /tmp/pwd using dd command
dd of=/tmp/pwd <<< "$password" 
#Here using cat and passing it to xargs so stdout will be catched by stdin of xargs, then the password will be available within the second  curly brackets
cat /tmp/pwd  | xargs -I {} sshpass -p {} ssh <user>@<ip>
#Close the file descriptor
exec 3>&-
#Remove the tmp file
rm -f /tmp/pwd

이 답변을 사용 사례에 맞게 조정할 수 있습니다.

관련 정보