다음과 같이 CentOS에서 SFTP 서버를 구성했습니다.이 문서. 내 의도는 그룹에 속 하지만 여전히 해당 폴더에 로그인할 수 있는 새 사용자( user1
, ) 의 콘솔 로그인을 금지하는 것입니다 .user2
sftpusers
sftp
sftp
또한 CentOS 사용자가 사용하는 것과 동일한 키(콘솔에 문제 없이 로그인할 수 있음)를 사용하고 싶습니다 . 이를 위해 .ssh
CentOS 사용자의 폴더를 user1
및 user2
홈 폴더로 복사하여 소유권을 사용자, 700
폴더 .ssh
및 파일 600
로 변경했습니다 authorized_keys
.
그런데 계속 메시지가 옵니다 Server refused our key
. CentOS 사용자가 사용하는 키는 모든 서버의 마스터 키와 같기 때문에 새 사용자에게 해당 키를 재사용하고 싶습니다.
이 구성을 어떻게 달성할 수 있습니까?
업데이트
각 사용자에 대한 키를 생성한 후 두 사용자 모두 개인 키를 사용하여 원격으로 서버에 액세스할 수 있지만 다음 구성을 활성화하면 /etc/ssh/sshd_config
명령을 사용하여 권한이 거부됩니다 sftp
.
SSHD 구성
Match Group sftpusers #Or you could replace Group with User and specify a different configuration for each user
X11Forwarding no
AllowAgentForwarding no
AllowTcpForwarding no
ChrootDirectory /path/to/shared_folder/%u # %h the path to upload the files
ForceCommand internal-sftp
쉘의 메시지
packet_write_wait: Connection to IPSERVER port 22: Broken pipe
Couldn't read packet: Connection reset by peer
답변1
업데이트로 인해 원래 질문과 다른 문제가 발생합니다. 원래 문제는 더 이상 문제가 되지 않는 것 같습니다. 업데이트를 다루고 있습니다.
그만큼수동읽는다:
ChrootDirectory
chroot(2)
인증 후 디렉토리의 경로 이름을 지정합니다 . 세션 시작 시sshd(8)
경로 이름의 모든 구성 요소가 다른 사용자나 그룹이 쓸 수 없는 루트 소유 디렉터리인지 확인합니다.
내 테스트에 따르면 이 조건이 충족되지 않으면 Broken pipe
로 로그인을 시도할 때 오류가 발생합니다 sftp
.
귀하의 경우 경로 이름은 입니다 /path/to/shared_folder/%u
. 참고 %u
(확장 후)는또한구성 요소; 따라서 "루트 소유여야 하며 다른 사용자나 그룹이 쓸 수 없어야 합니다". 소유권과 권한을 수정해야 합니다. 그러면 분명히 사용자는 디렉터리에 쓸 수 없게 됩니다. 와 함께 사용하는 경로 이름이 무엇이든 ChrootDirectory
사용자는 해당 경로에 쓸 수 없습니다(사용자가 루트가 아닌 경우). 즉, 사용자는 /
chroot된 환경에서 쓸 수 없습니다. 쓰기를 허용하려면 하위 디렉터리가 필요합니다. 이를 처리하는 방법은 거의 없습니다.
공통 chroot 디렉토리에서 홈 디렉토리를 사용합니다.
설명서에는 다음과 같이 명시되어 있습니다.
이후에는
chroot
작업sshd(8)
디렉터리를 사용자의 홈 디렉터리로 변경합니다.나는 홈 디렉토리가 기본적으로
/home/user1
, 등과 같다고 가정합니다 ./home/user2
이는 다음과 같은 시나리오를 제안합니다./path/to/shared_folder
(no%u
) 로 chroot하도록 서버를 설정합니다 .ChrootDirectory /path/to/shared_folder
거기에 관련 디렉토리 구조를 복제하십시오(
/path/to/shared_folder/home/user1
등).path
,to
및 의 조건을 만족합니다shared_folder
.home
일반 와 마찬가지로 소유권과 권한을 부여합니다/home
.home
.NET의 디렉터리와 마찬가지로 내부 디렉터리의 소유권과 권한을 만듭니다/home
.
이 설정을 사용하면 인증 후
sftp
자동 으로user1
배치 되지만 ./path/to/shared_folder/home/user1
/home/user1
chroot
공통 chroot 디렉토리에서 사용자 정의 디렉토리를 사용합니다.
를 사용하면
ForceCommand internal-sftp
시작 디렉터리를 지정할 수 있습니다(internal-sftp
와 동일한 옵션 세트 지원).sftp-server
). 이와 같이:ChrootDirectory /path/to/shared_folder ForceCommand internal-sftp -d /home/%u
사용자가 OS의 공식 홈 디렉토리에 관계없이
sftp
사용할 수 있도록 합니다 ./path/to/shared_folder/home/…
또는 다음과 같습니다:ChrootDirectory /path/to/shared_folder ForceCommand internal-sftp -d /%u
home
경로를 단순화하고 중간에 이를 제거합니다 . 이렇게 하면 로 로그인한 후user1
해당 사용자가 로그인되어 있는지 확인할 수 있습니다 . 이 경우에는 사용자 폴더(가 아님 )를 직접 포함해야 합니다./user1
sftp
shared_folder
home
사용자와 관련된 chroot 디렉터리에서 최소한 하나의 하위 디렉터리를 사용합니다.
위의 솔루션을 사용하면 사용자가 서로의 디렉터리를 탐색할 수 있습니다. 사용자는
chmod
자신의 파일(sftp
지원chmod
)에 대해 액세스를 허용하거나 거부할 수 있습니다.%u
와 함께 사용했으므로ChrootDirectory
별도의 chroot 디렉토리를 만들고 싶을 가능성이 높습니다. 그러한 경우에는 당신이 한 일을 하십시오:ChrootDirectory /path/to/shared_folder/%u
%u
조건을 충족하기 위해 모든 구성 요소(확장 대상 포함)의 소유권과 권한을 설정합니다 . 읽기 전용 액세스에 관한 것이 아니라면 사용자가 쓸 수 있는 하위 디렉터리가 하나 이상 필요합니다. 가능성은 거의 없습니다:- OS에 정의된 대로 사용자의 홈 디렉터리에 대한 경로를 복제합니다.
- 강제
/home/%u
로ForceCommand internal-sftp -d /home/%u
; - 강제
/%u
로ForceCommand internal-sftp -d /%u
; - 고정된 하위 디렉터리 이름을 사용합니다(예
ForceCommand internal-sftp -d /files
: .
각각의 경우 내부에 디렉터리 구조를 준비해야 합니다
/path/to/shared_folder
. 예를 들어/home/user1
를 강제로 적용하려는 경우user1
관련 경로는 다음과 같습니다./path/to/shared_folder/user1/home/user1
여기서
path
,to
및shared_folder
(첫 번째)는user1
조건을 충족하고home
시뮬레이션하며/home
(두 번째)user1
는 사용자가 쓸 수 있습니다.
보다 유연한 접근이 가능합니다. 예를 들어 user1
및 에 대해서는 공통 chroot 디렉토리를 가질 수 있지만 user2
에 대해서는 다른 디렉토리를 가질 수 있습니다 user3
.
Chroot 디렉터리가 일반적이든 아니든, 개인적으로 저는 가장 놀라운 방식으로 하위 디렉터리를 만들 것입니다. 따라서 모든 사용자는 자신이 기대하는 디렉터리에서 자신을 찾을 수 있습니다. 입력 pwd
한 후에는 sftp
다음과 같이 표시되어야 합니다 /home/user1
. 나는 다른 가능성( /user1
, /files
)이 다소 놀랍다고 생각합니다.