환경 변수에 비밀번호가 저장되어 있습니다.
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
이 답변을 사용 사례에 맞게 조정할 수 있습니다.