sftp만 되는 유저를 생성하고 싶습니다. 그리고, 루트 폴더를 함부로 접근하지 못하게 하고 싶습니다. 이와 관련된 키워드라고 하면, chroot, 격리 정도가 있을 텐데요. ssh에서도 설정할 수 있습니다.

 


 먼저 ftpuser를 추가해 보겠습니다. adduser 명령어를 치시면 됩니다. 이 유저에 대해서 root의 위치를 /home/ftpuser로 바꿀 겁니다. 도커 공식 문서에서도 많이 본 거 같은데, 기분 탓일 겁니다. 이제 sshd_config 파일을 보겠습니다.

 

 

 맨 밑에까지 쭉 내려보면 Example of overriding setting on a per-user라고 되어 있는데요. 유저마다 setting값을 오버라이딩 할 수 있다는 의미입니다. 여기서, Match User는 유저에 대해서, Match Group은 그룹 단위로 설정을 덮어 쓰겠다는 의미입니다. 예를 들어서, cho로 접속할 때에는 key 파일로 접속을 하고, ftpuser로 접속할 때에는 비밀 번호로 접속하겠다. 하면, Match User ftpuser 이렇게 써 주고, 위와 같이 PasswordAuthentication을 Yes로 설정해 주시면 됩니다.

 

 위에 보시면 chrootDirectory를 /home/ftpuser로 되어 있는데요. ftpuser 관점에서 최상위 폴더를 /home/ftpuser로 놓겠다는 의미입니다. 이렇게 설정하고 ftpuser로 접속해 봅시다.

 

 

 그러면, Bad ownership of modes가 나오는데요.

 

 

 sshd config man 페이지를 보면, 위와 같이 나와 있습니다. root-owned여야 한다. 그리고 다른 그룹이나 유저에 의해 writable하지 않아야 합니다. 그렇다면, ubuntu에서는 chown으로 소유자와 소유 그룹을 root로 바꾸고, 755로 설정해 주면 되겠네요.

 

 

 대충, 요래 설정해 주시면 됩니다. 그러면, ftpuser 관점에서는 /home/ftpuser 위로 올라가지 못합니다.

 

 


 다음에 혹시 모르니, ftpuser의 접속 쉘을 /usr/sbin/nologin으로 해 놓습니다. passwd 파일에 있습니다.

 

 

 다음에, ftpuser 디렉토리 내에 file이라는 디렉토리를 생성합니다. 그리고, 이것의 소유자를 ftpuser로 설정합니다.

 

 

 그리고 ftpuser로 접속해 봅시다. 그러면, 서버에 연결하지 못했다는 에러가 나옵니다. 왠지 뭔가 없어서 그런 듯 싶네요.

 


 man 페이지를 쭉 읽다 보면, internal-sftp라는 키워드가 나옵니다.

 

 

 그리고 ForceCommand 부분을 읽어보면, internal-sftp가 또 언급이 됩니다. 이것은 in-process sftp 서버를 사용하게 되는데, 여기서 또 언급되는 내용이, requires no support files입니다. chroot로 격리했을 때, 통신하기 위해서는 파일들이 필요하다는 이야기일 텐데, 앞에 no가 붙어 있으니 그럴 필요가 없다는 이야기입니다.

 

 

 그러면, 옵션에 ForceCommand internal-sftp를 추가해 줍시다. 그리고, X11과 TcpForwarding을 no로 셋팅하고, 다시 ssh를 서버에 올려 보겠습니다.

 

 

 cr1과 cr2를 올려보겠습니다. 파일 질라에서 업로드를 해 봅시다.

 

 

 그러면 잘 올라갔음을 볼 수 있습니다. 당연하게도, /home/ftpuser에는 올리려고 해도 안 올라감을 알 수 있는데요. 이는 폴더 쓰기 권한이 없기 때문입니다.

 

 

 클라이 언트에 있었던 cr1.png입니다.

 

 

 서버에 올라간 것을 확인해 보니, 잘 올라갔음을 볼 수 있습니다. 이 링크를 보시면, 좀 더 디테일한 설명이 있으니 참고하셔도 좋을 듯 싶습니다.