토이 프로젝트/서버갖고 놀기 for DevOps

FTP 설치 및 보안을 위한 Jail & FTPS 설정 - (1)

TerianP 2021. 4. 4.
728x90

이번에는 라즈베리파이에 파일을 옮기고 다운받기 쉽도록 하기 위해 FTP 설정을 해보도록 하겠습니다.

 

최종적으로 FTP 구성은 vsftpd 로 FTP 서버 구축, 보안을 위한 chroot 설정 및 FTPES 서버로 전환까지 진행할 예정입니다.

 

먼저 vsftpd 로 패시브 FTP 서버 구축하기에 앞서 패시브 FTP에 대해서 설명하겠습니다.

 

일반적으로 FTP는 2가지의 포트를 갖고 작동합니다. 하나는 클라이언트(접속자)가 서버(FTP로 접속하는곳)에 명령어를 보내기 위한 포트이고 다른 하나는 실제로 데이터, 즉 파일들을 전송하고 전송받기 위한 포트입니다. 그렇습니다. 바로 FTP의 21번 포트가 사용자 인증 및 명령어 전달에 사용되는 제어포트이고 20번 포트가 실제 파일을 전송하는 포트가 됩니다.

 

ACTIVE 상태의 FTP 는 다음 사진 구조를 갖습니다.

ACTIVE FTP 구조

  1. 클라이언트(접속자)가 서버에게 "나 너한테 접속해서 FTP 쓰고 싶어!!" 라고 접근을 요청합니다.
  2. 서버는 "좋아 대신 아이디랑 비번으로 확인할꺼야! 그러니까 내가 연결할 포트 알려줘!" 하면서 응답을 보냅니다
  3. 클라이언트는 서버에게 서버가 접속할 수 있는 클라이언트 자신의 포트를 알려줍니다.
  4. 아이디와 비번을 확인한 서버와 클라이언트가 연결됩니다.

이런 유형으로 갑니다.

쉽게 생각하자면 요청도 클라이언트가 하고, 포트를 열어주는 것도 클라이언트가 하는거죠. 서버 입장에서보면 결국 '서버'가 '클라이언트'에게 붙는 상태가 됩니다.

이 때문에 문제가 발생합니다. 클라이언트가 서버에게 주는 포트는 1024~65535 사이의 임의적인 포트인데 이게 클라이언트 쪽에서 뭔가 ACL이나 방화벽으로 막혀있다면...둘이 연결이 안되고 결국 끊어집니다.

반면에 서버가 클라이언트에 접속하는 형태이기 때문에 보안적으로는 훨씬 관리하기 좋다고 합니다. 왜냐하면 서버입장에서 생각해야하는 건 20, 21번 포트밖에 없으니까요

 

반면, PASSIVE 모드는 서버와 클라이언트가 정확히! 반대로 동작합니다.

Passive FTP 구조

  1. 클라이언트가 서버에게 "나 너꺼 FTP 사용하고 싶어"하고 요청을 보냅니다.
  2. 서버는 클라이언트에게 "좋아, 대신 내가 정해주는 포트써" 하고 클라이언트가 연결 할 수 있는 포트 정보를 건내줍니다.
  3. 클라이언트는 서버가 건내준 포트로 접속을 시도하고
  4. 마찬가지로 아이디와 패스워드 확인 절차가 끝나면 서로 연결됩니다.

뭔가 느낌이 오시나요? ACTIVE 는 클라이언트가 요청하고, 클라이언트의 포트를 넘겨주는 반면에 PASSIVE 는 클라이언트가 요청하고, 서버의 정해진(혹은 임의의)포트를 넘겨줍니다. 서로 반대로 동작하는거죠.

PASSIVE FTP 는 ACTIVE FTP의 단점을 극복하기 위해 만들어졌다고 합니다. 클라이언트가 자신의 포트를 열어서 서버가 붙는 방식은 클라이언트의 방화벽에 막혀서 접속이 안되거나, 데이터를 전달받을 수 없거나하는 문제를 방지하기 위해서 말입니다.

 

PASSIVE는 서버쪽에서 클라이언트가 사용할 포트를 열어주기 때문에 클라이언트의 방화벽에 막혀서 연결이 안되거나 데이터 전달이 안되거나 하는 일이 매우 줄어듭니다. 물론 단점도 있죠. ACTIVE 보다 보안에 취약하다는 문제입니다. '서버'가 포트를 열어주기 때문에 서버쪽에서는 열어두는 포트를 항상 모니터링, 관리해야 할 필요가 있습니다.

 

어떤게 좋다고 딱! 말하기는 힘들지만, 저는 기본적인 ACTIVE 방식 대신 조금 새롭고 신선한? PASSIVE 방식으로 FTP를 구성할 것입니다.

 

1. FTP 설치하기 

  1. sudo apt-get install vsftpd 로 vsftpd 를 설치합니다.
sudo apt-get install vsftpd

2. 설치가 완료되면 안정적으로 설정하기 위해 다음 명령어를 사용해 vsftpd 를 종료 후 확인해줍니다.

sudo service vsftpd stop
sudo service vsftpd status

inactive 상태 확인

2. VSFTPD 설정 수정하기

vsftpd 가 설치된 것을 확인했으면 /etc/vsftpd.conf 파일의 설정을 수정해줍시다.

 

1. write_enable 부분을 YES 로 변경합니다. 이 설정은 추후 550 permission error 를 해결하기 위함입니다.

write_enable 부분은 추석 해제 후 yes 로 설정

2. 다음으로 connect_from_port_20 부분을 주석처리해줍시다. data 포트를 20번 포트로 사용하지 않을꺼니까요

connect_from_port_20 부분은 주석처리!

3. 마지막으로 해당 파일의 맨 아래쪽에 다음 내용을 추가해줍니다.

추가되는 내용은 다음과 같습니다.

pasv_enable=YES
pasv_min_port=원하는 data 포트 범위 시작
pasv_max_port=원하는 data 포트 범위 끝

pasv_address=본인의 공인IP

요런 식으로 추가하면 됩니다

이제 저장후 밖으로 나옵니다. 제가 작성한 것 외 나머지는 추가 옵션임으로 넣지 않으셔도 무방합니다.

 

4. 그런데 생각해보면 제가 임의로 정한 포트를 열어주지 않는 이상 막혀있을게 분명합니다. 어떤 문이라도 잠금장치를 해제해 두지 않으면 들어가지 못하는 것처럼요. 이제 iptable 을 통해서 제가 설정해준 포트를 열어보겠습니다.

 

iptables란 리눅스에서 사용되는 방화벽입니다. 리눅스상에서 포트를 열고 닫고, 인바운드 아웃바운드 등의 규칙을 지정해줄 수 있습니다만....ㅋㅋㅋ이렇게 이야기하면 어렵죠ㅋㅋㅋ

쉽게 말하자면 iptables 는 보안을 위한 중앙 감시타워 입니다. 여러분의 집에는 문이 총 65535개의 문이 있습니다(생각해보니 엄청 부자집이네요ㅋㅋㅋ). 집이 큰만큼 사람들도 많이 다녀야하기에 기본적으로 1024번 문까지는 열어두겠습니다. 그리고 당연히 나머지는 집의 보안을 위해서 닫아둘게요. 하지만 만약 1024번 이후의 문을 열고 싶다면 일일히 돌아다니면서 열어야하는데 이건 너무 힘들잖아요? 그때 원격으로(명령어를 통해) 문의 잠금을 해제하고 열어주는 역할을 하는게 iptables 입니다. 윈도우에서는 '고급보안이 포함된 windows defender 방화벽' 이라는 이름으로 동일한 기능을 합니다.

 

5. iptables 에 규칙을 지정하는 명령어는 다음 형식을 따릅니다.

iptables -I(대문자 i) INPUT1(첫번째 규칙으로 지정한다는 의미) -p tcp(tcp, udp 확인) —dport 5570:5579(포트범위시작:포트범위끝) -j ACCEPT

⇒ iptables -I INPUT1 -p tcp —dport 5570:5579 -j ACCEPT

iptables -I(대문자 i) INPUT1(첫번째 규칙으로 지정한다는 의미) -p tcp(tcp, udp 확인) —dport 5570:5579(포트범위시작:포트범위끝) -j ACCEPT⇒ iptables -I INPUT1 -p tcp —dport 5570:5579 -j ACCEPT

⇒ iptables -I INPUT1 -p tcp —dport 5570:5579 -j ACCEPT

이렇게 하고 다음 명령어를 이용해 제대로 적용되었는지 확인합니다.

sudo iptables -nL : 아래 사진같이 나오면 정상 적용된 것입니다.

sudo iptables -nL

이 설정은...사실 필수적으로 해야하는지는 확실하지 않습니다. 다만 확실히 하기 위해서는 해당 포트를 열어두는게 좋습니다. 결국 우리는 닫혀있는 5570~5579 포트를 사용할 것이기 때문에 추후 정상적으로 잘 작동되는 것을 확인하기 위해서 열어두는 방법을 취하였습니다.

 

6. 다음으로 sudo service vsftpd start 로 vsftpd 를 시작해줍니다. 아래는 작동 중의 사진입니다.

vsftpd 동작 확인

7. 마지막으로 ftpd 가 패시브 모드로 제대로 작동하는지 알기 위해서 다음 명령어로 확인합니다.

netstat -antp

 

액티브 : 액티브 상태의 ftp를 보시면 ftp 서버인 192.168.0.55는 제어포트 21번과 데이터 전송포트로 임의의 포트인 51945 를 사용하고 있습니다(20번 포트가 아닌 이 아닌 51945같은 임의의 포트가 사용되는 것은 설정파일에서 #connect_from_port_20=YES 요렇게 막아두었기 때문입니다)

ACTIVE FTP 모드

패시브 : 반면 패시브 모드의 ftp 를 보면 ftp 제어포트는 21번 포트를 사용하지만 데이터 전송 포트를 제가 지정한 5570을 사용하고 있는 것으로 확인이 됩니다. 다행히도 패시브 모드로 ftp 가 제대로 작동하고 있네요.

PASSVIE FTP 모드

8. 만약 외부에서 FTP를 사용하고 싶으신 분들을 위해서 이번에는 공유기를 통해 포트 포워딩을 해줘야 합니다. 포트포워딩은 총 2번을 해줘야 하는데 첫 번째는 21번 포트에 대한 포트포워딩, 두 번째는 20번 포트에 대한 포트포워딩 입니다. 저 같은 경우에는 20번 포트가 아니라 5570 ~ 5579 포트가 되겠네요.

저는 제 공유기인 iptime 에서 아래처럼 설정하였습니다.

공유기에서 포트포워딩 설정

이후 공인IP나 DDNS 로 정해둔 주소를 이용해서 접속을 확인하시면 됩니다.

 

다음 글에서는 보안을 위한 FTP Jail 설정 및 SSL 적용을 통한 FTPS 설정 글을 작성하도록 하겠습니다.

댓글