Server

SFTP Chroot 감옥 사용자 생성

LimeLee 2024. 4. 1. 19:23

일부 사용자끼리 특정 디렉터리 내 읽기/쓰기 권한을 주어 파일을 공유하고 싶다.

공유 계정은 아래의 조건을 만족해야 한다.

 

  • 공유 계정은 SSH 접근 불가능
  • 지정된 공유 디렉터리 상위로 이동 불가

SSH 서버의 sshd_config 설정을 통해 어렵지 않게 구현할 수 있다.


1. 사용자 생성

먼저 공유할 계정을 생성한다.

쉘 접근이 불필요한 계정일 경우 nologin으로 설정한다.

$ useradd share
$ passwd share
$ vi /etc/passwd
share:x:1010:1010::/home/share:/usr/sbin/nologin

 

2. sftp & Chroot 적용

아래의 sshd_config 설정을 적용하면 ssh로 쉘에 접근 할 수 없다.

$ vi /etc/ssh/sshd_config
Subsystem sftp internal-sftp

Match User share
	ChrootDirectory /home/share
	ForceCommand internal-sftp
$ service ssh restart

 

3. 디렉터리 설정

SSH 재시작 후 share 계정으로 SSH 쉘 접근이 불가능해지고, sftp로만 접근할 수 있게 된다.

만약 SSH가 연결이 반복적으로 끊어지는 문제가 발생한다면, Chroot 디렉터리의 권한 설정이 잘못된 경우일 수 있다.

 

아래와 같이 Chroot 디렉터리와 상위 디렉터리의 권한을 설정한다.

  1. Chroot 디렉터리 및 상위 디렉터리 권한: root 소유자, 755 권한
  2. Chroot 디렉터리의 그룹: share

예시로 /home/directory/share를 ChrootDirectory 라면 권한은 다음과 같이 되어야한다.

drwxr-xr-x root:root home/

drwxr-xr-x root:root directory/

drwxr-xr-x root:share share/

 

만약 상위 디렉터리의 권한을 변경할 수 없는 상황이라면, 심볼릭 링크를 사용할 수 있다.

Chroot 디렉터리로 사용하고 싶은 디렉터리의 상위 경로(/test/direc/tory/) 권한을 변경할 수 없고, /home/share는 Chroot 권한 조건을 만족할 수 있는 경우 다음과 같이 설정할 수 있다.

$ ln -s /test/direc/tory/share /home/share

 

그 후, sshd_config에서 Chroot 경로를 /home/share로 지정하고 SSH 서비스를 재시작하면 Chroot가 정상 작동한다.