
명령줄에서(내 프로그램에서 시작된 하위 프로세스에) 비밀번호를 전달하는 것은 안전하지 않은 것으로 악명 높습니다(다른 사용자도 ps 명령을 사용하여 비밀번호를 볼 수 있기 때문입니다). 환경변수로 전달할 수 있나요?
그것을 극복하기 위해 또 무엇을 사용할 수 있습니까? (환경변수 제외) 가장 간단한 해결책은 파이프를 이용하는 것 같지만, 이 간단한 해결책도 쉽지는 않습니다.
저는 Perl로 프로그래밍합니다.
답변1
프로세스 매개변수는 모든 사용자에게 표시되지만 환경은 동일한 사용자(적어도 리눅스에서는, 그리고 나는 모든 최신 UNIX 변형에 대해 생각합니다). 따라서 환경 변수를 통해 비밀번호를 전달하는 것이 안전합니다. 누군가가 환경 변수를 읽을 수 있다면 그 사람도 당신과 마찬가지로 프로세스를 실행할 수 있으므로 게임은 끝납니다.
ps
예를 들어 무언가에 대한 조사를 실행하고 실수로 결과(기밀 환경 변수 포함)를 복사하여 공공 장소에 붙여넣는 경우 환경 콘텐츠가 간접적으로 유출될 위험이 있습니다 . 또 다른 위험은 환경 변수가 필요하지 않은 프로그램(암호가 필요한 프로세스의 하위 프로세스 포함)에 환경 변수를 전달하고 해당 프로그램이 환경 변수를 비밀로 유지하기를 원하지 않기 때문에 노출한다는 것입니다. 이러한 2차 누출 위험의 심각도는 비밀번호가 있는 프로세스의 역할(실행 기간, 하위 프로세스 실행 여부)에 따라 달라집니다.
파이프와 같이 도청용으로 설계되지 않은 채널을 통해 암호를 전달하면 실수로 암호가 유출되지 않도록 하는 것이 더 쉽습니다. 송신측에서는 이 작업을 수행하기가 쉽습니다. 예를 들어, 쉘 변수에 비밀번호가 있으면 다음을 수행할 수 있습니다.
echo "$password" | theprogram
theprogram
표준 입력에 비밀번호가 필요한 경우 . 이는 echo
내장되어 있으므로 안전합니다. 외부 명령을 사용하는 것은 매개변수가 ps
출력에 노출되므로 안전하지 않습니다. 동일한 효과를 얻는 또 다른 방법은 여기 문서를 사용하는 것입니다.
theprogram <<EOF
$password
EOF
암호가 필요한 특정 프로그램에는 특정 파일 설명자에서 암호를 읽도록 지시할 수 있습니다. 다른 것에 대한 표준 입력이 필요한 경우 표준 입력 이외의 파일 설명자를 사용할 수 있습니다. 예를 들어 다음을 사용합니다 gpg
.
get-encrypted-data | gpg --passphrase-fd 3 --decrypt … 3<<EOP >decrypted-data
$password
EOP
프로그램에 파일 설명자를 읽도록 지시할 수 없지만 프로그램에 파일에서 읽도록 지시할 수 있는 경우 "/dev/fd/3"과 같은 파일 이름을 사용하여 프로그램에 파일에서 읽도록 지시할 수 있습니다. 설명자.
theprogram --password-from-file=/dev/fd/3 3<<EOF
$password
EOF
ksh, bash 또는 zsh에서는 프로세스 대체를 통해 이를 더욱 깔끔하게 수행할 수 있습니다.
theprogram --password-from-file=<(echo "$password")
답변2
매개변수나 환경 변수를 통해 직접 비밀번호를 전달하는 대신
#!/bin/bash
#filename: passwd_receiver
echo "The password is: $1"
동일한 매개변수 또는 환경 변수를 사용하여 전달합니다.파일 이름:
#!/bin/bash
#filename: passwd_receiver
echo "The password is: $(< "$1")"
그러면 합격할 수 있어요권한으로 보호되는 일반 파일(동일한 사용자로 실행되는 다른 프로세스로부터 보호되지는 않지만) /dev/stdin
또는관로위치는 다음과 같습니다(내가 아는 한 동일한 사용자로 실행되는 다른 프로세스로부터 사용자를 보호합니다).
echo PASSWORD | ./passwd_receiver /dev/stdin
/dev/stdin
여기를 이용 하면파이프여야 합니다.. 터미널인 경우 동일한 사용자로 실행되는 다른 프로세스에서 읽을 수 있습니다.
이미 다른 용도로 필요한 경우 다음을 /dev/stdin
사용할 수 있습니다.프로세스 교체이는 파이프를 지원하는 셸을 사용하는 경우 파이프를 사용하는 것과 기본적으로 동일합니다.
./passwd_receiver <(echo PASSWORD)
명명된 파이프(FIFO)는 동일해 보이지만 가로챌 수 있습니다.
이러한 솔루션은완전히 안전하지는 않음둘 다 괜찮지만 자주 교체하는 메모리 제약이 있는 시스템을 사용하지 않는 한 충분히 비슷할 것입니다.
이상적으로는 이러한 파일(파이프도 파일임)을 레이블이 붙은 메모리로 읽어 들일 것입니다.시계 잠금(2)비가환적이기 때문에 이는 비밀번호 처리기(예: gnupg)가 일반적으로 수행하는 작업입니다.
노트:
이론적으로 파일 설명자 번호를 전달하는 것은 파일 이름을 전달하는 것만큼 좋지만, filename은
<()
파일 설명자 번호보다는 파일 이름을 제공하므로 더 실용적입니다(그리고coproc
s는 태그가 지정된 파일 설명자를 제공합니다)FD_CLOEXEC, 이는 이 컨텍스트에서 이러한 파일 설명자를 사용할 수 없게 만듭니다).
/proc/sys/kernel/yama/ptrace_scope
메모리로 설정된 Linux 시스템을 사용하는 경우0
)다른(루트가 아닌) 사용자로 실행되는 프로세스에서 비밀번호를 멀리해야 한다면 매개변수, 환경 변수, 파이프 및 권한으로 보호된 파일은 모두 괜찮습니다.
답변3
아니요, 환경 변수도 쉽게 읽고 하위 프로세스로 유출됩니다. 파이프를 사용하여 통과하십시오.
답변4
다른 적합한 옵션이 없으면 Linux 키 보유 서비스(커널 키링)를 고려하십시오.
다음으로 시작하세요:보안/keys.txt. 기본 키링 중 하나는 상위 프로세스와 하위 프로세스 간에 복제될 수 있습니다.
가장 간단한 해결책은 아니지만 존재하며 유지 관리되고 사용되는 것 같습니다(작년 Android 버그에서도 이에 대해 다루었습니다.)
나는 그것이 "정치적"인 상태인지는 모르지만 비슷한 필요성이 있었고 Guile 바인딩을 조사하기 시작했습니다. 기존 Perl 지원이 발생하지 않았습니다.