Linux,Unix,BSD

vsftpd 설치하기 on CentOS7

채윤아빠 2019. 10. 12. 18:28
728x90
반응형



vsftpd 개요

FTP 서버 지원 사항은 다음과 같습니다.

  • FTP Command/Data Port change
  • Active mode
  • Passive mode / Passive Port change
  • SSL/TSL 암호화 통신
  • 사용자 폴더만으로 접근 제한 ; chroot

본 문서에서는 FTP 통신 구간 암호화를 위하여 SSL/TSL까지 적용합니다.

vsftpd 설치

다음과 같이 yum을 이용하여, ftp 및 vsftpd 패키지를 설치합니다.

yum install ftp vsftpd
cd /etc/vsftpd
cp vsftpd.conf vsftpd.conf.default # 원본 설정 파일 백업

SELinux를 이용할 경우, 다음과 같이 필요한 방화벽을 미리 열어 놓습니다.

firewall-cmd --permanent --zone=public --add-service=ftp
firewall-cmd --reload

vsftpd 설정

기본적인 설정

# 보안 등을 위하여 "anonymous" 계정의 접근 차단하기 ; YES -> NO로 변경
#anonymous_enable=YES
anonymous_enable=NO

# 사용자 계정 외부 폴더에 대한 접근 허용하기(보안상 권장하지 않음) ; 주석 해제 후, YES -> NO로 변경
#chroot_local_user=YES
chroot_local_user=NO

CentOS에 SELinux가 활성화 된 상태에서 기본 설정으로 vsftpd를 동작하면, 파일 업로드시 다음과 같은 오류가 발생합니다.

553 Could not create file.

이는 SELinux 설정에 ftp 관련 권한이 기본적으로 허용되어 있지 않기 때문입니다.
"getsebool" 명령을 이용하여 ftp 관련 보안 설정 정보를 확인합니다.

getsebool -a | grep ftp

ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
tftp_home_dir --> off

위 설정중에 "ftpd_full_access" 설정을 다음과 같이 "on"으로 설정합니다.

setsebool -P ftpd_full_access=1 # ftp 파일 접근 문제 해결
setsebool -P ftpd_use_passive_mode=1 # passive 모드 사용

위와 같이 보안 설정 후, 다음과 같이 오류가 발생할 수 있습니다.

500 OOPS: vsftpd: refusing to run with writable root inside chroot()

원인은 사용자 계정 폴더에 쓰기 권한이 부여 되어 있어서 발생하는 것으로, 해당 폴더의 쓰기 권한을 제거하거나, vsftpd.conf 파일에 "allow_writeable_chroot=YES" 설정을 추가합니다.
계정 홈 디렉토리에 쓰기 권한을 제거하면, 홈 디렉토리에 파일 업로드가 불가능하므로 본 문서에서는 다음과 같이 "allow_writeable_chroot" 설정을 추가합니다.

# 사용자 계정 외부 폴더에 대한 접근 불허 ; 보안상 권장
chroot_local_user=YES
allow_writeable_chroot=YES # 500 OOPS: vsftpd: refusing to run with writable root inside chroot() 오류 해결

"root" 등 시스템 계정의 접근 허용

여기까지 설정했을 경우, 기본적으로 여러 시스템 계정들은 ftp로 접속이 안됩니다.
"root" 계정으로 접속하려하면 다음과 같은 오류가 발생합니다.

530 Permission denied.
530 Login incorrect.

기본적으로 "root" 등의 시스템 계정은 접속을 할 수 없도록 설정되어 있습니다.
vsftpd 서버에서는 다음 2개의 파일로 계정에 대한 접근을 차단할 수 있는데, root 등 시스템 계정들이 아래 파일들에 기본적으로 추가되어 있기 때문에 접속할 수 없습니다.

  • /etc/vsftpd/user_list ; 여기에 계정이 설정되면, 계정 입력 후, "530 Permission denied." 메시지와 함께 접속 차단 (비밀번호 입력까지도 안감)
  • /etc/vsftpd/ftpusers ; 여기에 계정이 설정되면, 비밀번호 입력 후, "530 Login incorrect." 메시지와 함께 접속 차단

위의 두 파일에서 "root" 계정을 모두 주석 처리하면, "root" 계정으로 접속이 가능합니다.

아예 차단할 사용자 목록을 사용하지 않을 것이라면, "userlist_enable=YES" 설정을 "NO"로 변경하면 되나, 보안상 권장하지 않습니다.
("userlist_enable" 설정을 변경하였더라도 "/etc/vsftpd/ftpusers"는 여전히 동작합니다.)

기본 FTP 포트 변경하기 (change default ftp port)

ftp 기본 포트를 변경하기 위해서는 다음과 같이 /etc/vsftpd/vsftpd.conf 파일을 수정합니다.

listen=YES # NO => YES로 설정 변경 ; listen_ipv6 설정은 YES => NO로 설정 변경
listen_ipv6=NO

# FTP를 위한 Listen Port를 지정
listen_port=32021

# 데이터 전송을 위해서 Active Mode를 사용도록 설정. 디폴트 포트는 20 port
port_enable=YES

# 데이터 전송을 위해서 Passive Mode를 사용
pasv_enable=YES

# Active Mode에서 사용할 FTP-Data 포트를 강제로 32020 port로 변경
ftp_data_port=32020

# psssive 포트범위 설정
pasv_min_port=32020
pasv_max_port=32020

포트를 변경한 이후에 다음과 같이 설정한 포트를 방화벽에서 열어 줍니다.

firewall-cmd --permanent --zone=public --add-port=32020/tcp ; \
firewall-cmd --permanent --zone=public --add-port=32021/tcp ; \
firewall-cmd --reload

특정 계정에 대하여 외부 폴더 접근 허용하기

vsftpd에서 기본적으로 사용자 계정을 "/"로 하여 사용자 폴더 외에는 접근이 차단되도록 되어 있습니다.

# 사용자 계정 폴더를 최상위 폴더로 하여 외부 폴더는 접근을 못하게 함 (기본 설정)
# chroot_local_user=YES
# chroot_list_enable=YES
# chroot_list_file=/etc/vsftpd/chroot_list

"chroot_local_user=YES"로 사용자 계정에 대한 폴더 접근을 제한한 상태에서 특정 계정에 대하여 사용자 계정 외부의 폴더에 접근을 허용하려면, "chroot_list_enable=YES"의 주석을 제거하여 설정하고, 필요한 계정을 "chroot_list_file" 설정에 대한 주석을 제거하고 "/etc/vsftpd/chroot_list" 파일에서 해당 계정을 입력합니다.
다음은 "hanwh" 계정을 추가한 예입니다.

chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list

"/etc/vsftpd/chroot_list" 파일 내용

hanwh

위와 같이 설정하고 vsftpd 서비스를 재시작 합니다.
그리고 "hanwh" 계정으로 접속하면, 자신의 홈 디렉토리 외 시스템 전체 폴더에 대한 접근이 가능하게 됩니다.

SSL/TSL 암호화 통신 설정하기

vsftpd에서 사용할 암호화 키를 다음과 같이 생성합니다.

mkdir -p /etc/vsftpd/ssl
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/vsftpd/ssl/vsftpd.key -out /etc/vsftpd/ssl/vsftpd.pem

Generating a 2048 bit RSA private key
....................+++
...+++
writing new private key to '/etc/vsftpd/ssl/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) [XX]:kr
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:kangchon
Organization Name (eg, company) [Default Company Ltd]:Douzone
Organizational Unit Name (eg, section) []:eMP
Common Name (eg, your name or your server's hostname) []:web_pool
Email Address []:hanwh@douzone.com

FTP 통신을 암호화하기 위해서는 다음과 같이 /etc/vsftpd/vsftpd.conf 파일을 수정합니다.

# 암호화 키 설정
rsa_cert_file=/etc/vsftpd/ssl/vsftpd.pem
rsa_private_key_file=/etc/vsftpd/ssl/vsftpd.key

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
secure_chroot_dir=/var/run/vsftpd/empty

require_ssl_reuse=NO
ssl_ciphers=HIGH

vsftpd 서비스를 재시작하면, 이 후부터는 SSL/TSL이 적용된 암호화 통신으로만 FTP 이용이 가능합니다.

참고자료