CentOS 7에서 SFTP 전용 사용자를 생성해야 합니다. 나는 이 작업을 수행하는 방법을 다양한 출처에서 읽었습니다. 이 설정은 SFTP를 통해 단일 폴더에 액세스하는 단일 사용자만 지원하면 됩니다.
사용자의 홈 디렉토리가 /home/user
다음 과 같은 경우 sshd는 sshd_config
다음 을 고려하여 디렉토리를 chroot 로 변경합니다.ChrootDirectory
%h
/home/user
Chroot 디렉토리 인증 후 chroot(2)에 대한 디렉토리 경로 이름을 지정합니다. 경로 이름의 모든 구성 요소는 루트가 소유한 디렉터리여야 하며 다른 사용자나 그룹이 쓸 수 없어야 합니다.chroot 후에 sshd(8)는 작업 디렉토리를 사용자의 홈 디렉토리로 변경합니다.
어떻게 작동하나요? sshd가 CD를 시도하기 때문에 확실히 실패할 것입니다 /home/user/home/user
.
/home
추가 질문: 사용자가 생성될 때 정의된 홈 디렉터리에서 해당 사용자를 chroot할지 아니면 외부에서 chroot할지 결정하는 모범 사례가 있습니까 /var/sftp/user
? 외부적으로 chroot를 생성할 때 사용자 홈 디렉토리의 목적은 무엇입니까 /home
? 아직도 독서용으로 사용하시나요 ~/.ssh/authorized_keys
?
답변1
디렉토리로 사용하는 경우 알아야 할 추가 제한 사항이 있습니다 ChrootDirectory
.경로 이름의 모든 구성 요소는 루트가 소유한 디렉터리여야 하며 다른 사용자나 그룹이 쓸 수 없어야 합니다.사용자가 chroot 내의 자신의 홈 디렉토리에 쓸 수 있어야 하는 경우 홈 디렉토리는 ChrootDirectory
.
역사적 기록:
OpenSSH의 chroot 지원은 원래 별도의 패치였으며 기본 OpenSSH 배포판에 통합된 후에도 ChrootDirectory로 사용되는 디렉터리에 대한 정확한 요구 사항은 OpenSSH 버전에 따라 변경되었습니다. 이전 설정에서 발견된 보안 취약성에 대응하여 새 버전은 이전 버전보다 더 엄격한 요구 사항을 적용하는 경우가 많습니다.
또한 동일한 홈 디렉터리 경로가 chroot 내부와 외부 모두에 적용되어야 한다는 요구 사항은 분명히 차선책이며 일부 배포판에서는 동작을 수정하기 위해 패치를 적용했습니다. 불행하게도 과거의 모든 패치에는 매뉴얼 페이지 및 기타 관련 문서에 대한 업데이트가 포함되지 않았습니다.
그러나 서면 요구 사항을 충족하려면 다음과 같이 할 수 있습니다.
mkdir -p /jail/username/home
# First, the chroot directory:
chown root:root /jail/username
chmod 755 /jail/username
# Then, the user's home directory:
chown username: /jail/username/home
chmod 750 /jail/username/home
usermod -d /jail/username/home username
# And here's the magic:
cd /jail/username
ln -s . jail # this would normally be a silly thing to do
ln -s . username # but with chroot it can be useful
이제 설정할 수 있습니다 ChrootDirectory /jail/%u
.
chroot 외부에서 볼 때 사용자의 홈 디렉토리는 /jail/username/home
일반적인 명명 규칙에서 약간 벗어나지만 특별한 것은 아닙니다.
chroot 내에서 동일한 홈 디렉터리 경로가 실제로 참조됩니다
/jail/username/jail/username/home
. 하지만 위의 두 어리석은 심볼릭 링크를 보셨나요? 그것들을 참조 취소하면 를 얻게 될 것입니다 /jail/username/././home
. 결과는 정확히 동일합니다 /jail/username/home
. 따라서 동일한 경로는 chroot 내부와 외부의 동일한 위치를 가리키게 됩니다.
chroot 내부의 사용자는 자신의 홈 디렉토리를 /jail/username/home
== 로 보고 정상적으로 사용할 수 있습니다 /././home
. /home
그들은 홈 디렉터리 위의 한 레이어를 볼 수 있지만 /
루트만 거기에 쓸 수 있습니다.
이는 또한 syslog 스타일 로깅과 같은 것을 허용합니다. 루트 소유 디렉토리를 생성 /jail/username/dev
하고 여기 rsyslog
에 추가 스타일 소켓을 생성하도록 지시할 수 있습니다. 이제 chroot된 사용자는 로그 메시지를 생성하고 일반 syslog 하위 시스템이 이를 처리하도록 할 수 있습니다./dev/log
/jail/username/dev/log
이것이 chroot 환경을 정렬하는 유일한 방법은 아니지만, 위의 설정 스타일을 사용하면 사용자의 홈 디렉토리가 chroot 외부에서 처리할 수 있도록 가능한 한 정상적으로 만들 수 있습니다(= 심볼릭 링크 또는 기타 이상한 현상 없음).
감옥에 갇힌 사용자에게 최대한 쓸모없는 chroot를 원한다면 다음과 같이 할 수 있습니다:
mkdir -p /jail/username/username
# Prepare the chroot directory
chown root:root /jail /jail/username
chmod 755 /jail /jail/username
# Prepare the user's actual home directory
chown username: /jail/username/username
chmod 750 /jail/username/username
# Make it usable outside the chroot too
ln -s /jail/username/username /username
# And now it can be assigned to the user.
usermod -d /username username
다시 설정해 보겠습니다 ChrootDirectory /jail/%u
.
chroot 외부에는 /username
이를 가리키는 심볼릭 링크가 있으므로 /jail/username/username
사용자의 홈 디렉터리가 유효합니다.
chroot 프로세스에서 /username
이는 사용자의 홈 디렉토리로 사용할 수 있는 일반 디렉토리일 뿐입니다.
예, 실제 경로 이름은 약간 반복적이며 심볼릭 링크로 인해 시스템 루트가 복잡해집니다. 하지만 chroot 환경에는 불필요한 것이 없습니다.
만약에오직chroot 사용자에게 필요한 것은 SFTP입니다.이 질문에 대한 답변은 더 간단한 접근 방식을 설명합니다.
답변2
sshd가 CD를 시도하기 때문에 확실히 실패할 것입니다
/home/user/home/user
.
음, 디렉토리가 존재하지 않는 경우에만 가능합니다.
SFTP만 필요하다고 언급했지만 유사한 기능을 사용하여 ChrootDirectory
바이너리와 라이브러리가 필요한 chroot 환경 또는 동일한 chroot 환경을 사용하는 여러 사용자를 위한 더 큰 도구 세트를 제공할 수 있습니다. 이러한 상황에서는 /some/chroot/home/user
. 물론 ChrootDirectory %h
이 경우에는 그다지 유용해 보이지 않습니다.
조금 어리석을 수도 있지만 생성하여 /home/user/home/user
사용자가 그곳에서 작업하도록 할 수 있습니다.
외부적으로 chroot를 생성할 때 사용자 홈 디렉토리의 목적은 무엇입니까
/home
? 아직도 독서용으로 사용하시나요~/.ssh/authorized_keys
?
사실 이것은 매우 좋은 지적이다. 매뉴얼 페이지에는 다음과 같이 나와 있습니다 ChrootDirectory
.
ChrootDirectory는
chroot(2)의 디렉토리 경로 이름을 지정합니다.인증 후.
authorized_keys
그래서 이것은 chroot 외부에서 읽는다는 것을 의미하는 것 같습니다 .
이로 인해 다른 구성 아이디어를 얻을 수 없었습니다. 사용자의 실제 홈 디렉터리를 로 설정하고 /
이를 설정하는 방법도 생각해 봤지만 ChrootDirectory /home/%u
지금 당장은 좋은 생각이 아닌 것 같습니다.