방금 CentOS 기반 서버를 SFTP 서버로 설치했습니다.
/mnt/inbound/ 폴더로 이동하려면 들어오는 모든 파일이 필요하므로 SFTP를 통해 로그인하는 이 호스트의 모든 사용자가 /mnt/inbound/를 시작점으로 가지고 있는지 확인하고 싶습니다. 다른 곳으로 갈 수 없다는 것입니다.
SFTP 클라이언트를 사용하여 테스트 사용자와 연결할 수 있었고 사용자가 해당 폴더에 갇혀 있는지 확인할 수 있었지만 사용자는 파일을 업로드할 수 없습니다...
지금까지 내가 한 일은 다음과 같습니다.
- 모든 고객 인바운드 사용자를 포함하도록 sftponly라는 그룹을 만듭니다.
$ groupadd sftponly
- 내부 SFTP 하위 시스템을 사용하도록 /etc/ssh/sshd_config를 수정합니다.
# Enable built-in implementation of SFTP Subsystem sftp internal-sftp
- sshd_conf 끝에 다음을 추가합니다.
Match Group sftponly # Force the connection to use the built-in SFTP support ForceCommand internal-sftp # Chroot the connection into the specified directory ChrootDirectory /mnt/inbound/%u # Disable network tunneling PermitTunnel no # Disable authentication agent forwarding AllowAgentForwarding no # Disable TCP connection forwarding AllowTcpForwarding no # Disable X11 remote desktop forwarding X11Forwarding no
- SFTP를 사용할 사용자 추가:
$ sudo useradd -g sftponly testuser
- 사용자 폴더는 /mnt/inbound 아래에 생성되어야 합니다:
$ sudo mkdir /mnt/inbound/testuser
이제 FileZilla(또는 다른 클라이언트)를 사용하여 이 호스트에 SFTP 연결을 설정할 수 있으며 사용자가 /mnt/inbound/testuser 폴더로 제한되어 있음을 알 수 있습니다. 하지만 사용자는 파일을 업로드할 수 없습니다.
사용자 테스트가 액세스할 수 있도록 /mnt/inbound/test 폴더에 대한 권한을 변경하려고 시도했지만 이로 인해 사용자가 SFTP를 통해 연결할 수 없게 되었습니다.
폴더 소유자를 루트가 아닌 다른 사람으로 변경할 수 없습니다. 그렇다면 사용자가 해당 폴더를 읽고 쓸 수 있도록 하려면 어떻게 해야 합니까?
인터넷에서 유사한 질문(StackExchange 포함)에 대한 답변을 여러 번 보았지만 모두 한두 가지가 누락된 것 같습니다. 답변에 제공된 지침을 따르려고 하면 항상 SFTP 설정이 손상됩니다. 사례.
감사합니다, P.
답변1
예, #openssh IRC 채널에서 몇 가지 조언을 얻었습니다. 내 솔루션에서 누락된 내용은 다음과 같습니다.
ChrootDirectory에 지정된 디렉터리는 루트가 소유해야 합니다. 위 파일에서 변수를 sshd_config
지정했기 때문에 각 사용자는 자신의 사용자 이름을 기반으로 하는 자신만의 루트 디렉터리를 가지며( 예: ), 이러한 디렉터리는 모두 루트가 소유해야 합니다. 명령이 상승하기 때문에 이것이 실제로 디렉토리를 생성할 때의 기본값입니다 .%u
testuser
/mnt/inbound/testuser/
sudo mkdir /mnt/inbound/<username>
mkdir
sudo
그래서 내가 해야 할 일은 아래에 하위 디렉터리를 만들고 /mnt/inbound/<username>
해당 디렉터리에 대한 사용자 권한을 부여하는 것입니다. 내 경우에는 이 디렉토리를 이라고 부릅니다 uploads
.
그래서 다음과 같이 구성을 약간 변경했습니다.
Match Group sftponly # Chroot the connection into the specified directory ChrootDirectory /mnt/inbound/%u # Force the connection to use the built-in SFTP support ForceCommand internal-sftp -d /uploads
이 ForceCommand
행은 include로 변경되었습니다 -d /uploads
. 이는 사용자가 로그인한 후의 기본 디렉토리가 임을 의미합니다 /uploads
. 구성의 이전 줄에 지정되었으므로 새 루트로 간주 되지 /uploads
않습니다 ./mnt/inbound/%u/uploads
/mnt/inbound/%u
ChrootDirectory /mnt/inbound/
그런 다음 사양을 수행하면 이제 루트 계정이 소유해야 하는 새 루트 디렉터리가 되므로 최종 사용자가 소유한 폴더를 ForceCommand internal-sftp -d /%u
만들 수 있습니다 . 그러나 사용자는 상위 폴더로 이동하여 다른 모든 계정의 디렉터리 이름을 볼 수 있습니다. 나는 그것을 반대하기로 결정했다 :)/mnt/inbound/<username>
/mnt/inbound
답변2
업데이트된 솔루션을 게시해 주셔서 감사합니다(@pmdci). Ubuntu 18의 특정 사용자의 /home 디렉토리에서 작동하도록 하기 위해 약간의 수정을 해야 했습니다. 예, 이런 종류의 작업은 홈이 아닌 폴더를 사용하려는 특정 목표를 무너뜨리지만 다른 사람들이 시도하는 데 도움이 될 수 있습니다. 비슷한 것들.
SFTP 액세스를 위해 새 시스템 사용자(이 예에서는 이 사용자를 "yournewuser"라고 함)를 생성하고(Ubuntu는 "adduser" 입력 중에 홈 디렉터리를 자동으로 생성해야 함) 비밀번호를 설정한 후 새 사용자를 그룹에 추가합니다. SFTP에 대한 제어 그룹으로 설정하겠습니다. 이 예에서는 이를 "yoursftpgroup"이라고 부르겠습니다.
이 사용자가 로그인하는 것을 원하지 않으면 다음을 설정하십시오: sudo usermod -s /sbin/nologon yournewuser
지적한 대로 새 사용자의 디렉터리가 "CHOWN 루트"를 사용하여 루트가 소유하고 있는지 확인하세요. 예, 이 작업을 수행해야 하며 sudo가 이를 처리해야 합니다. 하지만 만일의 경우에 대비하여 명시적으로 수행했습니다...
이 새 사용자 디렉터리 "/home/newuser/"의 권한(CHMOD)을 755로 설정합니다. -R 스위치를 사용할 필요가 없습니다(스위치 참고). 참고: 이 권한은 최소한 다른 사용자와 동일한 권한을 가져야 합니다. 나의 경우에는. 그렇지 않으면 SFTP 로그인 중에 액세스 거부 문제가 발생합니다(WinSCP를 사용하여 테스트).
/home/yournewuser/uploads에 업로드를 위한 새 디렉터리를 만듭니다. 이 작업을 sudo로 수행해야 할 수도 있으므로 이제 yournewuser를 사용하여 해당 사용자에게 소유권을 다시 이전해야 합니다. yoursftpgroup CHOWN /home/yournewuser/uploads
이제 이 디렉터리의 권한을 700: CHMOD 700 /home/yournewuser/uploads로 설정합니다.
/etc/ssh/sshd_config 파일을 변경하고 끝에 다음 줄을 추가합니다(이 경우 줄을 조정하면 됩니다).
Subsystem sftp internal-sftp Match Group yoursftpgroup ChrootDirectory /home/%u X11Forwarding no AllowTcpForwarding no ForceCommand internal-sftp -d /uploads
다음 명령을 사용하여 SSH 서비스를 다시 시작합니다. sudo service ssh restart
테스트 액세스
답변3
/mnt/inbound 폴더의 소유권을 루트 계정에 부여한 다음, inbound 폴더에 다른 사용자와 동일한 이름의 폴더를 생성하고 해당 사용자에게 전체 권한을 부여해야 합니다.
chroot 옵션을 사용하면 각 사용자가 자신의 폴더만 갖게 되고 해당 폴더에 접근할 수 없게 됩니다.
하지만 이 솔루션을 사용하면 범용 업로드 폴더를 가질 수 없습니다.