FTP 를 운영할때 이런 경우가 있다.

Data / userA / dirA / fileA , fileB
                     dirB / fileC , fileD
         userB / dirC / ...
         userC /
위 처럼 구성되어 있다고 할때.

다운로드는 심볼링링크로 처리한다고 해보자.
(각 파일은 DownA -> userA 의 파일들이 링크된다-지정된 몇몇 파일들)
DownA / data / dirA / fileA -> symbolic link (/Data/userA/dirA/fileA)
                       dirB ..
DownB / data / dirC ..
이렇게 외부로 빼서 하는 경우 FTP 의 chroot 상태에서는 링크가 깨져 다운로드 할 수 없다.
(userA 의 경우 접속시 DownA 가 chroot 되어 /data/ ... 부분만 접속이 가능하기 때문이다)

그럼 어떻게 해결하는가?

1. chroot 를 풀어버린다.
  chroot 를 사용하지 않고, 그냥 절대경로로 사용한다.

 proftpd
DefaultRoot                    ~
의 옵션을 해제한다.
 vsftpd
chroot_local_user=YES
를 YES -> No 로 바꿔준다.

 그런데, 저렇게 바꿔버리면 사용자가 상위디렉토리로 접근할 수 있게 되어 보안 위험에 노출 된다. 물론 퍼미션을 잘 조정하면 괜찮지만, 아무래도 꺼림직하다.

2. mount bind 를 이용한다.

접근하려는 사용자 디렉토리를 mount -o bind 옵션으로 마운트해서 사용한다.
위와 같은 경우 (userA)
mount -o bind  /Data/userA  /DownA/UserData

이런식으로 마운트한후에 링크는
/UserData/dirA/fileA
으로 해주면 된다.  여기서
/DownA/UserData/dirA/fileA
가 아닌 이유는 chroot 시에 /DownA 가 / 로 바뀌기 때문이다.

이 경우 사용자가 늘어나면 매번 mount bind 명령을 해줘야 한다.
소수의 사용자야 그냥 하면 되지만, 늘어나는 경우 정말 귀찮아 진다.
cron 으로 자동처리하면 되기는 하는데, 좀 깔끔하게 처리하는 방법이 없을까?


위 방법이 한계가 있다면, FTP 이외에 다른 방법을 찾아야 할지도 모르겠다.
서버, 클라이언트의 부담이 가장 적은 방법에 무엇이 있을까?

# 관련자료
http://www.castaglia.org/proftpd/doc/contrib/ProFTPD-mini-HOWTO-Chroot.html

http://www.proftpd.org/docs/howto/Chroot.html
반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,