SSH를 사용하여 문자열을 로컬 텍스트 파일에서 원격 명령으로 안전하게 전송

SSH를 사용하여 문자열을 로컬 텍스트 파일에서 원격 명령으로 안전하게 전송

우분투 18에서는 다음과 같은 일이 일어났습니다.

자동화해야 해외딴gpg-agent내 파일에 저장된 암호를 사용하여 시딩현지의SSH를 사용하는 머신.

비밀번호는 다른 사용자가 쉽게 볼 수 없도록 주로 원격 서버에서 처리해야 하지만 로컬 시스템에서도 안전해야 합니다.

문제는 GPG 관련 질문이 아닌 일반적인 질문입니다. 원격 서버에서 실행되는 프로그램에 문자열을 안전하게 전달하는 방법은 무엇입니까 ssh?

명령줄에 비밀번호를 입력하면 ps -ef로컬( ssh) 및 원격 시스템( ) bash -c모두에서 사용할 수 있다는 것을 이해합니다. 그래서 나는 이것을 피해야 한다.

또한 환경 변수에 비밀번호를 저장한다는 것은 프로세스의 초기 환경을 보고 현재 상태를 보는 데 사용할 cat /proc/<pid>/environ수 있다는 것을 의미한다는 것도 알고 있습니다. gdb따라서 로컬 환경 변수를 전달하면 로컬 컴퓨터 또는 원격 컴퓨터의 세부 정보를 볼 수 있습니다. 특히 원격 시스템의 SSH 사용자 계정에 대한 다른 사람의 액세스를 엄격하게 제어할 수 없기 때문에 이것은 이상적이지 않습니다.

몇 가지를 읽고 실험한 후 다음과 같은 결론에 도달했습니다. 실제로 작동합니다! 로컬 서버에 루트 액세스 권한이 있는 사람이 seed.txt없으면 chmod 400파일이 안전하다고(또는 적어도 내 SSH 키만큼 안전하다고) 가정할 수 있습니다 .

참고 - seed.txt원격 서버에는 없고 로컬 서버에만 존재하므로 해당 내용을 원격 서버로 전송해야 합니다.

SSH 연결은 키를 사용하므로 비밀번호가 필요하지 않습니다.

#!/bin/bash
ssh -T my-server <<EOSSH > /dev/null
printf '%s\n' "$(cat seed.txt)" | /usr/lib/gnupg2/gpg-preset-passphrase -c 123456789
EOSSH

로컬 컴퓨터에서 이를 사용하면 원격으로 실행되는 실제 명령이 명령줄을 사용하는 대신 stdin으로 파이프되기 때문에 ps -ef결과만 생성됩니다 .ssh -T my-serverssh

다시 말하지만, cat명령줄에는 파일 이름만 표시됩니다. printf은 내장된 명령이므로 원격 시스템에서 실행되고 있다고 ps생각됩니다.printf

원격 서버에서는 ps표준 입력을 사용하여 비밀번호를 다시 입력한 경우에만 나타납니다./usr/lib/gnupg2/gpg-preset-passphrase -c 123456789

환경 변수를 직접 사용하지 않으므로 여기에는 문제가 없어야 합니다. SSH 환경 변수가 뭔가를 노출시킬까봐 조금 걱정되나요?

내 질문은 - 내 접근 방식이 합리적이고/단순하며/안전합니까(루트 액세스가 손상되지 않는다고 가정), 명백한 문제가 있습니까? 그렇다면 제안된 해결 방법은 무엇입니까?

내가 작업할 수 있었던 유일한 다른 옵션은 using 이지만 expect두 가지를 모두 고려하고 ssh대화 gpg-preset-passphrase형이 아닌 표준 입력으로 입력을 행복하게 받아들이는 것처럼 보이는 것은 약간 과잉인 것 같습니다 expect.

고쳐 쓰다

다음은 매우 유용한 답변입니다. 감사합니다! 그것에 대해 더 많이 생각할수록 나는 이것을 조금 다시 생각하게 됩니다. 아마도 단일 Linux 계정 내에서 해당 계정의 다른 사용자와 격리된 무언가가 다른 사용자가 결정하면 항상 달성할 수 없다는 점을 받아들여야 할까요? 이는 일반적으로 올바른 논리적 전제인 것 같지만, (해당 계정의) 다른 사용자를 위해 (계정별) gpg-agent를 실행하려고 하는데 해당 사용자가 실제 실행을 수행하기 위한 자격 증명에 액세스할 수 없는 경우( gpg-agent는 항상 사용자별이라고 생각합니다.) 계정 자체 내에서 이 작업을 수행해야 합니다. 그렇죠? 동일한 계정의 사용자가 내가 하고 있는 작업을 최고 수준으로 올릴 수 없는 경우 어떻게 해야 합니까? 짧은 대답은 다음과 같습니다. 사용자가 최고 수준에 도달하는 것을 어렵게 만들 수는 있지만 결코 불가능할 수도 있습니까? 제가 아는 한, gpg-agent다른 계정의 사용자가 사용하도록 다른 계정에서 시드하는 것은 불가능한가요?

답변1

printfsh원격 시스템 에 따라 내장되지 않을 수 있습니다 . Linux( bash) dash에서는 내장 프로그램으로 실행되지만 echo 'printf --version' | ssh hostOpenBSD sh에서는 실행되지 않습니다. 더 큰 문제는 "원격 시스템의 SSH 사용자 계정에 대한 다른 사람의 액세스를 엄격하게 제어할 수 없습니다"입니다. 이러한 사용자(충분한 기술을 갖춘)는 루트 액세스 없이 몇 가지 나쁜 작업을 수행할 수 있습니다.

  • 공개 키가 있고 공개 키를 알고 있는 경우 파일 command="..."의 항목을 통해 다른 작업을 실행할 수 있습니다.~/.ssh/authorized_keys
  • bashprintf-and- -forms를 사용하더라도 cat쉘 rc 파일을 읽을 ssh host < seed.txt command수 있으므로 export LD_PRELOAD=/something/naughty.so라이브러리는 stdin을 다른 곳에 복사하거나 무언가를 실행하려고 할 때 흥미로운 작업을 수행할 수 있습니다.gpg-preset-passphrase

관련 정보