FTP(File Transfer Protocol)는 원격 네트워크에서 또는 원격 네트워크로 파일을 전송하는 데 사용되는 표준 네트워크 프로토콜입니다.
Linux에 사용할 수 있는 많은 오픈 소스 FTP 서버가 있습니다. 가장 대중적이고 널리 사용되는 것은 Pure이다. FTPd, ProFTPD 및 vsftpd. 이 튜토리얼에서는 vsftpd(Very Secure FTP 데몬)를 설치합니다. 안정적이고 안전하며 빠른 FTP 서버입니다. 또한 사용자를 홈 디렉토리로 제한하고 SSL/TLS로 전체 전송을 암호화하도록 vsftpd를 구성하는 방법을 보여드리겠습니다.
Ubuntu 18.04용으로 작성되었지만, Ubuntu 16.04 및 Debian 기반 배포(Debian, Linux Mint 및 Elementary OS 포함)에도 동일한 지침이 적용됩니다.
보다 안전하고 빠른 데이터 전송을 위해서는 SCP 또는 SFTP를 사용하십시오.
전제조건
이 튜토리얼을 계속하기 전에 sudo 권한을 가진 사용자로 로그인했는지 확인하십시오.
Ubuntu 18.04 vsftpd 설치
vsftpd 패키지는 Ubuntu 저장소에서 사용할 수 있습니다. 설치하려면 다음 명령을 실행하기만 하면 됩니다.
sudo apt update
sudo apt install vsftpd
vsftpd 서비스는 설치 프로세스가 완료된 후 자동으로 시작됩니다. 서비스 상태를 인쇄하여 확인합니다.
sudo systemctl status vsftpd
vsftpd 서비스가 활성 상태이고 실행 중임을 나타내는 출력은 다음과 같습니다.
# * vsftpd.service - vsftpd FTP server
# Loaded: loaded (/lib/systemd/system/vsftpd.service; enabled; vendor preset: enabled)
# Active: active (running) since Mon 2018-10-15 03:38:52 PDT; 10min ago
# Main PID: 2616 (vsftpd)
# Tasks: 1 (limit: 2319)
# CGroup: /system.slice/vsftpd.service
# `-2616 /usr/sbin/vsftpd /etc/vsftpd.conf
vsftpd 구성
/etc/vsftpd.conf 파일을 편집하여 vsftpd 서버를 구성할 수 있습니다. 대부분의 설정은 구성 파일 내에 잘 문서화되어 있습니다. 사용 가능한 모든 옵션에 대해서는 공식 vsftpd 페이지를 방문하십시오.
다음 섹션에서는 보안 vsftpd 설치를 구성하는 데 필요한 몇 가지 중요한 설정에 대해 살펴봅니다.
먼저 vsftpd 구성 파일을 엽니다.
sudo nano /etc/vsftpd.conf
1. FTP 액세스
로컬 사용자만 FTP 서버에 액세스할 수 있도록 허용하고 익명_enable 및 local_enable 지시문을 찾아 아래 줄과 구성이 일치하는지 확인합니다.
# /etc/vsftpd.conf
anonymous_enable=NO
local_enable=YES
2. 업로드 활성화
파일 업로드 및 삭제와 같은 파일 시스템 변경을 허용하려면 write_enable 설정에 주석을 달아야 합니다.
# /etc/vsftpd.conf
write_enable=YES
3. Chroot Jail
FTP 사용자가 홈 디렉토리 외부에 있는 파일에 액세스하지 못하도록 chroot 설정을 주석 처리합니다.
# /etc/vsftpd.conf
chroot_local_user=YES
기본적으로 보안 취약성을 방지하기 위해 chroot가 사용되도록 설정된 경우 vsftpd는 사용자가 잠긴 디렉토리가 쓰기 가능한 경우 파일 업로드를 거부합니다.
chroot가 활성화되었을 때 업로드를 허용하려면 다음 방법 중 하나를 사용하십시오.
방법 1. - 업로드를 허용하는 권장 방법은 chroot를 사용하도록 설정하고 FTP 디렉토리를 구성하는 것입니다. 이 튜토리얼에서는 사용자 홈 내에 ftp 디렉토리를 생성하여 파일 업로드를 위한 chroot 및 쓰기 가능한 업로드 디렉토리 역할을 합니다.
# /etc/vsftpd.conf
user_sub_token=$USER
local_root=/home/$USER/ftp
방법 2. - 다른 옵션은 vsftpd 구성 파일에 다음 지시어를 추가하는 것입니다. 사용자의 홈 디렉토리에 쓰기 가능한 액세스를 허용해야 하는 경우 이 옵션을 사용합니다.
# /etc/vsftpd.conf
allow_writeable_chroot=YES
4. 수동 FTP 연결
vsftpd는 패시브 FTP 연결에 모든 포트를 사용할 수 있습니다. 포트의 최소 및 최대 범위를 지정하고 나중에 방화벽에서 범위를 엽니다.
구성 파일에 다음 줄을 추가합니다.
# /etc/vsftpd.conf
pasv_min_port=30000
pasv_max_port=31000
5. 사용자 로그인 제한
특정 사용자만 FTP 서버에 로그인할 수 있도록 하려면 파일 끝에 다음 줄을 추가하십시오.
# /etc/vsftpd.conf
userlist_enable=YES
userlist_file=/etc/vsftpd.user_list
userlist_deny=NO
이 옵션을 사용하도록 설정한 경우 /etc/vsftpd.user_list 파일(한 줄에 한 명의 사용자)에 사용자 이름을 추가하여 로그인할 수 있는 사용자를 명시적으로 지정해야 합니다.
6. SSL/TLS로 전송 보안
SSL/TLS로 FTP 전송을 암호화하려면 SSL 인증서가 있어야 하고 FTP 서버가 이 인증서를 사용하도록 구성해야 합니다.
신뢰할 수 있는 인증 기관에서 서명한 기존 SSL 인증서를 사용하거나 자체 서명된 인증서를 만들 수 있습니다.
FTP 서버의 IP 주소를 가리키는 도메인 또는 하위 도메인이 있는 경우 무료 Let's Encrypt SSL 인증서를 쉽게 생성할 수 있습니다.
openssl 명령을 사용하여 자체 서명된 SSL 인증서를 생성합니다.
다음 명령은 10년 동안 유효한 2048비트 개인 키 및 자체 서명된 인증서를 생성합니다. 개인 키와 인증서가 모두 동일한 파일에 저장됩니다.
sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem
SSL 인증서가 생성되면 vsftpd 구성 파일을 엽니다.
rsa_cert_file 및 rsa_private_key_file 명령을 찾아 pam 파일 경로로 변경하고 ssl_enable 지시어를 YES로 설정합니다.
# /etc/vsftpd.conf
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
ssl_enable=YES
달리 지정되지 않은 경우 FTP 서버는 TLS만 사용하여 보안 연결을 만듭니다.
vsftpd 서비스 다시 시작
편집을 마치면 vsftpd 구성 파일(주석 제외)은 다음과 같아야 합니다.
# /etc/vsftpd.conf
listen=NO
listen_ipv6=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
ssl_enable=YES
user_sub_token=$USER
local_root=/home/$USER/ftp
pasv_min_port=30000
pasv_max_port=31000
userlist_enable=YES
userlist_file=/etc/vsftpd.user_list
userlist_deny=NO
파일을 저장하고 vsftpd 서비스를 다시 시작하여 변경 내용을 적용합니다.
sudo systemctl restart vsftpd
방화벽 열기
UFW 방화벽을 실행하는 경우 FTP 트래픽을 허용해야 합니다.
포트 21(FTP 명령 포트), 포트 20(FTP 데이터 포트) 및 30000-31000(패시브 포트 범위)을 열려면 다음 명령을 실행합니다.
sudo ufw allow 20:21/tcp
sudo ufw allow 30000:31000/tcp
잠금 상태를 방지하려면 포트 22를 여십시오.
sudo ufw allow OpenSSH
UFW를 비활성화하고 다시 활성화하여 UFW 규칙을 다시 로드합니다.
sudo ufw disable
sudo ufw enable
변경 내용을 확인하려면:
sudo ufw status
# Status: active
#
# To Action From
# -- ------ ----
# 20:21/tcp ALLOW Anywhere
# 30000:31000/tcp ALLOW Anywhere
# OpenSSH ALLOW Anywhere
# 20:21/tcp (v6) ALLOW Anywhere (v6)
# 30000:31000/tcp (v6) ALLOW Anywhere (v6)
# OpenSSH (v6) ALLOW Anywhere (v6)
FTP 사용자 생성
FTP 서버를 테스트하기 위해 새 사용자를 생성하겠습니다.
FTP 액세스 권한을 부여할 사용자가 이미 있는 경우 첫 번째 단계를 건너뜁니다.
allow_writeable_chroot=을 설정한 경우구성 파일의 예 세 번째 단계를 건너뜁니다.
01. newftpuser라는 새 사용자 생성:
sudo adduser newftpuser
02. 사용자를 허용된 FTP 사용자 목록에 추가합니다.
echo "newftpuser" | sudo tee -a /etc/vsftpd.user_list
03. FTP 디렉터리 트리를 만들고 올바른 사용 권한을 설정합니다.
sudo mkdir -p /home/newftpuser/ftp/upload
sudo chmod 550 /home/newftpuser/ftp
sudo chmod 750 /home/newftpuser/ftp/upload
sudo chown -R newftpuser: /home/newftpuser/ftp
이전 섹션에서 설명한 대로 사용자는 파일을 ftp/upload 디렉토리에 업로드할 수 있습니다.
이때 FTP 서버는 완전히 작동하며 FileZilla와 같은 TLS 암호화를 사용하도록 구성할 수 있는 FTP 클라이언트를 사용하여 서버에 연결할 수 있어야 합니다.
셸 액세스 사용 안 함
기본적으로 사용자를 생성할 때 명시적으로 지정되지 않은 경우 사용자는 서버에 대한 SSH 액세스 권한을 가집니다.
셸 액세스를 비활성화하기 위해 사용자에게 계정이 FTP 액세스로만 제한됨을 알리는 메시지를 인쇄하는 새 셸을 만들 것입니다.
/bin/ftp 전용 셸을 생성하고 실행할 수 있도록 합니다.
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/ftp로만 변경합니다.
sudo usermod newftpuser -s /bin/ftponly
FTP 액세스 권한만 부여할 모든 사용자의 셸을 변경하려면 동일한 명령을 사용합니다.
'SW > 리눅스' 카테고리의 다른 글
Debian 9 : UFW로 방화벽으로 설정하는 방법, 예제, 명령어 (0) | 2021.02.12 |
---|---|
Debian 9 : PHP Composer 설정, 사용하는 방법, 예제, 명령어 (0) | 2021.02.11 |
Ubuntu 18.04 : OpenVPN Server 설정하는 방법, 예제, 명령어 (2) | 2021.02.09 |
CentOS 7 : Docker Compose 설치, 사용하는 방법, 예제, 명령어 (0) | 2021.02.08 |
Linux : Dig 명령어 사용하는 방법, 예제, 명령어 (DNS Lookup) (0) | 2021.02.07 |