내 로컬 컴퓨터에는 매일 밤 원격 서버에 파일을 복사하도록 설계된 스크립트가 있습니다. 현재 스크립트가 작동하는 유일한 방법이기 때문에 비밀번호 없는 키를 사용하여 scp를 통해 이 작업을 수행합니다.
스크립트가 클라이언트 컴퓨터에서 실행 중입니다. 나 외에도 여러 사람이 이 기계에 접근할 수 있습니다. 원격 머신은 나에게 속한 클라우드 인스턴스입니다. 아무 일도 일어나지 않을 것으로 예상되지만 안전하게 지내는 것이 좋습니다. 따라서 내 로컬 컴퓨터에 액세스할 수 있는 사람은 누구나 내 클라우드 컴퓨터에 액세스할 수 없도록 스크립트가 자동으로 안전하게 작동하기를 원합니다.
나는 이런 식으로 영원히 계속하고 싶지 않습니다. 왜냐하면 그것은 매우 안전하지 않기 때문입니다. 그러나 작업을 수행하기 위한 안전한 솔루션을 찾을 수 없었습니다. Rclone을 조사해 봤지만 머신을 동일한 보호되지 않은 상태로 두는 것 같습니다.
문제를 가장 안전하게 해결하는 최선의 방법은 무엇입니까? 나는 원격에서 특정 사용자를 생성하고 파일을 복사하는 폴더에만 액세스를 제한하려고 생각했지만 어쨌든 키를 사용하여 해당 폴더에 자유롭게 액세스할 수 있게 됩니다.
답변1
기본적으로 클라이언트와 서버를 최대한 분리해야 합니다. 귀하의 설명에 따르면 서버는 싱크 역할만 수행하므로 액세스를 쓰기 전용으로 만드는 방법을 찾고 있을 것이며, 바람직하게는 일부 입력 검사(적어도 가능한 DoS를 방지하기 위해 크기 제한을 적용하려는 경우)를 찾고 있을 것입니다.
SSH를 사용하려면 해당 ForceCommand
옵션을 사용하고 입력을 서버의 적절한 파일로 파이프하는 필터 스크립트로 설정할 수 있습니다. 자세한 내용은 . 및 매뉴얼 페이지를 command="command"
참조 하세요 .AuthorizedKeysFile
sshd(8)
sshd_config(5)
대안은 업로드만 허용하는 간단한 REST API입니다. HTTP를 선택하는 경우 기본적으로요청 방법처리기 전용: ( POST
또는 PUT
특정 설정에 따라). 인증을 위해 인증서를 사용합니다(유효 기간이 짧고 가능하면 특정 소스 시스템에 연결하는 것이 좋음).
답변2
당신의 대답은 을 사용하는 것입니다 sftp
. 이 작업은 연결을 통해서도 수행되므로 현재 수행 중인 작업과 크게 다르지 않습니다 ssh
.
sftp는 암호화된 SSH(1) 전송을 통해 모든 작업을 수행하는 ftp(1)과 유사한 파일 전송 프로그램입니다. 또한 공개 키 인증 및 압축과 같은 SSH의 많은 기능을 사용할 수도 있습니다.
먼저 클라이언트에 대해 별도의 사용자를 생성해야 합니다. 루트가 소유한 홈 디렉토리, 공개 키 .ssh/authorized_keys
, 쓰기 액세스를 위한 자체 소유 디렉토리가 있어야 합니다 .
$ sudo mkdir -p /home/tmpuser/.ssh
$ sudo mkdir -p /home/tmpuser/uploads
$ sudo cp ~/.ssh/id_rsa.pub /home/tmpuser/.ssh/authorized_keys
$ sudo adduser --home /home/tmpuser --disabled-password tmpuser
$ sudo chown tmpuser /home/tmpuser/uploads
동일한 비밀번호 없는 SSH 토큰을 사용할 수 있습니다. 고객이 개인 키를 다른 사람과 공유하는 것에 대해 걱정하고 있다고 가정합니다. 이 "다른 사람"은 클라이언트 사용자에게 속한 콘텐츠만 볼 수 있으며 다른 사용자나 컴퓨터의 나머지 부분에 속한 콘텐츠는 볼 수 없습니다. 그것은 당신의 위험이 아니라 그들의 위험입니다. uploads/
새 파일을 모니터링하고 chroot 밖으로 이동하거나 처리 후 파일을 삭제하면 이 문제를 완화 할 수 있습니다 . 분명히 들어오는 파일을 "신뢰"하지 마십시오(즉, 절대 실행하지 마십시오).
다음으로 에서 이 사용자가 다음을 수행하도록 /etc/ssh/sshd_config
설정 하고 강제합니다.internal-sftp
#Subsystem sftp /usr/lib/openssh/sftp-server <-- comment this line out
Subsystem stfp internal-sftp
# At the bottom of the file add this:
Match User tmpuser
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
ChrootDirectory %h
이제 sshd
재설정을 사용하여 sudo systemctl restart sshd
다음을 시도해 보십시오.
# Confirm normal ssh is impossible
$ ssh tmpuser@localhost
This service allows sftp connections only.
Connection to localhost closed.
# Confirm scp is impossible
$ scp testfile tmpuser@localhost:
This service allows sftp connections only.
# Check that you can "put" a file in uploads/
$ echo "put testfile uploads/" | sftp -b - tmpuser@localhost
sftp> put testfile uploads/
# Check that you can connect via sftp and can only use sftp commands
$ sftp tmpuser@localhost
Connected to localhost.
# Check that a basic command works
sftp> ls
uploads
# Check that we are indeed in a chroot
sftp> pwd
Remote working directory: /
# Check that our testfile was actually uploaded
sftp> ls uploads
uploads/testfile
# Try to get out of the chroot
sftp> cd ..
sftp> ls
uploads
# Try to run a non-sftp command
sftp> ps
Invalid command.