서버 A에서 B로 기가바이트의 데이터를 전송하고 싶습니다. 서로 다른 네트워크에 있지만 둘 다 SSH를 통해 액세스할 수 있습니다. 저는 다른 네트워크(A도 B도 아님)에 있으므로 시스템을 통해 터널링하는 것보다 서버 간 전송을 선호합니다. SSH와 같은 암호화된 채널을 통해 이를 수행하는 가장 좋은 방법은 무엇입니까?
가장 간단한 옵션은 아마도 암호화된 타르 파이프( tar | openssl enc | netcat
)일 것입니다. 그러나 그다지 깔끔한 느낌은 아닙니다.
또 다른 옵션은 임시로 사용자를 추가하여 SSH 파이프( tar | ssh
)와 함께 사용하거나, 임시로 기존 사용자에게 인증 키를 추가하여 동일한 작업을 수행하는 것입니다. 이는 서버 중 하나에 특정 조건을 기다리는 악성 코드가 있을 가능성이 무시할 수 있는 경우에도 경쟁 조건을 허용합니다. 완전히 깨끗한 느낌도 아닙니다.
이 일회성 데이터 전송을 위한 가장 좋은 방법은 무엇입니까?
답변1
내가 올바르게 이해했다면 A와 B 사이, 즉 A에서 B로 SSH 연결을 설정하려는 것입니다. A에서 B로 TCP 연결을 설정하는 것은 가능하지만(B는 방화벽 뒤에 있지 않으므로 이것이 불가능함) A가 신뢰할 수 없는 경우 A의 사용자가 B에 로그인하도록 허용하면 B에서 보안 위반이 발생할 수 있다는 우려가 있습니다. .
OpenSSH는 이에 대한 간단한 솔루션을 제공합니다. 존재하다~/.ssh/authorized_keys
을 사용하면 하나의 명령만 실행하도록 키 입력을 제한할 수 있습니다. A:에 새 키 쌍을 생성합니다.
serverA$ ssh-keygen -N '' -f ~/.ssh/copy_to_B.id_rsa
serverA$ cat ~/.ssh/copy_to_B.id_rsa.pub
생성된 공개 키를 가져오고 줄 끝에 force 명령을 추가하십시오. 또한 restrict
포트 전달 차단과 같은 옵션을 추가합니다(예를 들어 이를 통해 A가 B의 방화벽 경계 내부에서 요청을 수행하도록 허용할 수 있음). B의 새 줄은 ~/.ssh/authorized_keys
다음과 같습니다.
ssh-rsa AAAA… luc@serverA restrict command="cat >~/backups/B/latest.tgz"
이제 이 키를 사용하여 B에 로그인하면 에 cat >~/backups/B/latest.tgz
전달한 내용에 관계없이 명령이 실행됩니다 ssh
. 이런 식으로 B가 할 수 있는 일은 파일에 쓰는 것뿐입니다.
serverA$ tar … | ssh -i ~/.ssh/copy_to_B.id_rsa luc@serverB whatever
B의 SSH 서버가 충분히 새롭지 않은 경우 SSH 서버가 없을 수 있습니다 restrict
. 그렇지 않은 경우 해당 서버 와 사용 가능한 다른 모든 옵션을 restrict
사용하십시오 ( B 확인 ).no-port-forwarding
no-…
man sshd
변수를 통해 force 명령에서 원래 명령을 참조할 수 있지만 SSH_ORIGINAL_COMMAND
여기서 복잡한 작업을 수행하면 보안 허점을 열지 않는지 확인하기 어려울 수 있습니다. 이것은 원하는 파일 이름을 명령으로 전달하여 B가 어떤 파일에든 쓸 수 있도록 하는 간단한 래퍼입니다 ~/backups/B
. 래퍼는 쓰기를 방지하기 위해 문자를 허용 목록에 추가합니다 ../../.ssh/authorized_keys
.
ssh-rsa AAAA… luc@serverA restrict command="case $SSH_ORIGINAL_COMMAND in *[!-.A-Za-z0-9_]*) echo >&2 'bad target file'; exit 120;; [!-.]*) cat >~/backups/B/\"$SSH_ORIGINAL_COMMAND\";; *) echo >&2 'bad target file'; exit 120;; esac"
답변2
SSH 인증뿐만 아니라 파일 권한 및 소유권 때문에 액세스하려면 유효한 사용자를 사용해야 합니다.
나는 온라인으로 돈을 이체하는 것을 정말 좋아합니다 rsync
. 증분 데이터 전송을 재개할 수 있습니다. 이는 두 서버 간의 네트워크 연결을 완전히 제어할 수 없는 경우 기본입니다.
답변3
A
SSH를 실행할 수 B
있고 실행 중인 에이전트가 있다고 가정하는 경우 ssh
:
ssh -A A '
cd /src && tar cf - . | gzip -1 | ssh B "
cd /dst && gunzip | tar xpf -"'
를 전달하면 원격 사용자 에게 SSH 에이전트에 대한 액세스 권한이 -A
부여됩니다 . A
서버 관리자나 원격 사용자 계정에 액세스할 수 있는 사람을 신뢰하지 않는다면 이 작업을 수행하고 싶지 않을 것입니다. SSH 키를 검색할 수는 없지만 ssh
명령이 실행되는 동안 이를 사용하여 다른 컴퓨터에 인증할 수 있습니다.