오늘날 개인 수준에서는 굳이 서버를 마련해서 FTP 서버를 구축할 필요는 없지만 나의 경우에는 다음과 같은 이유로 FTP 서버 구축을 결심했다.
- 서버와 파일 공유를 쉽게 하기 위해서
- 서버 프로그램 배포를 자동화하려고
- 개인용 클라우드로 사용하려고
서버랑 파일공유를 쉽게 한다는 것이 이해가 되지 않을 수도 있는데, 서버는 오직 명령어로만 사용 가능하기 때문에 카카오톡이나 Google Drive 등 일상에서 파일 공유에 사용하는 방법이 전혀 통하지 않는다.
또 서버 프로그램을 자동화한다는 것은 GitHub 등에 커밋을 하면 자동으로 소스를 빌드하고, 결과물을 서버 컴퓨터로 전송해서 적용하는 시스템을 구축하는 것이다.
그래서 FTP 서버를 구축하고자 한다.
우선 Ubuntu 기반의 서버를 하나 마련하고, 거기에 SSH로 접속한다.
이번에 사용할 FTP 서버는 'vsftpd'이다. Very Secure FTP Daemon의 줄임말이다(유치하다).
아래 명령을 쳐서 다운받는다.
sudo apt update
sudo apt install vsftpd -y
다운이 완료되면 이제 FTP를 사용할 유저를 만들어야 한다. 다음 명령을 쳐서 FTP를 사용할 유저를 만들자.
sudo adduser ftp
나는 유저 이름을 ftp로 했는데 굳이 ftp로 안 해도 된다. 유저 생성과정 중 다른 정보는 입력할 필요 없고(아무것도 안 치고 엔터만 누르면 넘어갈 수 있다) 비밀번호만 잘 정해주면 된다.
앞으로 명령어 중 'ftp'라고 하는 부분은 본인이 지정한 유저 이름으로 바꿔서 치면 된다.
이제 다음 명령을 쳐서 방금 만든 유저로 로그인이 잘 되나 확인해보자.
su ftp
방금 정한 비밀번호를 요구할 거다. 그걸 입력해서 로그인이 되는지 확인하자. 되면 아래와 같이 터미널이 바뀔 것이다.
로그인이 되는 것을 확인했으면 다음 명령을 쳐서 다시 원래 유저로 돌아온다.
exit
FTP는 1971년 처음 개발되었으며, 당시에는 컴퓨터 보안에 대한 인식이 전무했다. 따라서 일반 FTP는 보안에 매우 취약하므로 SSL을 활용해서 보안을 개선한 FTPS를 사용하는 것이 강력 권장된다. 따라서 이번 절에서는 FTPS 구축을 할 것이다.
우선 인증서 발급을 위해 도메인을 하나 만들어야 한다. "내도메인.한국"에서 무료로 하나 만들 수 있고, 아니면 정식으로 구매할 수도 있다. 여기서는 그냥 "domain.com"이라고 하자. 도메인을 만들었으면 도메인의 A 레코드에 서버 공인 IP주소를 입력하고 저장한다. 다음 명령을 입력했을 때 서버 IP가 뜨면 성공이다.
ping domain.com
이제 서버로 들어와서 다음 명령으로 letsencrypt를 다운로드한다.
sudo apt install certbot
그리고 다음 명령을 실행해서 인증서를 발급받는다.
sudo certbot certonly
진행하면 도메인의 소유권한을 확인하기 위해 인증과정을 밟을 것이라는 메시지가 뜰 것이다.
웹서버를 돌리고 있는 것이 아니라면 1번 방법이 편하다. 서버 방화벽에서 80번 포트를 열어주고, 1을 입력해서 임시 웹서버를 통한 인증을 진행하자. 서버에서 임시 웹서버를 만들고 외부에서 서버의 80번으로 접속을 시도하는 방식이기 때문에 기존에 80번을 사용하는 프로그램이 있으면 인증을 밟는 동안 껐다 켜야 한다.
인증방법을 선택하면 인증서를 발급할 도메인을 입력하라고 한다. 여기에 자기 도메인을 입력하면 자동으로 인증이 진행되고 인증서가 발급될 것이다.
인증서가 발급되면 다음 명령으로 생성된 인증서들을 확인할 수 있다. 하얀색으로 가려진 부분에는 도메인이 들어간다.
앞서 말했듯 FTP가 매우 구시대적인 프로토콜이라 구현이 특이하다. 일반 FTP는 사용자가 서버에 접속하는 것이 아닌 서버가 사용자에 접속하는 방식이다. 하지만 사용자가 방화벽으로 포트를 막아놨으면 접속이 안 될 수도 있다. 이 문제를 개선한 것이 Passive 모드(패시브 모드)이다.
패시브 모드는 21번 포트에서 사용자를 받고, 접수된 사용자를 포트 중 하나를 골라 그곳으로 재접속을 하도록 한다.
패시브 모드는 켜면 좋지만, 내가 쓰는데 문제가 없고, 설정이 어렵다면 굳이 안 해도 된다.
이를 사용하기 위해 서버는 방화벽에서 일정 범위의 포트를 전부 개방해서 사용자가 접속할 수 있게 해야 한다. 나는 경우 60000번에서 65535번까지 5536개를 열어 줬다. 범위는 본인이 필요에 따라 알아서 판단하자. 한 번에 한 개의 연결만 받을 거면 1개만 열어도 된다.
이제 ftp 관련 설정들을 진행해야 한다. 일반 윈도우는 스위치를 껐다 켰다 하는 방식으로 설정을 하지만, 터미널에서는 직접 설정 파일을 편집한다. 다음 명령을 켜서 vsftpd 설정 파일을 열자.
sudo vim /etc/vsftpd.conf
vim이 안 깔려 있으면 설치해주자. 반드시 관리자 권한으로 열어야 한다.
설정 파일이 열리면 원래 적혀있는 것은 싹 다 지우고 다음 내용을 복붙 한다.
listen=YES
listen_ipv6=NO
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=002
file_open_mode=0777
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
ftpd_banner=<서버 인삿말>
utf8_filesystem=YES
ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES
require_ssl_reuse=NO
ssl_ciphers=HIGH
allow_anon_ssl=YES
force_local_data_ssl=NO
force_local_logins_ssl=NO
rsa_cert_file=<인증서 파일>
rsa_private_key_file=<인증서 비밀키 파일>
ssl_enable=YES
pasv_enable=Yes
pasv_min_port=<PASV 시작 포트>
pasv_max_port=<PASV 끝 포트>
pasv_address=<서버 Public IP 주소>
allow_writeable_chroot=YES
log_ftp_protocol=YES
몇 가지 설명하자면
anonymous_enable: 익명 로그인을 허용할지 여부이다. 불특정 다수에게 파일을 공유할 목적이 아니면 보안상 이유로 꺼놓는 게 좋다.
ssl_enable: 암호화를 활성화할지 여부이다. FTP를 암호화 없이 사용하는 것은 매우 위험하므로 켜는 것이 좋다.
force_local_logins_ssl, force_local_data_ssl: 각각 로그인과 파일 전송에 암호화를 의무사항으로 할지 여부이다. 켜는 것이 좋지만, 켜게 되면 윈도우 파일 익스플로러로 접속이 불가하기 때문에 어쩔 수 없이 꺼놨다.
utf8_filesystem: 통신에 UTF-8을 사용할지 여부이다. 이걸 끄면 다른 OS 끼리 파일공유를 할 때 글자가 깨질 수도 있기 때문에 켜는 것이 좋다.
pasv_enable: 패시브 모드를 켤지 여부이다.
그리고 설정 중 아래 내용들을 그것에 맞는 값으로 직접 입력한다.
<서버 인사말>: 서버가 클라이언트에게 인사말로 보내는 메시지이다. 그리 중요한 건 아니니 아무렇게나 적으면 된다.
<인증서 파일>: 서버가 사용할 인증서 파일로 앞서 만든 fullchain.pem 파일이다.
<인증서 비밀키 파일>: 서버 인증서의 비밀키 파일이다. privkey.pem 파일이다.
<PASV 시작 포트>: 패시브 모드에서 사용할 포트 시작번호이다.
<PASV 끝 포트>: 패시브 모드에서 사용할 포트 끝번호이다.
<서버 Public IP 주소>: 서버의 공인 IP주소이다.
이제 모든 준비가 끝났다. 다음 명령을 실행해서 FTP 서버 프로그램을 재시작하자.
sudo systemctl restart vsftpd
그리고 다음 명령을 실행해서 서버가 잘 돌아가고 있는지 확인한다.
sudo systemctl status vsftpd
아래와 같이 보이면 잘한 것이다.
이제 서버에서 21번 포트의 인바운드 접속을 허용해주면 모든 설정은 끝난다.
접속이 잘 되나 확인하기 위해 본인이 사용하는 PC에서 ftp 클라이언트를 다운로드한다. 나는 FileZilla를 사용한다.
FTP 클라이언트 프로그램의 Host에는 서버의 도메인을, Username에는 FTP 유저의 이름을, Password에는 FTP 유저의 비밀번호를, 포트는 기본 설정으로 해서 접속을 시도한다. 아래와 같이 로그가 뜨고 파일 목록이 뜨면 성공이다.
Status: Resolving address of domain.com
Status: Connecting to [서버 공인 IP]:21...
Status: Connection established, waiting for welcome message...
Status: Initializing TLS...
Status: TLS connection established.
Status: Logged in Status: Retrieving directory listing of "/"...
Status: Calculating timezone offset of server...
Status: Timezone offset of server is 0 seconds.
Status: Directory listing of "/" successful
만약 Initalizing TLS라는 말이 안 나오면 전송 자체는 가능하지만 암호화가 되고 있지 않은 것이다. 이 경우 SSL 관련 설정을 손봐야 한다.
이 외 빨간 글씨가 뜨면서 접속이 안 되면 뭔가 설정을 잘못한 것이니 뭘 잘못했는지 찾아서 수정해야 한다.
한번 아무 파일이나 업로드해보자. 전송이 되면 성공이다.
'컴퓨터' 카테고리의 다른 글
ARP 스푸핑 공격 - 개념 (0) | 2021.10.05 |
---|---|
RSA 암호화 - 개념편 (0) | 2021.07.22 |
해시(Hash) (0) | 2021.07.22 |
데이터베이스 Pt. 1 (0) | 2021.07.19 |