Server

SFTP Chroot 감옥 사용자 생성

LimeLee 2024. 4. 1. 19:23

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

 

현재 서버에 구현되어 있는 서비스로 가능한 방법은

  1. 웹 서버에 로그인 페이지와 공유 디렉터리에 파일을 업로드/다운로드하는 페이지를 구현
  2. sftp 로 공유 디렉터리에 대해서 접근 가능

인데 로그인, 업로드, 다운로드 페이지를 만드는 건 귀찮으니 sftp 를 이용한다.

공유 디렉터리 내 파일에 대한 읽기/쓰기 권한만을 부여하고 싶으므로  

  1. 공유 계정은 ssh가 불가능해야 함
  2. 공유 디렉터리 상위로 올라가면 안됨

위 2가지 문제가 고려되어야한다. 이 모두 sshd에서 제공해주는 기능으로 어렵지 않게 구현할 수 있다.


사용자 생성

공유할 계정부터 생성한다.

쉘이 필요 없는 계정이라면 nologin으로 설정해줘도 된다.

nologin으로 설정하지 않아도 다음 ssh 설정을 적용하면 ssh로 쉘에 접근 할 수 없다.

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

 

sftp & Chroot 적용

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

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

 

ssh를 재시작하면 share라는 계정으로 ssh 쉘에 접근할 수 없게 된다.

그리고 ssh가 끊어졌다 연결됬다 반복하는 증상이 나오는데 Chroot 디렉리의 권한 설정이 잘못되어있는 것이므로 권한 설정을 추가로 해준다.

 

디렉터리 설정

Chroot로 지정한 디렉터리와 상위 디렉터리의 조건은 다음과 같다.

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

만약에 /home/directory/share를 ChrootDirectory 라면 권한은 다음과 같이 되어야한다.

drwxr-xr-x root:root home/

drwxr-xr-x root:root directory/

drwxr-xr-x root:share share/

 

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

예로 /test/direc/tory/share 를 ChrootDirectory로 사용하고 싶은데 /test/, /direc/, /tory/ 중 root 소유자와, 755 권한으로 지정할 수 없는 디렉터리가 있고 /home/ 디렉터리는 root, 755 권한을 만족할 수 있는 경우

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

위와 같이 /home/ 디렉터리에 심볼릭 링크를 생성하고 sshd_config 파일에서 Chroot의 경로를 /home/share로 지정해준 후 ssh를 재시작하면 Chroot 감옥이 정상 작동되는 걸 확인할 수 있다.