SFTP를 사용하여 비밀번호가없는 백업 제한


11

Duplicity를 사용하여 컴퓨터에 서버 백업을 수행해야합니다.

duplicity /etc sftp://backup@my.dynamic.ip.address//home/backup

이 작업을 수행하기 전에 다음을 수행하여 암호가없는 액세스를 허용해야합니다.

$ ssh-keygen
$ ssh-copy-id backup@my.dynamic.ip.address
$ ssh backup@my.dynamic.ip.address

내 질문은, 생성 된 공개 키 에서이 SFTP 전송으로 명령을 어떻게 제한합니까?

command="restrict to sftp",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAA…

동적 IP 주소를 사용하고 있으므로 IP가 변경 될 때마다 "알려진 호스트 누락"문제를 어떻게 극복 할 수 있습니까?



1
"알려진 호스트 문제 누락": StrictHostKeyChecking = no 옵션을 사용하여 ssh
Marki

@ Marki, ssh_config에서 작동하도록 설정해 주셔서 감사합니다.
질문 오버플로

답변:


15

질문 1

내 질문은, 생성 된 공개 키 에서이 SFTP 전송으로 명령을 어떻게 제한합니까?

이를위한 두 가지 방법이 있습니다.

1.-sshd를 통한 제한

이 방법에는 SSH 데몬 내에 SFTP 기능을 설정하는 과정이 포함됩니다 sshd. 이것은 /etc/ssh/sshd_config구성 파일을 통해 제어 됩니다. 참고 : 이렇게하면 backup서버에 SFTP 만 허용되도록 사용자가 제한됩니다 .

# /etc/ssh/sshd_config

Subsystem       sftp    internal-sftp

## You want to put only certain users (i.e users who belongs to sftpusers 
## group) in the chroot jail environment. Add the following lines at the end 
## of /etc/ssh/sshd_config

Match User backup
  ForceCommand internal-sftp

2.-authorized_keys를 통한 제한

이 방법은 sshd_config파일을 변경하지 않습니다 . command=질문에서 이미 언급 한 기능을 통해 사용자 + SSH 키를 단일 명령으로 제한 할 수 있습니다 . 트릭은 어떤 명령을 포함 시키는가입니다. SFTP 서버를이 command=줄 에 넣을 수 있습니다 . 이는 sshd_config파일 에서 SFTP 서버를 설정하는 것과 같은 효과를 갖습니다 .

# User backup's $HOME/.ssh/authorized_keys file
command="/usr/libexec/openssh/sftp-server" ssh-dss AAAAC8ghi9ldw== backup@host

참고 : 사용자에게에 대한 쓰기 권한이있는 경우 ~/.ssh/authorized_keys읽기 및 / 또는 수정할 수 있습니다. 예를 들어, 파일을 다운로드하고 편집 한 후 다시 업로드하여을 제거 commmand=...하여 쉘을 포함하여 훼손되지 않은 명령 액세스 권한을 부여 할 수 있습니다. 사용자에게에 대한 쓰기 권한이있는 경우 ~/.ssh단순히 파일을 연결 해제하고 다시 작성하거나 쓰기 권한을 가질 수도 chmod있습니다. 다음과 같이 ~/.ssh/authorized_keys사용자가 쓸 수없는 장소에 파일을 보관 하는 등의 가능한 해결책이 많이 있습니다 .

Match Group sftponly
    AuthorizedKeysFile      /etc/ssh/authorized_keys/%u

질문 # 2

동적 IP 주소를 사용하고 있으므로 IP가 변경 될 때마다 "알려진 호스트 누락"문제를 어떻게 극복 할 수 있습니까?

이것은 더 까다 롭지 만 파일 from=내의 기능을 사용하면 가능 합니다 authorized_keys. 여기서는 호스트에서만 액세스를 제한하고 있습니다 somehost.dyndns.org.

from = "somehost.dyndns.org", command = "/ usr / libexec / openssh / sftp-server", 포트가없는 포워딩, No-X11- 포워딩, No- 에이전트-포워딩, No-Pty ssh-dss AAAAC8ghi9ldw == backup @ host

command=SSH 키 사용을 더욱 제한하기 때문에 이후의 추가 설정 도 마찬가지로 중요합니다.

기능 분석

  • from='hostname1,hostname2,'' -지정된 IP 또는 호스트 이름 패턴에서의 액세스를 제한합니다
  • command='command' -인증 후 지정된 명령을 실행합니다
  • no-pty -pty를 할당하지 않습니다 (대화식 로그인을 허용하지 않습니다)
  • no-port-forwarding -포트 포워딩을 허용하지 않습니다
  • no-X11-forwarding -사용자는 디스플레이 X11 GUI를 제거 할 수 없습니다
  • no-agent-forwarding -사용자는이 호스트를 통해 다른 내부 호스트로 전달할 수 없습니다

"알려진 호스트 누락"에 대한 메시지를 제거하려면 다음과 같이 연결할 때 클라이언트에이 SSH 옵션을 추가 할 수 있습니다.

$ ssh -o StrictHostKeyChecking=no ....

ssh_config이 스위치에 대한 자세한 내용은 매뉴얼 페이지를 참조하십시오 .

사용자의 쉘 ​​제한

위의 두 솔루션 모두 파일 backup에서이 사용자의 셸을 제한 하여 사용자 를 잠그고 싶을 /etc/passwd것입니다. 일반적으로로 설정하고 scponly싶지만 이것에 대한 다른 선택도 있습니다. 이 작업을 수행하는 방법에 대해서는 " SCP 용 쉘이 필요합니까? " 라는 U & L Q & A를 참조하십시오 .

위의 # 1에 설명 된대로 /sbin/nologinchroot 기능을 사용하도록 선택한 경우에도 사용할 수 있습니다 . 그러나 # 2에 요약 된 방법을 사용하기 로 결정했다면 의 사용자 쉘에 대해 또는 다른 것을 사용해야 할 것 입니다 .sshd_configscponly/etc/passwd


보너스-위의 # 2 연장

이 사용자에 대한 명령 세트를 표시해야하는 경우에도이를 수행 할 수 있습니다. 다음과 같이 스크립트를 작성하십시오 /home/backup/commands.sh.

#!/bin/sh

case $SSH_ORIGINAL_COMMAND in
  "diskspace")
    df -h
    ;;
  "dirlist")
    ls -1
    ;;
  "apache_restart")
    /etc/init.d/apache restart
    ;;
  *)
    echo "Unknown command"
esac

그런 다음 authorized_keys파일을 다음 과 같이 설정하십시오 .

command="/bin/sh /home/user/commands.sh" ssh-dss AAAAC8ghi9ldw== user@host

backup사용자는 다음과 같이이 명령을 실행할 수 있습니다 :

# diskspace
$ ssh -q user@remote_host diskspace
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/dev-root   39G  2.2G   35G   6% /

# dirlist
$ ssh -q remote_host dirlist
commands.sh
dump.sql

참고 문헌


사용자가 액세스 할 수있는 명령에주의하십시오. 그렇지 않으면 사용자가 전체 쉘을 얻을 수있는 능력이있을 수 있습니다. 예를 들어 누군가에게 vim에 대한 액세스 권한을 부여하면 쉽게 :! / bin / bash 또는 :! / bin / someotherprogram을 수행 할 수 있습니다.
rking

@rking-그렇습니다. 말도없이갑니다 ...
slm

자세한 답변을 주셔서 감사합니다. 명령 제한이 완벽하게 작동합니다. 그러나 두 가지 문제가 있습니다. 1) 동적 IP는 서버가 아닌 내 컴퓨터를 나타냅니다. certified_keys 파일의 "보낸 사람"필드에있는 호스트 이름은 서버가 내 컴퓨터에 액세스 할 수있는 주소 만 제한하며 내 컴퓨터의 "알려진 호스트 누락"문제를 해결하지 않습니다. 2) 내 컴퓨터에서 백업 사용자에 대한 쉘 로그인을 비활성화 /sbin/nologin하면 서버가 SFTP로 내 컴퓨터에 액세스 할 수 없습니다. 나는 이것을 시도했다.
질문 오버플로

1
혼란을 드려 죄송합니다. 서버 S는 내 컴퓨터 C에 백엔드 SFTP 연결을 수행 할 때 클라이언트가됩니다. "알려진 호스트 누락"문제는 백업을 수행하는 서버 S가 ssh known_hosts파일 에 나열되지 않은 위치에 연결할 때마다 발생 합니다. Marki는 그의 의견에 올바른 해결책을 제시했습니다. 내 컴퓨터 C fromauthorized_keys파일에 있는 매개 변수는 S가 C에 연결할 수있는 위치 만 제한합니다.
질문 오버플로

예, 계속해서 수정하십시오. 그건 그렇고 내가 인증서에 지정한 대신 /sbin/nologinforce 명령을 사용하면 작동합니다 . 이것들은 두 개의 서로 다른 하위 시스템이라고 생각합니다. 전자에 대한 chroot 디렉토리를 만드는 것이 훨씬 간단합니다. internal-sftp/usr/libexec/openssh/sftp-server
질문 오버플로

0

제한된 껍질

scponly 또는 rssh 와 같은 제한된 쉘을 지정해야합니다 .

scp 또는 sftp를 사용하면 ssh를 통해 원격 사이트에 연결 한 다음 원격 쉘이 scp 프로세스 또는 sftp 프로세스를 실행합니다. 필요한 것은 scp 또는 sftp만이 로그인을 잠글 수있는 제한된 쉘입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.