일부 사용자끼리 특정 디렉터리 내 읽기/쓰기 권한을 주어 파일을 공유하고 싶다. (공유 계정)
현재 서버에 구현되어 있는 서비스로 가능한 방법은
- 웹 서버에 로그인 페이지와 공유 디렉터리에 파일을 업로드/다운로드하는 페이지를 구현
- sftp 로 공유 디렉터리에 대해서 접근 가능
인데 로그인, 업로드, 다운로드 페이지를 만드는 건 귀찮으니 sftp 를 이용한다.
공유 디렉터리 내 파일에 대한 읽기/쓰기 권한만을 부여하고 싶으므로
- 공유 계정은 ssh가 불가능해야 함
- 공유 디렉터리 상위로 올라가면 안됨
위 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로 지정한 디렉터리와 상위 디렉터리의 조건은 다음과 같다.
- ChrootDirectory 및 상위 디렉터리의 소유자와 권한은 root, 755
- 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 감옥이 정상 작동되는 걸 확인할 수 있다.
'Server' 카테고리의 다른 글
Github Actions로 push 이벤트 발생 시 내 서버로 배포 자동화하기 (0) | 2023.09.05 |
---|---|
아파치 HTTP 인증(Basic/Digest authentication) 적용 (0) | 2022.04.28 |
MYSQL 외부접근 허용하기 (0) | 2019.04.11 |
아파치 보안 설정 (0) | 2018.04.11 |