Ubuntu 20.04에서 SSL/TLS를 사용하여 FTP 서버(vsftpd)를 설치하고 구성하는 방법
이 튜토리얼은 다음 OS 버전에 대해 존재합니다.
- 우분투 18.04(바이오닉 비버)
이 페이지에서
- 전제 조건
- 1단계 - vsftpd 설치
- 2단계 - 방화벽 구성\n
- 3단계 - vsftpd 구성
- 1. FTP 액세스
- 2. 파일 업로드 활성화\n
- 3. Chroot 감옥
- 4. 패시브 FTP
- 5. 사용자 제한\n
- 1단계 - 새 사용자를 추가합니다.\n
- 2단계 - 허용된 FTP 사용자 목록에 사용자를 추가합니다.\n
- 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가 활성화되었을 때 파일 업로드를 허용하는 두 가지 방법이 있습니다.
-
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 directoryupload
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
-
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 연결을 구성했습니다.
질문이 있으시면 아래 의견에 질문하십시오.