우분투 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-server
ssh
다시 말하지만, 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
printf
sh
원격 시스템 에 따라 내장되지 않을 수 있습니다 . Linux( bash
) dash
에서는 내장 프로그램으로 실행되지만 echo 'printf --version' | ssh host
OpenBSD sh
에서는 실행되지 않습니다. 더 큰 문제는 "원격 시스템의 SSH 사용자 계정에 대한 다른 사람의 액세스를 엄격하게 제어할 수 없습니다"입니다. 이러한 사용자(충분한 기술을 갖춘)는 루트 액세스 없이 몇 가지 나쁜 작업을 수행할 수 있습니다.
- 공개 키가 있고 공개 키를 알고 있는 경우 파일
command="..."
의 항목을 통해 다른 작업을 실행할 수 있습니다.~/.ssh/authorized_keys
bash
printf
-and- -forms를 사용하더라도cat
쉘 rc 파일을 읽을ssh host < seed.txt command
수 있으므로export LD_PRELOAD=/something/naughty.so
라이브러리는 stdin을 다른 곳에 복사하거나 무언가를 실행하려고 할 때 흥미로운 작업을 수행할 수 있습니다.gpg-preset-passphrase