반응형


    SFTP 퍼미션 조정 및 Chroot 설정으로

    상위폴더 접근 제한하기






    SFTP를 설정하고 나서 생각지도 못한 부분이 하나 있었는데, 그것은 일반 FTP와는 다르게 root 권한을 가지지 않는 계정이라도 SFTP를 이용하면 상위 폴더에 접근이 가능하다라는 것입니다. 혼자 SSH 및 SFTP를 사용할 때는 크게 문제가 되지 않는 부분이지만, 여러개의 SSH 계정을 제공하는 경우에 하나의 큰 문제점이 생기게 됩니다.





    SSH로 접속하든, SFTP로 접속하든 최상위 폴더로 접근가능하며, 또 열람도 가능합니다. 쉽게 이야기하면, 하나의 계정이 서버의 설정도 확인할 수 있고, 다른 사용자 계정의 정보도 확인할 수 있으며 또 열람도 가능합니다. 위에 화면에서 보다시피 SFTP로 접속한 경우에 해당 계정의 상위폴더인 /home 폴더를 포함해서 /(root) 폴더까지 접근이 가능합니다.


    혼자만 사용하는 경우나 지극히 프라이빗한 서버를 운영한다면 크게 문제될 일은 없지만, 호스팅 서비스를 한다거나 아님 다중의 사용자간 격리가 필요하다면 곤란해집니다. 특히 SSH를 오픈해서 제공해주는 경우에는 특히 심합니다. 사용자 누구나 루트 폴더에 접근할 수 있기 때문에 해킹에 취약해 질 수 있습니다.


    이번 시간에는 SFTP에서 상위 폴더에 접근 못하는 방법으로 설정할 수 있는 두가지 방법에 대해 알아보도록 하겠습니다.


    1. SSH를 사용가능하게끔 하면서 상위 폴더 접근은 퍼미션 조정으로 접근을 막는 방법

    2. SFTP에서 chroot 기능을 이용하여 사용자의 홈폴더를 root 폴더로 지정하는 방법 (단, SSH 사용불가)


    이 뿐 아니라, SSH와 SFTP에 사용에 대해 경우의 수를 나열해보자면 이렇습니다.


    1. SSH, SFTP 둘 다 사용 (일반적인 경우이며, 상위 폴더로 접근못하게 설정하는 방법은 본 포스팅에서 다룸)

    2. SSH는 사용, SFTP는 사용 안 함 (본 포스팅에서 방법을 설명함)

    3. SSH는 사용 안 함, SFTP는 사용 (본 포스팅의 주된 내용)

    4. SSH, SFTP 둘 다 사용 안 함


    2번 내용에 대해서는 이 글 중간에 잠깐 언급하도록 하겠습니다. 주된 내용이 1번과 3번의 내용이고, 가장 핵심이 되는 내용입니다. 4번은 뭐.. SSH 데몬을 사용안하면 되니깐 신경쓰지 않아도 되겠죠.


    앞으로 설정하는 내용들은 root 계정을 이용해서 설정합니다.

    가급적이면 root 계정을 이용하시거나 su 명령어를 통해서 root 권한을 가지고 설정하기 바랍니다.




    1. Permission 조정하는 방법


    SSH와 SFTP를 동시에 사용해야 하는 경우라면 퍼미션을 조정해서 둘 다 사용하게끔 할 수 있습니다. 단 퍼미션을 이용한 방법은 상대적으로 보안에 취약합니다. 리눅스 구조를 잘 알고 있는 사람이라면 OS 구조를 일부 파악할 수 있습니다. 퍼미션을 조정하는 방법에 대해서 장점과 단점을 이야기 해보자면


    장점

    SSH와 SFTP를 동시에 사용가능한 방법

    과정이 복잡하지 않다.


    단점

    리눅스 구조에 대해서 잘 알고 있는 경우 직접적으로 경로 탐색이 가능함 (예 /etc/ssh 로 이동가능한 점 등등)

    잘못 퍼미션을 조정하면 시스템이 정상적으로 작동하지 않을 수도 있다.


    해커가 아닌 이상에서 이 OS 구조만으로는 정보를 빼내기는 힘들지만, 혹시라도 우연히 중요한 정보가 노출이 될 수 있습니다. 

    현재 호스팅 업체중에서 SSH와 SFTP를 동시에 제공하는 경우에는 대부분 이 방법을 사용하고 있습니다.


    방법과 원리는 아주 간단한데 주요한 폴더들을 711권한을 부여해서 접근을 막는 방법입니다. 예를 들면




    이렇게 루트 폴더인 / 와 /home그리고 /etc 등등 주요한 폴더에 711권한을 부여하는 방법입니다.


    참고로! 711 권한은 소유자의 권한은 7(읽기, 쓰기, 실행), 그룹의 권한 1(실행), 모든 사용자 권한 1(실행) 입니다.

    즉, 소유자는 모든 권한을 가지고 있고, 그룹과 일반 사용자들은 실행 권한만 가집니다. 보안을 위해 700의 권한을 부여하는 경우에는 OS 구동에 필요한 시스템이 실행권한을 갖지 못해서 정상적인 OS를 사용할 수 없는 경우가 생기므로 711을 부여해야 합니다.


    부여 방법은 간단하죠? 아래의 명령어들을 입력하면 됩니다. (여기서는 예를 들기 위해 3개의 디렉터리만 설정하였습니다.)



    예로 들은 폴더뿐 아니라, 가급적이면 루트 폴더에 보이는 폴더들은 권한 설정은 이렇게 하는게 좋습니다. 단, 권한 설정을 할 때 권한 문제로 골치 아파지는 경우가 있으므로 가급적 하위폴더는 포함되지 않게 주의해야 합니다. 글 하단에 추가적으로 711권한을 설정하면 좋은 폴더들을 적어두었습니다.

    이렇게 설정하고 나면 SFTP든, SSH든 상위 폴더로 이동이 불가능 합니다.


    위에서 보다 시피 [cd ..] 명령을 내렸는데 퍼미션으로 인해서 접근 거부되었다는 에러메세지를 볼 수 있습니다.


    조금 더 간단하게 여러 디렉터리의 권한을 쉽게 설정하는 방법은 SFTP를 이용해서 root 계정으로 접속 후 변경하면 좋습니다.

    파일질라 같은 FTP 전용 프로그램을 이용해서 권한을 변경할 폴더들을 선택하고 권한을 711로 변경합니다.



    원하는 폴더에서 우측버튼을 누르고 파일 권한을 선택합니다.




    그리고 권한의 숫자값을 711로 부여합니다. (단, 이때는 하위 디렉터리로 이동부분을 반드시 체크해제 해야 합니다.)



    하지만 이 방법의 가장 큰 문제점은 바로 이렇게 퍼미션을 지정하지 않은 디렉터리에 대해서는 쉽게 접근이 가능합니다.




    이 때는 /var 디렉터리의 권한을 711로 변경하지 않았는데(포스팅을 위해), 그 때문에 여전히 접근 가능한 모습을 확인할 수 있습니다. 이렇게 권한을 711로 변경하지 않는 디렉터리에 관한 몇몇 문제점을 감수한다면 퍼미션 설정만으로도 충분히 접근을 제한 할 수 있습니다.


    아래는 퍼미션을 711로 변경했으면 하는 추천 목록입니다.



    퍼미션 변경을 통해서 발생한 문제는 본 블로그에서 책임을 지지 않기 때문에 가급적이면 조심해서 변경하길 바랍니다.





    2. Chroot 설정하기


    일단, 이 Chroot는 설정법이 리눅스에서는 비슷비슷하지만(sshd_config 파일을 이용해서 설정하는 부분이) 그래도 이번 포스팅에서 사용한 운영체제는 Ubuntu 14.04.3 LTS Server 64Bit 버전입니다.


    Chroot란?

    Chroot는 Change Root Directory라는 뜻으로 임시로 루트 디렉터리를 설정하는 명령어 입니다. 일반적인 루트 디렉터리인 / 가 아닌 /home이나 /etc 와 같은 임의의 폴더를 임시로 root 디렉터리 인 것처럼 설정 할 수 있습니다.


    이 Chroot를 특정 사용자 특정 그룹의 홈 폴더를 루트폴더인것 처럼 지정해서 상위 폴더로의 접근을 제한할 수 있습니다. 마치 일반적인 FTP 서비스와 같이 상위 폴더로의 접근을 원천적으로 제한하는 방법입니다. 이 방법 역시 장점과 단점이 존재하기 때문에 적어보겠습니다.


    장점

    사용자의 홈 디렉터리를 가상의 Root 폴더로 지정하기 때문에 상위 디렉터리로의 접속을 원천 봉쇄 할 수 있다. (보안에 강함)


    단점

    설정 과정이 복잡하다. (대신 한번 원리를 이용하면 금방입니다.)

    Chroot를 지정한 유저 또는 그룹은 SSH를 사용할 수 없다.


    SFTP에서 Chroot를 설정하면, FTP로서의 기능만 하게 되는 것 같습니다. 더 안전한 대신 불편한 점도 있으니 사용환경에 맞게 사용하시면 될 듯합니다. Chroot를 설정하더라도 모든 사용자가 SSH를 사용 못하는 것이 아니고 Chroot를 설정한 계정(또는 그룹)만 SSH를 사용할 수 없습니다.


    내용을 설명하기 전에 Chroot를 설정할 계정과 디렉터리 명부터 설명하겠습니다.


    Chroot를 적용할 유저명 : test

    Chroot를 적용할 디렉터리 : /home/test (OS에서 제공하는 사용자 홈디렉터리)


    test라는 사용자가 SFTP로 접속을 했을 때, /home/test 디렉터리를 루트로 지정하고 /home 및 / 로의 이동을 원천적으로 이동할 수 없게 가둬두는(Jail) 작업입니다.


    먼저 SSH 데몬의 설정부터 조금 변경해야 합니다. /etc/ssh/sshd_config 파일을 수정합니다.

    이 중에서 조금 하단으로 이동하면 다음과 같은 구문이 있습니다.





    이렇게 되어 있는 부분 앞에 #을 붙여 그 구문을 주석처리 합니다. 대신 SFTP 시스템으로 sftp-server가 아닌 internal-sftp를 사용합니다.

    그래서 아래와 같이 되로록수정합니다.


     

    만약, SSH는 사용하되, SFTP 기능을 사용하지 못하도록 하려면 sftp에 관한 구문을 #으로 주석처리하면 됩니다.


    # Subsystem sftp /usr/lib/openssh/sftp-server


    이런 식으로 추가 내용 없이 주석 처리 저장하면 SSH는 사용가능하고 SFTP는 사용이 불가능합니다.


    아직 수정할 부분이 더 남았습니다. internal-sftp를 사용하면서 chroot를 적용할 사용자(또는 그룹)를 따로 추가 설정합니다.

    Match 구분을 이용해서 추가적인 설정을 진행하는데, Match 구문은 sshd_config 파일의 가장 마지막에 존재해야 한다고 합니다.



    ChrootDirectory 에는 꼭 홈디렉터리가 아니라 다른 디렉터리를 지정해도 상관없습니다. (단, 설정을 정확하게 해야합니다.) 홈 디렉터리를 잘 모르거나 긴 문장을 쓰기 귀찮다면 %h로 대체해도 됩니다.


    참고

    %h : 사용자의 홈디렉터리를 뜻함.

    %u : 인증된(관련이 있는) 사용자의 계정을 뜻함


    이 뿐 아니라 특정 그룹에 있는 사용자들에게 Chroot를 적용하려면 아래와 같이 추가하면 됩니다.



    그룹으로 지정하는 경우 각각의 사용자마다 홈디렉터리가 다르기 때문에 ChrootDirectory는 %h로 지정하면 됩니다.

    최종적인 상황을 전체적으로 보자면 이렇게 됩니다.




    이걸로 sshd_config 파일은 모두 설정했습니다. 나중에 Chroot를 적용할 사용자가 추가적으로 있다면 이 Match 구문을 추가하면 됩니다. sshd_config 파일을 수정하고 나면, ssh를 재시작 해주어야 합니다.



    이렇게 하면 SSH쪽의 설정을 마쳤습니다. 하지만 이대로 접속을 하면 접속이 되지 않습니다. 이유는 Chroot를 적용하려면 Chroot가 적용된 디렉터리는 반드시 소유자가 root가 되어야 합니다. 또한 가상의 루트 디렉터리가 되는 /home/test 디렉터리의 권한은 무조건 755로만 설정을 해야하고 그 외의 설정은 제대로 접속이 되지않는 상황이 되니 소유자를 변경하고 권한도 변경해야 합니다.


    참고로 디렉터리의 권한이나 소유자 및 소유그룹을 확인하는 방법은 ls -al 또는 ll (엘 두번) 명령어를 이용하면 됩니다.



     현재 상황을 보면 퍼미션은 755로 되어 있지만 소유자및 소유그룹 모두 test입니다. 일단 보이는 화면부터 설명하면


    drwxr-xr-x  3 root test 4096 Sep 10 02:18 test/

      (권한)     소유자  소유그룹


    소유 그룹이 test인 이유는 리눅스에서 새로운 사용자를 만들면 유저와 그룹을 동시에 같은 이름으로 생성하기 때문에 test를 사용자가 아닌 그룹으로도 설정할 수 있습니다.

    그룹은 그대로 test로 두고, 소유자를 root로 변경해야 합니다.

    또한 권한도 755가 아니라면 755로 변경합니다.

    참고!

    755 퍼미션 : 소유자 7 (읽기, 쓰기, 실행) 그룹 5 (읽기, 실행) 모든 사용자 5 (읽기, 실행)




    하지만 또 이대로 접속을 하면 test 계정으로 SFTP 연결을 했을 때 쓰기 권한을 가지고 있지 않기 때문에 홈 디렉터리 내에서는 아무런 활동을 할 수 없어 여전이 접속이 되지 않습니다. 대부분 여기서 설정이 막혀서 많은 분들이 포기를 하더군요. 여기서 추가적인 설정이 필요합니다.

    /home/test 안에 서브 디렉터리로 임의의 폴더를 하나 만들고 그 폴더에 쓰기 권한을 주는 방법입니다.


    /home/test 안에 www란 디렉터리를 만들고, 그 디렉터리의 소유자와 그룹을 root와 test로 지정합니다. 또한 이 때 권한은 그룹에도 쓰기 권한을 추가한 775로 설정해야 합니다.


    변경을 하고 다시 권한을 확인했을 때 아래와 같이 나와야 합니다.




    이렇게 하고 나면 앞으로 SFTP를 통해 접속을 하면 /home/test 에 접속을 할 수 있고, www에 쓰기가 가능하며, /home 이상의 디렉터리에는 아예 접근조차 불가능 하도록 하는 Chroot가 적용 됩니다.


    그럼 이제 접속을 해보도록 하겠습니다.




    왼쪽이 기존에 SFTP로 접속했을 때 보여지는 화면우측은 Chroot를 적용했을 때 보여지는 화면입니다. 루트폴더로 보여지는 부분에 차이가 눈에 보이죠? 좀 더 확실하게 /home/test에서 벗어나지 않는지 확인하기 위해 아까처럼 직접 /var 로 이동하기 위해 경로를 입력해보면 아래와 같이 그런 디렉터리가 없다고 나옵니다.



    퍼미션을 변경해서 접근이 거절될 것과는 달리 Chroot를 적용하면 마치 /home/test 이상의 디렉터리는 없는 것 처럼 사용할 수 있습니다.



    SFTP를 좀 더 안전하게 서비스하기 위해서 상위 폴더로 접근을 막는 두가지 방법을 알아보았습니다. 퍼미션을 변경하는 방법Chroot를 설정하는 방법 모두 일장 일단이 있어서 호불호가 갈릴 듯 합니다.

    현재 운영하는 스타일에 맞춰 어떻게 중점을 둘건지 생각해서 신중하게 설정하길 바랍니다.







    반응형
    Posted by clamp2x