웹사이트 검색

Ubuntu 18.04에서 사용자 디렉토리에 대해 vsftpd를 설정하는 방법


소개

파일 전송 프로토콜(File Transfer Protocol)의 약자인 FTP는 한때 클라이언트와 서버 간에 파일을 이동하는 데 널리 사용되었던 네트워크 프로토콜입니다. 이후 더 빠르고 안전하며 편리한 파일 전달 방법으로 대체되었습니다. 많은 일반 인터넷 사용자는 https를 사용하여 웹 브라우저에서 직접 다운로드할 것으로 기대하며 명령줄 사용자는 scp 또는 SFTP와 같은 보안 프로토콜을 사용할 가능성이 더 큽니다.

FTP는 여전히 매우 구체적인 요구 사항이 있는 레거시 응용 프로그램 및 워크플로우를 지원하는 데 사용됩니다. 사용할 프로토콜을 선택할 수 있는 경우 더 최신 옵션을 살펴보십시오. 그러나 FTP가 필요한 경우에는 vsftpd가 탁월한 선택입니다. 보안, 성능 및 안정성에 최적화된 vsftpd는 다른 FTP 서버에서 발견되는 많은 보안 문제에 대한 강력한 보호 기능을 제공하며 많은 Linux 배포판의 기본값입니다.

이 자습서에서는 사용자가 SSL/TLS로 보호되는 로그인 자격 증명으로 FTP를 사용하여 자신의 홈 디렉터리에 파일을 업로드할 수 있도록 vsftpd를 구성합니다.

전제 조건

이 튜토리얼을 따라하려면 다음이 필요합니다.

  • Ubuntu 18.04 서버 및 sudo 권한이 있는 비루트 사용자: Ubuntu 18.04 초기 서버 설정 가이드에서 이러한 권한을 가진 사용자를 설정하는 방법에 대해 자세히 알아볼 수 있습니다.

1단계 - vsftpd 설치

패키지 목록을 업데이트하고 vsftpd 데몬을 설치하여 시작하겠습니다.

  1. sudo apt update
  2. sudo apt install vsftpd

설치가 완료되면 빈 구성으로 시작할 수 있도록 구성 파일을 복사하고 원본을 백업으로 저장합니다.

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

구성 백업이 완료되면 방화벽을 구성할 준비가 된 것입니다.

2단계 - 방화벽 열기

방화벽 상태를 확인하여 활성화되어 있는지 확인하십시오. 그렇다면 방화벽 규칙이 테스트를 차단하지 않도록 FTP 트래픽이 허용되는지 확인합니다.

방화벽 상태를 확인하십시오.

  1. sudo ufw status

이 경우 다음을 통해 SSH만 허용됩니다.

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6)

다른 규칙이 있거나 방화벽 규칙이 전혀 없을 수 있습니다. 이 경우 SSH 트래픽만 허용되므로 FTP 트래픽에 대한 규칙을 추가해야 합니다.

FTP용 포트 2021, TLS를 활성화할 때 포트 990, 포트 40000-50000을 엽니다. 구성 파일에서 설정할 패시브 포트 범위:

  1. sudo ufw allow 20/tcp
  2. sudo ufw allow 21/tcp
  3. sudo ufw allow 990/tcp
  4. sudo ufw allow 40000:50000/tcp
  5. sudo ufw status

이제 방화벽 규칙은 다음과 같아야 합니다.

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere 990/tcp ALLOW Anywhere 20/tcp ALLOW Anywhere 21/tcp ALLOW Anywhere 40000:50000/tcp ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) 20/tcp (v6) ALLOW Anywhere (v6) 21/tcp (v6) ALLOW Anywhere (v6) 990/tcp (v6) ALLOW Anywhere (v6) 40000:50000/tcp (v6) ALLOW Anywhere (v6)

vsftpd가 설치되고 필요한 포트가 열린 상태에서 전용 FTP 사용자 생성으로 이동하겠습니다.

3단계 - 사용자 디렉토리 준비

전용 FTP 사용자를 생성하지만 이미 FTP 액세스가 필요한 사용자가 있을 수 있습니다. 다음 지침에 따라 데이터에 대한 기존 사용자의 액세스를 유지하기 위해 주의를 기울일 것입니다. 그렇더라도 설정을 구성하고 테스트할 때까지 새 사용자로 시작하는 것이 좋습니다.

먼저 테스트 사용자를 추가합니다.

  1. sudo adduser sammy

프롬프트가 표시되면 비밀번호를 지정하십시오. 다른 프롬프트에서 자유롭게 ENTER를 누르십시오.

FTP는 일반적으로 사용자가 특정 디렉토리로 제한될 때 더 안전합니다. vsftpdchroot 감옥으로 이를 수행합니다. 로컬 사용자에 대해 chroot가 활성화되면 기본적으로 홈 디렉터리로 제한됩니다. 그러나 vsftpd가 디렉토리를 보호하는 방식 때문에 사용자가 쓸 수 없어야 합니다. FTP를 통해서만 연결해야 하는 새 사용자에게는 괜찮지만 기존 사용자는 셸 액세스 권한이 있는 경우 홈 폴더에 기록해야 할 수 있습니다.

이 예에서는 홈 디렉토리에서 쓰기 권한을 제거하는 대신 ftp 디렉토리를 만들어 chroot 및 쓰기 가능한 files 디렉토리로 사용하겠습니다. 실제 파일을 보관합니다.

ftp 폴더를 만듭니다.

  1. sudo mkdir /home/sammy/ftp

소유권 설정:

  1. sudo chown nobody:nogroup /home/sammy/ftp

쓰기 권한 제거:

  1. sudo chmod a-w /home/sammy/ftp

권한을 확인합니다.

  1. sudo ls -la /home/sammy/ftp
Output
total 8 4 dr-xr-xr-x 2 nobody nogroup 4096 Aug 24 21:29 . 4 drwxr-xr-x 3 sammy sammy 4096 Aug 24 21:29 ..

다음으로 파일 업로드를 위한 디렉토리를 생성하고 사용자에게 소유권을 할당합니다.

  1. sudo mkdir /home/sammy/ftp/files
  2. sudo chown sammy:sammy /home/sammy/ftp/files

ftp 디렉토리에 대한 권한 검사는 다음을 반환해야 합니다.

  1. sudo ls -la /home/sammy/ftp
Output
total 12 dr-xr-xr-x 3 nobody nogroup 4096 Aug 26 14:01 . drwxr-xr-x 3 sammy sammy 4096 Aug 26 13:59 .. drwxr-xr-x 2 sammy sammy 4096 Aug 26 14:01 files

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

  1. echo "vsftpd test file" | sudo tee /home/sammy/ftp/files/test.txt

이제 ftp 디렉토리를 보호하고 files 디렉토리에 대한 사용자 액세스를 허용했으므로 구성을 수정하겠습니다.

4단계 - FTP 액세스 구성

우리는 로컬 셸 계정을 가진 단일 사용자가 FTP에 연결할 수 있도록 할 계획입니다. 이에 대한 두 가지 주요 설정은 이미 vsftpd.conf에 설정되어 있습니다. 먼저 구성 파일을 열어 구성의 설정이 아래의 설정과 일치하는지 확인하십시오.

  1. sudo nano /etc/vsftpd.conf
. . .
# Allow anonymous FTP? (Disabled by default).
anonymous_enable=NO
#
# Uncomment this to allow local users to log in.
local_enable=YES
. . .

다음으로 write_enable 설정의 주석을 제거하여 사용자가 파일을 업로드할 수 있도록 합니다.

. . .
write_enable=YES
. . .

또한 FTP에 연결된 사용자가 디렉터리 트리 외부의 파일이나 명령에 액세스하지 못하도록 chroot의 주석을 해제합니다.

. . .
chroot_local_user=YES
. . .

또한 user_sub_token을 추가하여 local_root 디렉터리 경로에 사용자 이름을 삽입하여 이 사용자와 향후 추가 사용자에 대해 구성이 작동하도록 합시다. 파일의 아무 곳에나 다음 설정을 추가합니다.

. . .
user_sub_token=$USER
local_root=/home/$USER/ftp

또한 충분한 연결을 사용할 수 있도록 수동 FTP에 사용할 수 있는 포트 범위를 제한해 보겠습니다.

. . .
pasv_min_port=40000
pasv_max_port=50000

참고: 2단계에서 패시브 포트 범위에 대해 여기에서 설정한 포트를 열었습니다. 값을 변경하는 경우 방화벽 설정을 업데이트해야 합니다.

사례별로 FTP 액세스를 허용하려면 사용자가 기본적으로가 아니라 목록에 명시적으로 추가된 경우에만 액세스할 수 있도록 구성을 설정해 보겠습니다.

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

userlist_deny는 논리를 토글합니다. YES로 설정되면 목록의 사용자는 FTP 액세스가 거부됩니다. NO로 설정하면 목록에 있는 사용자만 접근이 허용됩니다.

변경을 마쳤으면 파일을 저장하고 편집기를 종료합니다.

마지막으로 사용자를 /etc/vsftpd.userlist에 추가하겠습니다. 파일에 추가하려면 -a 플래그를 사용하십시오.

  1. echo "sammy" | sudo tee -a /etc/vsftpd.userlist

예상대로 추가되었는지 확인합니다.

  1. cat /etc/vsftpd.userlist
Output
sammy

데몬을 다시 시작하여 구성 변경 사항을 로드합니다.

  1. sudo systemctl restart vsftpd

구성이 완료되면 FTP 액세스 테스트로 이동하겠습니다.

5단계 - FTP 액세스 테스트

sammy 사용자만 FTP를 통해 연결할 수 있도록 서버를 구성했습니다. 이것이 예상대로 작동하는지 확인합시다.

익명 사용자는 연결에 실패해야 합니다: 익명 액세스를 비활성화했습니다. 익명으로 연결을 시도하여 테스트해 보겠습니다. 구성이 올바르게 설정된 경우 익명 사용자의 권한이 거부되어야 합니다. 다른 터미널 창을 열고 다음 명령을 실행합니다. 203.0.113.0을 서버의 공용 IP 주소로 바꾸십시오.

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

연결을 닫습니다.

  1. bye

sammy 이외의 사용자는 연결에 실패해야 합니다. 다음으로 sudo 사용자로 연결해 보겠습니다. 또한 액세스가 거부되어야 하며 비밀번호 입력이 허용되기 전에 발생해야 합니다.

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

연결을 닫습니다.

  1. bye

사용자 sammy는 파일을 연결하고 읽고 쓸 수 있어야 합니다. 지정된 사용자가 연결할 수 있는지 확인하겠습니다.

  1. ftp -p 203.0.113.0
Output
Connected to 203.0.113.0. 220 (vsFTPd 3.0.3) Name (203.0.113.0:default): sammy 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>

files 디렉토리로 변경하고 get 명령을 사용하여 이전에 생성한 테스트 파일을 로컬 시스템으로 전송해 보겠습니다.

  1. cd files
  2. get test.txt
Output
227 Entering Passive Mode (203,0,113,0,169,12). 150 Opening BINARY mode data connection for test.txt (16 bytes). 226 Transfer complete. 16 bytes received in 0.0101 seconds (1588 bytes/s) ftp>

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

  1. put test.txt upload.txt
Output
227 Entering Passive Mode (203,0,113,0,164,71). 150 Ok to send data. 226 Transfer complete. 16 bytes sent in 0.000894 seconds (17897 bytes/s)

연결을 닫습니다.

  1. bye

이제 구성을 테스트했으므로 서버 보안을 강화하기 위한 조치를 취하겠습니다.

6단계 — 거래 보안

FTP는 사용자 자격 증명을 포함하여 전송 중인 데이터를 암호화하지 않기 때문에 해당 암호화를 제공하기 위해 TLS/SSL을 활성화합니다. 첫 번째 단계는 vsftpd와 함께 사용할 SSL 인증서를 만드는 것입니다.

openssl을 사용하여 새 인증서를 만들고 -days 플래그를 사용하여 1년 동안 유효하게 만들어 보겠습니다. 동일한 명령에서 비공개 2048비트 RSA 키를 추가합니다. -keyout-out 플래그를 모두 같은 값으로 설정하면 개인 키와 인증서가 같은 파일에 있습니다.

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

인증서에 대한 주소 정보를 제공하라는 메시지가 표시됩니다. 아래 강조 표시된 값을 자신의 정보로 대체하십시오.

Output
Generating a 2048 bit RSA private key ............................................................................+++ ...........+++ writing new private key to '/etc/ssl/private/vsftpd.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:NY Locality Name (eg, city) []:New York City Organization Name (eg, company) [Internet Widgits Pty Ltd]:DigitalOcean Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []: your_server_ip Email Address []:

인증서 플래그에 대한 자세한 내용은 OpenSSL Essentials: Working with SSL Certificates, Private Keys and CSRs를 참조하십시오.

인증서를 생성했으면 vsftpd 구성 파일을 다시 엽니다.

  1. sudo nano /etc/vsftpd.conf

파일 아래쪽에 rsa_로 시작하는 두 줄이 표시됩니다. 다음과 같이 보이도록 주석 처리합니다.

. . .
# 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을 강제로 사용하여 TLS를 처리할 수 없는 클라이언트가 연결되지 않도록 합니다. 이것은 모든 트래픽이 암호화되었는지 확인하는 데 필요하지만 FTP 사용자가 클라이언트를 변경하도록 할 수 있습니다. ssl_enableYES로 변경합니다.

. . .
ssl_enable=YES
. . .

그런 다음 다음 줄을 추가하여 SSL을 통한 익명 연결을 명시적으로 거부하고 데이터 전송 및 로그인 모두에 SSL을 요구합니다.

. . .
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
. . .

그런 다음 다음 줄을 추가하여 SSL의 기본 후속 제품인 TLS를 사용하도록 서버를 구성합니다.

. . .
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
. . .

마지막으로 두 가지 옵션을 더 추가합니다. 첫째, 많은 FTP 클라이언트를 손상시킬 수 있으므로 SSL 재사용을 요구하지 않습니다. 현재 키 길이가 128비트 이상임을 의미하는 "높은\ 암호화 암호 제품군이 필요합니다.

. . .
require_ssl_reuse=NO
ssl_ciphers=HIGH
. . .

완성된 파일 섹션은 다음과 같아야 합니다.

# This option specifies the location of the RSA certificate to use for SSL
# encrypted connections.
#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
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

완료되면 파일을 저장하고 닫습니다.

변경 사항을 적용하려면 서버를 다시 시작하십시오.

  1. sudo systemctl restart vsftpd

이 시점에서 더 이상 안전하지 않은 명령줄 클라이언트에 연결할 수 없습니다. 시도하면 다음과 같은 내용이 표시됩니다.

Output
ftp -p 203.0.113.0 Connected to 203.0.113.0. 220 (vsFTPd 3.0.3) Name (203.0.113.0:default): sammy 530 Non-anonymous sessions must use encryption. ftp: Login failed. 421 Service not available, remote server has closed connection ftp>

다음으로 TLS를 지원하는 클라이언트를 사용하여 연결할 수 있는지 확인하겠습니다.

7단계 - FileZilla로 TLS 테스트

대부분의 최신 FTP 클라이언트는 TLS 암호화를 사용하도록 구성할 수 있습니다. 크로스 플랫폼 지원으로 인해 FileZilla와 연결하는 방법을 시연합니다. 다른 클라이언트에 대한 설명서를 참조하십시오.

FileZilla를 처음 열면 상단 행의 맨 왼쪽 아이콘인 Host라는 단어 바로 위에 있는 사이트 관리자 아이콘을 찾으십시오. 클릭하세요:

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

호스트 필드에 이름 또는 IP 주소를 입력합니다. 암호화 드롭다운 메뉴에서 TLS를 통한 명시적 FTP 필요를 선택합니다.

로그온 유형으로 암호 요청을 선택합니다. 사용자 필드에 FTP 사용자를 입력합니다.

인터페이스 하단에서 연결을 클릭합니다. 사용자의 비밀번호를 묻는 메시지가 표시됩니다.

확인을 클릭하여 연결합니다. 이제 TLS/SSL 암호화로 서버에 연결되어야 합니다.

성공하면 다음과 같은 서버 인증서가 표시됩니다.

인증서를 수락하면 files 폴더를 두 번 클릭하고 upload.txt를 왼쪽으로 드래그하여 파일을 다운로드할 수 있는지 확인합니다.

완료하면 로컬 복사본을 마우스 오른쪽 버튼으로 클릭하고 upload-tls.txt로 이름을 바꾼 다음 서버로 다시 드래그하여 파일을 업로드할 수 있는지 확인합니다.

이제 SSL/TLS를 사용하여 파일을 안전하고 성공적으로 전송할 수 있음을 확인했습니다.

8단계 - 셸 액세스 비활성화(선택 사항)

클라이언트 요구 사항으로 인해 TLS를 사용할 수 없는 경우 FTP 사용자의 다른 방법으로 로그인하는 기능을 비활성화하여 보안을 강화할 수 있습니다. 이를 방지하는 비교적 간단한 방법 중 하나는 사용자 지정 셸을 만드는 것입니다. 이것은 암호화를 제공하지 않지만 손상된 계정의 액세스를 FTP로 액세스할 수 있는 파일로 제한합니다.

먼저 bin 디렉터리에서 ftponly라는 파일을 엽니다.

  1. sudo nano /bin/ftponly

사용자에게 로그인할 수 없는 이유를 알려주는 메시지를 추가합니다.

#!/bin/sh
echo "This account is limited to FTP access only."

파일을 저장하고 편집기를 종료하십시오.

파일을 실행 가능하도록 권한을 변경하십시오.

  1. sudo chmod a+x /bin/ftponly

유효한 셸 목록을 엽니다.

  1. sudo nano /etc/shells

맨 아래에 다음을 추가합니다.

. . .
/bin/ftponly

다음 명령을 사용하여 사용자의 셸을 업데이트합니다.

  1. sudo usermod sammy -s /bin/ftponly

이제 sammy로 서버에 로그인해 보십시오.

  1. ssh sammy@your_server_ip

다음과 같은 내용이 표시되어야 합니다.

Output
This account is limited to FTP access only. Connection to 203.0.113.0 closed.

이는 사용자가 더 이상 서버에 ssh할 수 없고 FTP 액세스로만 제한됨을 확인합니다.

결론

이 자습서에서는 로컬 계정이 있는 사용자를 위한 FTP 설정에 대해 설명했습니다. 외부 인증 소스를 사용해야 하는 경우 vsftpd의 가상 사용자 지원을 살펴보고 싶을 수 있습니다. PAM, Pluggable Authentication Modules 사용을 통해 풍부한 옵션 세트를 제공하며 LDAP 또는 Kerberos와 같은 다른 시스템에서 사용자를 관리하는 경우 좋은 선택입니다.