원격 명령에 사용하기 위해 SSH를 통해 비밀번호를 안전하게 전송하는 방법

원격 명령에 사용하기 위해 SSH를 통해 비밀번호를 안전하게 전송하는 방법

로컬 서버에는 미리 정의된 환경 변수( )에 비밀번호를 저장하는 프로그램이 있습니다 SPECIAL_PASSWORD.

원격 서버에는 미리 정의된 환경 변수( )에서 비밀번호를 읽고 사용하는 프로그램이 있습니다 SPECIAL_PASSWORD.

원격 서버에서 프로그램을 실행하고, 로컬 환경에서 설정한 비밀번호를 입력하고 싶습니다.

내 시도는 다음과 같습니다.

local_command # produces the SPECIAL_PASSWORD Env Var
ssh -l remote_user remote_server <<EOSSH
export SPECIAL_PASSWORD=${SPECIAL_PASSWORD} # Transfer Env Var
remote_command # consumes SPECIAL_PASSWORD Env Var
EOSSH

또한 예상대로 작동하는 것 같습니다.

  1. 유닉스는 ps비밀번호를 유출하지 않는 것 같습니다
  2. 현재 프로세스 또는 해당 하위 프로세스만 비밀번호에 액세스할 수 있습니다.

하지만 이것이 정말 안전합니까? 비밀번호를 항상 읽을 수 있습니까? 더 나은 옵션이 있습니까?

위의 트릭 없이 환경 변수의 하위 집합을 전송할 수 있도록 sshd_config( AcceptEnv) 및 ssh_config( )를 변경할 수 있습니다 . SendEnv그러나 시스템은 엄격하게 제어되며 sshd_config에는 관리자 개입이 필요합니다. 제 경우에는 변경이 불가능해 보입니다 sshd_config.

고쳐 쓰다

저는 실행 중인 원격 SSH 명령으로 데이터를 전송하여 제공되는 다른 솔루션을 사용하고 있습니다. 이 구문은 더 이상 HERE 문서에서 사용되지 않습니다.

sendEnv() {
  echo "var1=${var1}"
  echo "var2=${var2}"
  ...
}

sendEnv | ssh -l remote_user remote_server "receiving_command".

내 경우에는 receiving_command.System.in

그것은 매력처럼 작동합니다.

답변1

remote_user및 로 읽을 수 있습니다 root. remote_command누구나 읽을 수 있는 파일이나 이와 유사한 파일에 작성하지 않는 한 다른 것은 없습니다 .

/proc파일 시스템의 프로세스 환경을 검사할 수 있습니다 /proc/$pid/environ. 파일에 대한 권한이 기본적으로 로 설정되어 있으므로 euid와 동일한 사용자 여야 $pid합니다 .root-r-- --- ---

stdin환경 을 사용하는 것 외에도 ssh. ssh로 파이프하면 내가 아는 한 루트와 대상 프로그램(및 해당 서브루틴)만 액세스할 수 있습니다(가정 $(cat /proc/sys/kernel/yama/ptrace_scope) == 1).

관련 정보