웹사이트 검색

Ubuntu 20.04에서 SSL/TLS를 사용하여 FTP 서버(vsftpd)를 설치하고 구성하는 방법


이 튜토리얼은 다음 OS 버전에 대해 존재합니다.

  • 우분투 18.04(바이오닉 비버)

이 페이지에서

  1. 전제 조건
  2. 1단계 - vsftpd 설치
  3. 2단계 - 방화벽 구성\n
  4. 3단계 - vsftpd 구성
    1. 1. FTP 액세스
    2. 2. 파일 업로드 활성화\n
    3. 3. Chroot 감옥
    4. 4. 패시브 FTP
    5. 5. 사용자 제한\n

    1. 1단계 - 새 사용자를 추가합니다.\n
    2. 2단계 - 허용된 FTP 사용자 목록에 사용자를 추가합니다.\n
    3. 3단계 - FTP 및 파일 디렉토리 생성

    FTP 또는 파일 전송 프로토콜은 클라이언트와 서버 간에 파일을 전송하기 위한 매우 오래된 잘 알려진 프로토콜입니다. 또한 TLS 없이 사용하는 경우에만 안전하지 않은 프로토콜입니다. 이 자습서에서는 FTP를 안전하게 사용할 수 있도록 하는 TLS용 vsftpd를 구성합니다. FTP는 요즘 SFTP 또는 SCP와 같은 보다 안전한 프로토콜로 대체되는 경우가 많습니다.

    그러나 서버에서 FTP를 사용해야 하는 경우 vsftpd(Very Secure FTP Daemon)가 완벽한 선택입니다.

    이 튜토리얼에서는 Ubuntu 20.04 기반 서버에서 vsftpd를 사용하여 FTP 서버를 설치하고 구성하는 방법을 배웁니다. 또한 SSL/TLS 프로토콜을 사용하여 연결을 보호하는 방법도 배웁니다.

    전제 조건

    • 루트가 아닌 사용자가 sudo 권한을 가진 Ubuntu 20.04 서버.\n

    1단계 - vsftpd 설치

    첫 번째 단계는 vsftpd를 설치하는 것입니다.

    $ sudo apt update
    $ sudo apt install vsftpd
    

    다음으로 새로운 구성으로 시작할 수 있도록 원래 구성 파일을 백업해야 합니다.

    $ sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig
    

    2단계 - 방화벽 구성

    이 단계에서는 FTP 포트에 대한 액세스를 허용하도록 UFW 방화벽을 구성합니다.

    먼저 방화벽의 상태를 확인하겠습니다.

    $ sudo ufw status
    Status: active
    
    To                         Action      From
    --                         ------      ----
    OpenSSH                    ALLOW       Anywhere
    OpenSSH (v6)               ALLOW       Anywhere (v6)
    

    지금까지는 SSH 포트만 허용되었습니다. TLS를 사용할 때 포트 20(FTP 명령 포트), 21(FTP 데이터 포트), 990을 열고 향후 필요할 수 있는 패시브 포트 범위를 위해 포트 35000-40000을 엽니다.

    $ sudo ufw allow 20:21/tcp
    $ sudo ufw allow 990/tcp
    $ sudo ufw allow 35000:40000/tcp
    $ sudo ufw status
    Status: active
    
    To                         Action      From
    --                         ------      ----
    OpenSSH                    ALLOW       Anywhere
    990/tcp                    ALLOW       Anywhere
    20:21/tcp                  ALLOW       Anywhere
    35000:40000/tcp            ALLOW       Anywhere
    OpenSSH (v6)               ALLOW       Anywhere (v6)
    20:21/tcp (v6)             ALLOW       Anywhere (v6)
    990/tcp (v6)               ALLOW       Anywhere (v6)
    35000:40000/tcp (v6)       ALLOW       Anywhere (v6)
    

    3단계 - vsftpd 구성

    이제 vsftp가 작동하도록 몇 가지 중요한 설정을 살펴보겠습니다.

    구성 파일을 열어 시작합니다.

    $ sudo nano /etc/vsftpd.conf
    

    1. FTP 액세스

    이 자습서에서는 로컬 사용자에게만 FTP 액세스를 허용하고 익명 액세스는 비활성화합니다. 이렇게 하려면 다음 줄이 존재하고 다음과 같은지 확인하십시오.

    anonymous_enable=NO
    local_enable=YES
    

    2. 파일 업로드 활성화

    여기서 FTP의 가장 중요한 단 하나의 목적은 서버에 쓸 수 있다는 것입니다. 파일 업로드를 활성화하려면 앞의 #를 제거하여 다음 줄의 주석을 제거하십시오.

    write_enable=YES
    

    3. Chroot 감옥

    FTP는 사용자가 특정 디렉토리로 제한될 때 가장 잘 작동합니다. vsftpd는 chroot 감옥을 사용하여 이를 달성합니다. 로컬 사용자에 대해 chroot가 활성화되면 기본적으로 홈 디렉토리로 제한됩니다. 이렇게 하려면 다음 줄의 주석 처리를 제거하십시오.

    chroot_local_user=YES
    

    보안 취약성을 방지하기 위해 chroot를 활성화하면 디렉토리 사용자가 쓰기 가능한 경우에만 작동합니다.

    이 제한을 해결하기 위해 chroot가 활성화되었을 때 파일 업로드를 허용하는 두 가지 방법이 있습니다.

    1. Method 1 - This method works by using a different directory for FTP uploads. For this tutorial, we will create an ftp directory inside the user's home to serve as the chroot and a second writable directory upload for uploading the files. To achieve this, add the following lines at the bottom of the file.

      user_sub_token=$USER
      local_root=/home/$USER/ftp
      
    2. Method 2 - The second method is to simply grant writable access to the home directory as a whole. Add the following line to achieve this.

      allow_writeable_chroot=YES
      

    4. 패시브 FTP

    vsftpd는 수동 FTP 연결에 모든 포트를 사용할 수 있습니다. vsftpd가 사용할 수 있는 최소 및 최대 포트 번호의 범위를 지정할 수 있습니다. 이전에 UFW 방화벽에서 구성한 포트입니다.

    수동 FTP 연결을 허용하려면 다음 행을 추가하십시오.

    pasv_min_port=35000
    pasv_max_port=40000
    

    5. 사용자 제한

    특정 사용자만 FTP 서버에 로그인할 수 있도록 하려면 맨 아래에 다음 행을 추가하십시오.

    userlist_enable=YES
    userlist_file=/etc/vsftpd.userlist
    userlist_deny=NO
    

    이 옵션을 사용하면 FTP를 사용할 수 있는 사용자를 지정하고 /etc/vsftpd.userlist 파일에 해당 사용자 이름을 추가해야 합니다.

    구성을 활성화하려면 vsftpd를 다시 시작하십시오.

    $ sudo systemctl restart vsftpd
    

    4단계 - 사용자 디렉터리 구성

    이 자습서의 목적을 위해 FTP 트랜잭션을 위한 새 사용자 계정을 만듭니다. 이를 위한 사용자 계정이 이미 있는 경우 1단계를 건너뛸 수 있습니다. 또한 이전에 구성 파일에서 allow_writeable_chroot=YES를 설정한 경우 3단계를 건너뛸 수 있습니다.

    1단계 - 새 사용자를 추가합니다.

    $ sudo adduser testuser
    

    강력한 암호를 설정하고 다른 모든 프롬프트를 건너뜁니다.

    2단계 - 허용된 FTP 사용자 목록에 사용자를 추가합니다.

    $ echo "testuser" | sudo tee -a /etc/vsftpd.userlist
    

    3단계 - FTP 및 파일 디렉토리 생성

    이 단계는 chroot 감옥 제한을 피하기 위해 파일을 업로드하기 위해 FTP 루트로 다른 디렉토리와 다른 디렉토리를 원하는 경우입니다.

    FTP 폴더를 생성합니다.

    $ sudo mkdir /home/testuser/ftp
    

    소유권을 설정합니다.

    $ sudo chown nobody:nogroup /home/testuser/ftp
    

    쓰기 권한을 제거하십시오.

    $ sudo chmod a-w /home/testuser/ftp
    

    계속하기 전에 권한을 확인하십시오.

    $ sudo ls -al /home/testuser/ftp
    total 8
    dr-xr-xr-x 2 nobody   nogroup  4096 Jun  7 13:08 .
    drwxr-xr-x 3 testuser testuser 4096 Jun  7 13:08 ..
    

    이제 파일에 대한 실제 쓰기 가능한 디렉토리를 생성하겠습니다.

    $ sudo mkdir /home/testuser/ftp/upload
    $ sudo chown testuser:testuser /home/testuser/ftp/upload
    

    권한을 테스트하십시오.

    $ sudo ls -al /home/testuser/ftp
    total 12
    dr-xr-xr-x 3 nobody   nogroup  4096 Jun  7 13:10 .
    drwxr-xr-x 3 testuser testuser 4096 Jun  7 13:08 ..
    drwxr-xr-x 2 testuser testuser 4096 Jun  7 13:10 upload
    

    마지막으로 테스트에 사용할 test.txt 파일을 추가하겠습니다.

    $ echo "vsftpd test file" | sudo tee /home/testuser/ftp/upload/test.txt
    

    5단계 - FTP 액세스 테스트

    우리의 FTP 서버는 현재 완벽하게 작동합니다. 계속 진행하기 전에 약간의 테스트를 할 수 있습니다.

    익명의 사용자로 로그인해 봅시다.

    $ ftp -p 136.244.105.99
    Connected to 136.244.105.99.
    220 (vsFTPd 3.0.3)
    Name (136.244.105.99:default): anonymous
    530 Permission denied.
    ftp: Login failed.
    ftp>
    

    연결을 닫습니다.

    ftp> bye
    

    의도한 대로 작동합니다. 즉, 익명 사용자는 허용되지 않습니다.

    다른 sudo 사용자로 연결해 보겠습니다. 역시 연결하면 안됩니다.

    $ ftp -p 136.244.105.99
    Connected to 136.244.105.99.
    220 (vsFTPd 3.0.3)
    Name (136.244.105.99:default): sudo_user
    530 Permission denied.
    ftp: Login failed.
    ftp>
    

    연결을 닫습니다.

    ftp> bye
    

    마지막으로 FTP용으로 만든 testuser로 연결을 시도합니다.

    $ ftp -p 136.244.105.99
    Connected to 136.244.105.99.
    220 (vsFTPd 3.0.3)
    Name (136.244.105.99:default): testuser
    331 Please specify the password.
    Password: your_user's_password
    230 Login successful.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp>
    

    upload 디렉토리로 전환하고 get 명령을 사용하여 테스트 파일을 로컬 시스템으로 전송하겠습니다.

    ftp> cd upload
    250 Directory successfully changed.
    ftp> get test.txt
    227 Entering Passive Mode (136,244,105,99,165,42).
    150 Opening BINARY mode data connection for test.txt (17 bytes).
    226 Transfer complete.
    16 bytes received in 0.0101 seconds (164.3719 kB/s)
    ftp>
    

    다음으로 put 명령을 사용하여 새 이름으로 파일을 업로드하여 쓰기 권한을 테스트해 보겠습니다.

    ftp> put test.txt upload.txt
    227 Entering Passive Mode (136,244,105,99,163,102).
    150 Ok to send data.
    226 Transfer complete.
    17 bytes sent in 0.000894 seconds (518.7988 kB/s)
    

    연결을 닫습니다.

    ftp> bye
    

    6단계 - SSL/TLS를 사용한 전송 보안

    FTP 전송을 암호화하려면 SSL 인증서가 필요하고 이를 사용하도록 vsftpd를 구성해야 합니다.

    FTP 서버를 가리키는 도메인 또는 하위 도메인이 이미 있는 경우 무료 Lets Encrypt SSL 인증서를 만들어 사용할 수 있습니다.

    자습서의 목적을 위해 자체 서명된 SSL 인증서를 사용합니다. 만들려면 openssl 명령을 사용합니다.

    다음 명령은 2048비트 개인 키와 1년 동안 유효한 인증서를 생성합니다. 인증서와 키가 모두 동일한 파일에 저장됩니다.

    $ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem
    

    다음 프롬프트를 건너뛰거나 원하는 대로 값을 채울 수 있습니다.

    이제 인증서가 생성되었으므로 vsftpd 구성 파일을 다시 열 차례입니다.

    $ sudo nano /etc/vsftpd.conf
    

    다음 줄을 찾아 다음과 같이 그 앞에 해시를 넣어 주석 처리합니다.

    # rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
    # rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
    

    이제 다음 줄을 추가합니다.

    rsa_cert_file=/etc/ssl/private/vsftpd.pem
    rsa_private_key_file=/etc/ssl/private/vsftpd.pem
    

    또한 ssl_enable 값을 YES로 변경합니다.

    ssl_enable=YES
    

    SSL 보안을 개선하기 위해 몇 가지 설정을 더 추가해 보겠습니다.

    allow_anon_ssl=NO
    force_local_data_ssl=YES
    force_local_logins_ssl=YES
    ssl_tlsv1=YES
    ssl_sslv2=NO
    ssl_sslv3=NO
    require_ssl_reuse=NO
    ssl_ciphers=HIGH
    

    이러한 설정의 대부분은 자명합니다. 이는 익명 사용자에 대해 SSL을 비활성화하고 데이터 전송 및 로그인 모두에 SSL을 요구합니다. 또한 안전하지 않은 SSL 프로토콜을 비활성화하고 TLSv1.0을 고수할 것입니다. 마지막으로 SSL 재사용을 비활성화하고 높은 암호화 암호 제품군을 요구합니다.

    설정을 적용하려면 서버를 다시 시작하십시오.

    $ sudo systemctl restart vsftpd
    

    이제 명령줄을 통해 FTP를 사용할 수 없습니다. TLS를 지원하는 클라이언트를 사용하여 연결해야 합니다.

    7단계 - FileZilla로 TLS 테스트

    자습서에서는 Filezilla를 사용하여 TLS 기능을 테스트합니다.

    Filezilla를 열면 상단 행의 호스트라는 단어 바로 위에 있는 사이트 관리자 아이콘을 클릭합니다.

    새 창이 열립니다. 오른쪽 하단 모서리에 있는 새 사이트 버튼을 클릭합니다.

    새 사이트라는 이름의 새 아이콘이 표시됩니다. 이름 바꾸기 버튼을 사용하여 이름을 바꿀 수 있습니다.

    호스트 필드에 서버의 IP 주소를 입력합니다. FTP 포트는 FTP의 기본 포트인 21이므로 포트 필드를 비워 둘 수 있습니다. 암호화 옵션의 경우 드롭다운 메뉴에서 TLS를 통한 명시적 FTP 필요를 선택합니다.

    위에서 생성한 FTP 사용자 이름과 비밀번호를 입력합니다. 계속하려면 연결 버튼을 클릭하십시오.

    성공적으로 연결되면 다음과 같은 서버 인증서가 표시됩니다.

    이후 세션에서 항상 이 인증서 신뢰 옵션을 선택할 수 있습니다. 로그인할 때마다 묻는 메시지가 표시되지 않도록 합니다. 계속하려면 확인을 클릭합니다.

    이제 일반 FTP 작업을 수행할 수 있습니다.

    8단계 - 셸 액세스 비활성화

    이 단계는 전적으로 선택 사항입니다. 기본적으로 FTP 사용자를 생성할 때 명시적으로 지정하지 않으면 사용자는 서버에 대한 SSH 액세스 권한을 갖게 됩니다.

    보안을 강화하려면 FTP 사용자에 대한 셸 액세스를 비활성화해야 합니다. 비활성화하려면 사용자 계정이 FTP 액세스로만 제한된다는 메시지를 인쇄하는 새 셸을 만들어야 합니다.

    /bin/ftponly 셸을 만들고 실행 가능하게 만듭니다.

    $ echo -e '#!/bin/sh\necho "This account is limited to FTP access only."' | sudo tee -a  /bin/ftponly
    $ sudo chmod a+x /bin/ftponly
    

    /etc/shells 파일의 유효한 셸 목록에 새 셸을 추가합니다.

    $ echo "/bin/ftponly" | sudo tee -a /etc/shells
    

    사용자 셸을 /bin/ftponly로 변경합니다.

    $ sudo usermod newftpuser -s /bin/ftponly
    

    동일한 명령을 사용하여 FTP 액세스 권한을 부여하려는 모든 사용자의 셸을 변경할 수 있습니다.

    결론

    이것으로 Ubuntu 20.04 기반 서버에 FTP 서버를 설치하기 위해 vsftpd를 설치하고 구성한 자습서를 마칩니다. 또한 SSL/TLS를 사용하여 작동하도록 FTP 연결을 구성했습니다.

    질문이 있으시면 아래 의견에 질문하십시오.