chroot sftp 사용자에 대한 "client_loop: 연결 끊김 보내기: 깨진 파이프", 비밀번호가 맞습니까?

chroot sftp 사용자에 대한 "client_loop: 연결 끊김 보내기: 깨진 파이프", 비밀번호가 맞습니까?

저는 sftp용 chroot를 설정하고 튜토리얼 조합을 사용했습니다(소스 1,소스 2) 다음 구성으로 끝납니다 /etc/ssh/sshd_config.

Match Group sftpusers
      ForceCommand internal-sftp
      ChrootDirectory /var/sftp/
      PermitTunnel no
      AllowAgentForwarding no
      AllowTcpForwarding no
      X11Forwarding no

sftp 기본 폴더 /var/sftp와 사용자는 다음과 같이 생성됩니다.

groupadd sftpusers

adduser myuser01
mkdir -p /var/sftp/myuser01
usermod -a -G sftpusers myuser01
chown myuser01:myuser01 /var/sftp/myuser01
systemctl restart sshd

/var/sftp이제 로그인을 시도하면 로그인 작동 방식을 보여주는 이 폴더가 표시됩니다 .

사용자가 해당 폴더에 있기를 원하므로 /var/sftp/<userid>해당 줄 아래에 다음 구성을 설정해 보았습니다.sshd_configMatch Group

ChrootDirectory /var/sftp/%u

client_loop: send disconnect: Broken pipe이렇게 하면 로그인할 때 오류가 발생합니다. ssh_config매뉴얼 페이지 에 따르면 변수는 다음과 같이 허용되어야 합니다:

ChrootDirectory는 %%, %h 및 %u 태그를 허용합니다.

어떤 아이디어가 있나요?

환경:

  • 운영 체제: 우분투 18.04.4 LTS
  • sshd: OpenSSH_7.6p1 Ubuntu-4ubuntu0.3, OpenSSL 1.0.2n 2017년 12월 7일

답변1

chown myuser01:myuser01 /var/sftp/myuser01
...
ChrootDirectory /var/sftp/%u

OpenSSH SSH 서버Chroot 디렉토리지시문에서는 chroot 디렉터리와 해당 상위 디렉터리를 루트가 소유해야 합니다.

Chroot 디렉토리
인증 후 chroot(2)에 대한 디렉토리 경로 이름을 지정합니다.세션 시작 시 sshd(8)는 경로 이름의 모든 구성 요소가 다른 사용자나 그룹이 쓸 수 없는 루트가 소유한 디렉터리인지 확인합니다.chroot 후에 sshd(8)는 작업 디렉토리를 사용자의 홈 디렉토리로 변경합니다.

이건 테스트해보진 않았지만생각하다관련 사용자에 대한 행을 포함하는 chroot 환경에서 파일을 생성하는 경우 /etc/passwdsshd는 해당 행의 home 필드를 chroot 환경에 있는 사용자의 홈 디렉터리로 처리합니다. 이것이 작동하면 이를 사용하여 chroot 디렉토리가 아닌 작업 디렉토리에서 사용자 세션을 시작할 수 있습니다.

답변2

귀하의 예에서는 다른 사용자가 소유하고 쓸 수 없어야 /var/sftp합니다 /var/sftp/usero1.root

귀하의 문제는 다음과 같은 경우에 발생할 가능성이 높습니다.

chown myuser01:myuser01 /var/sftp/myuser01

root:root대신에chmod 755

sudo mkdir /var/sftp
sudo mkdir /var/sftp/myuser01
sudo chown -R root:root /var/sftp
chmod -R 755 /var/sftp

사용자 디렉토리는 root:root다른 사람이 소유하고 있으며 쓸 수 없으므로 사용자는 sshd Internal-sftp를 통해 디렉토리 및 chroot에 로그인할 수 있어야 합니다.

ForceCommand internal-sftp
ChrootDirectory /var/sftp/

따라서 그것들을 하나로 합치십시오:

sudo groupadd sftpusers

sudo mkdir /var/sftp
sudo mkdir /var/sftp/myuser01
sudo chown -R root:root /var/sftp
chmod -R 755 /var/sftp

sudo adduser -h /var/sftp/myuser01 myuser01
sudo usermod -a -G sftpusers myuser01

당신의 것을 편집 /etc/ssh/sshd_config하고 끝에 이것을 추가하십시오 :

Match Group sftpusers
      ForceCommand internal-sftp
      ChrootDirectory /var/sftp/%u
      PermitTunnel no
      AllowAgentForwarding no
      AllowTcpForwarding no
      X11Forwarding no

그런 다음 sshd를 저장하고 다시 시작하십시오.

systemctl restart sshd

내 문제는 이것이 사용자 "myuser01"이 자신의 기본 디렉터리에 대한 쓰기 액세스 권한이 없다는 것을 의미한다는 것입니다. 따라서 내 경우에는 나쁘지 않습니다. 실제로 www 디렉터리를 가지려면 "myuser01"이 필요합니다. 액세스가 필요합니다. 이 문제를 해결했습니다

sudo mkdir /var/sftp/myuser01/www/
sudo chown myuser01:myuser01 /var/sftp/myuser01/www/

(여기서 명명 규칙을 따르도록 이름이 변경되었습니다)

이는 해당 사용자를 위한 SFTP chroot 감옥을 생성하려는 경우에 작동합니다. SFTP만 사용할 수 있지만 사용할 명령과 라이브러리의 전체 chroot를 구축할 필요는 없습니다. 그렇지 않으면 필수 명령을 해당 bin 디렉토리에 추가하고 필수 라이브러리를 해당 /lib디렉토리에 추가해야 하며 로컬 복사본 /etc/passwd/etc/group필수 그룹 및 사용자 항목이 있다고 가정합니다(아직 직접 테스트하지 않음). SFTP chroot 감옥만 필요함)

답변3

ChrootDirectory에는 사용자 세션을 지원하는 데 필요한 파일과 디렉터리가 포함되어 있어야 합니다. 대화형 세션의 경우 최소한 셸(일반적으로 sh(1))과 null(4), zero(4), stdin(4), stdout(4), stderr(4) 및 tty와 같은 기본 /dev 노드가 필요합니다. (4) 장치. SFTP를 사용하는 파일 전송 세션의 경우 in-process SFTP 서버를 사용하는 경우 추가 환경 구성이 필요하지 않습니다.그러나 일부 운영 체제에서는 로깅을 사용하는 세션에 chroot 디렉토리에 /dev/log가 필요할 수 있습니다(자세한 내용은 sftp-server(8) 참조).

답변4

다음은 나를 위해 일했습니다. 아래는 단지 예입니다.

  • 다음과 같이 라인을 편집 /etc/ssh/sshd_config, 수정하고 활성화합니다.
    Subsystem sftp internal-sftp
    
  • 그런 다음 파일 끝으로 이동합니다(이미 존재하는 경우 수정). SFTP 기본 폴더는 다음과 같습니다./home/sftp
    Match Group sftpusers
        ChrootDirectory /home/sftp
        ForceCommand internal-sftp
        X11Forwarding no
        AllowTcpForwarding no
    
  • 파일을 저장하고 SSH 서비스를 다시 시작하십시오.
    systemctl restart sshd
    

그런 다음 다음 명령을 실행하십시오. sftpuser우리의 사용자가 될 것이므로 sftpusers앞으로는

  • SFTP에 대한 새 사용자를 생성하고 에 추가하면 됩니다 sftpusers.
    useradd -d /home/sftp -s /bin/false -g users -G sftpusers sftpuser
    
  • 암호를 설정하세요sftpuser
    passwd sftpuser
    
  • 다음 줄을 실행하십시오.
    chown root:root /home/sftp
    #rights for group & others chmod go+rx /home/sftp
    mkdir /home/sftp/{upload,download}
    chown sftpuser:users /home/sftp/{upload,download}
    chown sftpuser:sftpusers /home/sftp/{upload,download}
    

이제 모든 원격 서버 또는 SFTP 클라이언트에서 SFTP를 인증할 수 있습니다.

sftp [email protected]

관련 정보