외부에서 대용량 파일을 업로드할 일이 생겨서 어떤 방법을 사용할까 궁리하다가 SCP 를 사용하기로 했습니다.
접속자가 ssh 로 연결해서 시스템을 이리 저리 둘러 보는 것은 보안상 문제가 있으니 권한이 제한된 restricted shell(rbash) 을 로그인 셸로 설정하기로 했습니다.
그런데 rbash 는 scp 가 동작하지 않는 문제가 있어서 다른 방법을 찾다가 FTP 로 파일을 받기로 정했습니다.
FTP 는 오래된 서비스지만 IT 에 익숙하지 않은 이도 어렵지 않게 사용할 수 있고 검증된 서비스니까요.
하지만 FTP 는 암호화가 되지 않은 패킷이 오가는 등의 보안 문제가 있으므로 어떻게 견고하게 할까 고민하다 보니 FTP 서버인 vsftpd 가 SSL/TLS 를 지원하는 것을 알게 되어 FTP + SSL/TLS 로 서비스를 구성했ㄱㅎ 그 과정을 기록해 봅니다.
설치
먼저 패키지 매니저를 통해서 vsftpd 를 설치하고 자동으로 구동되도록 설정합니다.
sudo yum install vsftpd
systemctl enable vsftpd
systemctl restart vsftpd
설정
/etc/vsftpd/vsftpd.conf 를 열어서 다음 내용을 추가합니다.
anonymous_enable=NO
#Uncommentthistoallowlocaluserstologin.
#WhenSELinuxisenforcingcheckforSEboolftp_home_dir
local_enable=YES
#
#UncommentthistoenableanyformofFTPwritecommand.
write_enable=YES
#
#Defaultumaskforlocalusersis077.Youmaywishtochangethisto022,
#ifyourusersexpectthat(022isusedbymostotherftpd's)
local_umask=022
#Activatedirectorymessages-messagesgiventoremoteuserswhenthey
#gointoacertaindirectory.
dirmessage_enable=YES
#
#Activateloggingofuploads/downloads.
xferlog_enable=YES
#
#MakesurePORTtransferconnectionsoriginatefromport20(ftp-data).
connect_from_port_20=YES
#Ifyouwant,youcanhaveyourlogfileinstandardftpdxferlogformat.
#Notethatthedefaultlogfilelocationis/var/log/xferloginthiscase.
xferlog_std_format=YES
#Youmayspecifyanexplicitlistoflocaluserstochroot()totheirhome
#directory.Ifchroot_local_userisYES,thenthislistbecomesalistof
#userstoNOTchroot().
#(Warning!chroot'ingcanbeverydangerous.Ifusingchroot,makesurethat
#theuserdoesnothavewriteaccesstothetopleveldirectorywithinthe
#chroot)
chroot_local_user=YES
#When"listen"directiveisenabled,vsftpdrunsinstandalonemodeand
#listensonIPv4sockets.Thisdirectivecannotbeusedinconjunction
#withthelisten_ipv6directive.
listen=NO
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
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
allow_writeable_chroot=YES
listen_port=2121
ftp_data_port=2120
pasv_enable=YES
pasv_min_port=2122
pasv_max_port=2142
port_enable=YES
sudo mkdir /etc/ssl/private
TLS 연결에 사용할 RSA 인증서를 생성합니다.
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem
생성할 때Common name에는 연결할 서버의 IP 나 Domain name 을 적어줍니다.
firewalld를 사용한다면 방화벽에 포트를 추가해 줍니다.
sudo firewall-cmd --permanent --zone=dmz --add-port=2120-2142/tcp
■ zone 이름은 사용자 환경에 따라 다를 수 있으며firewall-cmd --get-active-zone명령어로 활성화된 존을 확인할 수 있습니다.
방화벽 설정이 끝났으면 설정을 반영합니다.
sudo firewall-cmd --reload
만약 사용자가 home 디렉터리 이외의 폴더를 읽어야 한다면FTP 접속시 홈 이외 폴더를 읽기 위한 Linux bind mount 사용법를 참고해서 대상 폴더를 bind 마운드 해줍니다.
FileZilla 설정
파일질라의Site Manager에 다음과 같이 설정해 줍니다. Port 는listen_port이며Protocol은 FTP,Encryption은Use explicit FTP over TLS를 선택합니다.
연결에 성공하면 아래와 같이 인증서를 신뢰하겠냐는 창이 뜨며Always trust를 체크합니다.