검색 엔진의 방문이 늘어나고 있군...

Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문: How to set up a secure FTP service with vsftpd on Linux

  FTP 자체는 안전한 프로토콜로서 설계된 것이 아니라서 일반 FTP 서비스는 Man in the Middle이나 Brute Force 같은 일반적인 공격에 취약합니다. 그래서 많은 FTP 서버들이 보안 기능을 추가로 사용합니다. 예를 들어 FTPS(FTP Secure)는 SSL/TLS 인증서를 이용해 종단간에 데이터를 암호화합니다. FTPS는 설정에 따라 암호화 연결과 비암호화 연결 중 하나만을 지원하거나 둘 다 지원할 수 있습니다. SFTP(SSH FTP)는 또 다른 보안 방식으로 SSH를 이용하는 형태로 만들어졌으며 다른 보안 프로토콜과 함께 사용할 수 있습니다.

  이 글에서는 SSL/TLS를 활성화한 vsftpd를 이용해 FTP 서비스를 운영하는 법을 설명합니다.

  기본적으로 알고 있어야 하는 것으로 일반적인 FTP 서버는 데이터 전송을 위해 TCP 20번 포트를 열고 있으며 명령어 전송을 위해 21번 포트(컨트롤 포트라고도 부름)를 열고 있습니다. 접속 처리와 명령어 파라미터의 교환은 21번 포트를 통해 이뤄집니다. FTP 접속에는 2가지 방식이 있는데 하나는 액티브 모드이며 다른 하나는 패시브 모드입니다. 액티브 모드로 접속 중일 때는 서버가 자신의 20번 포트(데이터)로부터 클라이언트를 향해 접속을 시도합니다. 패시브 모드로 접속 중일 때는 각 클라이언트 세션을 위한 랜덤 포트를 열어서 그 포트를 클라이언트에게 통보합니다. 그러면 통보를 받은 클라이언트는 서버의 해당 랜덤 포트를 향해 접속을 시도합니다.

  RFC 1635에 따르면 FTP는 패스워드가 필요 없는 anonymous라는 공용 계정, 그리고 ftp라는 패스워드를 가진 ftp라는 공용 계정을 둘 중 하나만 지원할 수도 있고 둘 다 지원할 수도 있습니다. 거기에 더하여 vsftpd는 로컬 계정을 이용한 로그인도 지원합니다. 서버에 등록된 계정으로 접속하면 해당 계정의 홈 디렉토리에 접근할 수 있습니다.

리눅스에 vsftpd 설치
  우분투, 데비안, 리눅스 민트 등에 vsftpd를 설치할 때는 apt-get 명령어를 사용합니다. vsftpd 서비스는 부팅 시 자동으로 실행됩니다.
$ sudo apt-get install vsftpd
  센트OS, 페도라, RHEL 등에 vsftpd를 설치할 때는 yum 명령어를 사용합니다. 서비스 시작과 부팅 시 실행은 아래와 같이 따로 설정해야 합니다.
# yum install vsftpd
# service vsftpd start
# chkconfig vsftpd on
  vsftpd를 사용한 FTP 서비스의 가장 기본적인 준비는 이것으로 끝입니다. 브라우저에서 ftp://[서버이름/IP] 라는 형태로 접속할 수도 있고 FileZilla 같은 FTP 클라이언트를 이용해서 패스워드 없이 anonymous라는 계정명을 사용하거나 계정명과 패스워드 모두 ftp를 사용하여 접속할 수도 있습니다.

  vsftpd가 설치되면 홈 디렉토리가 /var/ftp인 ftp라는 시스템 계정이 시스템에 추가됩니다. 공용 FTP 접속이 형성될 때마다 접속자는 /var/ftp로 보내집니다. 따라서 우리는 이 디렉토리를 FTP 공용 계정의 홈 디렉토리로 사용할 수 있습니다. /var/ftp 디렉토리에 있는 모든 파일과 디렉토리는 ftp://[서버이름/IP]로 접속하여 접근할 수 있습니다.

  vsftpd 설정 파일의 위치는 아래와 같습니다.
  • 우분투, 데비안, 리눅스 민트 등: /etc/vsftpd.conf
  • 센트OS, 페도라, RHEL: /etc/vsftpd/vsftpd.conf

FTP 계정 튜닝
  공용 계정을 비활성화하려면 vsftpd.conf 파일에서 anonymous 계정을 명시적으로 비활성화시켜야 합니다. 디폴트 값이 활성화이기 때문에 주석처리하는 것은 소용이 없습니다.
anonymous_enable=NO
  그리고 서비스를 다시 시작합니다.
# service vsfptd restart
  이러면 이미 시스템에 존재하는 계정을 통해서만 접속할 수 있습니다.

  로컬 계정을 활성화하거나 비활성화하려면 vsftpd.conf 파일을 수정해야 합니다. 로컬 계정을 비활성화할 거면anonymous 계정으로 접속할 수 있도록 만들어놔야 합니다.
local_enable=YES/NO
  적용하려면 마찬가지로 서비스를 다시 시작합니다.
# service vsfptd restart
  특정 계정으로 접속하려면 URI를 ftp://계정명@[서버명/IP]로 사용하면 됩니다. 특정 계정으로 접속하면 해당 계정의 홈 디렉토리에 접근할 수 있습니다.

계정의 홈 디렉토리 밖으로 못 나오게 만들기
  FTP로 접속을 하면 사용자는 권한에 문제가 없는 한 시스템 전체를 돌아다닐 수 있습니다. 이는 모든 사용자가 /etc, /var, /usr 등 모든 시스템 파일들을 읽을 수 있게 해주기 때문에 문제가 있습니다.

  사용자가 FTP로 접속하고 있는 동안 자신의 홈 디렉토리 밖으로 못 나가게 만들려면 파라미터를 아래처럼 수정합니다.
chroot_local_user=YES
  마찬가지로 서비스를 다시 시작합니다.
# service vsftpd restart

SSL/TLS 암호화 적용
  FTP는 평문을 전송하는 프로토콜이기 때문에 클라이언트와 FTP 서버 사이의 파일 전송 트래픽을 누구나 쉽게 훔쳐볼 수 있습니다. 그런 FTP 통신을 암호화하기 위해 SSL/TLS를 활성화할 수 있습니다.

  첫 번째 할 일은 SSL/TLS 인증서와 그에 따른 비밀 키를 만드는 겁니다. 아래 명령어를 통해 인증서와 키를 생성해 한 파일에 저장합니다.

데비안/우분투
$ sudo openssl req -x509 -days 365 -newkey rsa:2048 -nodes -keyout /etc/vsftpd.pem -out /etc/vsftpd.pem
센트OS/페도라/RHEL
$ sudo openssl req -x509 -days 365 -newkey rsa:2048 -nodes -keyout /etc/vsftpd/vsftpd.pem -out /etc/vsftpd/vsftpd.pem
  그리고 나서 아래의 내용을 vsftpd.conf 파일에 적용합니다.
# TLS/SSL 활성화
ssl_enable=YES

# 로그인할 때 클라이언트가 반드시 TLS를 사용하도록 만들기
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

# SSL 인증서/비밀 키의 위치 지정(Debian/Ubuntu)
# CentOS/Fedora/RHEL는 /etc/vsftpd/vsftpd.pem로 수정
rsa_cert_file=/etc/vsftpd.pem
rsa_private_key_file=/etc/vsftpd.pem

# 패시브 모드 접속을 위한 포트 범위 설정
pasv_max_port=65535
pasv_min_port=64000
  이제 vsftpd를 서비스를 다시 시작합니다.
# service vsftpd restart

접속과 대역폭 제어
  vsftpd는 접속과 사용자 대역폭을 제어할 수 있는 방법을 몇 가지 제공하는데 아래는 그 중 일부의 예입니다.
## anonymous 세션별 대역폭을 대략 30 KB/s로 설정
anon_max_rate=30000

## 각 로컬 계정의 대역폭을 대략 30 KB/s로 설정
local_max_rate=30000

## 클라이언트 세션이 300초 동안 활동이 없을 경우 세션을 끊어버림
idle_session_timeout=300

## 소스 IP 당 최고 접속 수. DoS와 DDoS 공격 방어에 유용
max_per_ip=50

방화벽 튜닝
  iptables 방화벽을 사용하고 있다면 FTP 트래픽을 허용하도록 방화벽 규칙을 조정해야 합니다.
# iptables -I INPUT -p tcp --dport 20 -j ACCEPT
# iptables -I INPUT -p tcp --dport 21 -j ACCEPT
# iptables -I INPUT -p tcp --dport 64000:65535 -j ACCEPT
  처음 2개는 FTP 데이터/제어 포트의 트래픽을 허용하는 규칙입니다. 마지막은 앞서 vsftpd.conf 파일에서 정의한 패시브 모드용 포트들의 트래픽을 허용하는 규칙입니다.

로그 활성화
  이 글을 따라하던 중 무슨 문제가 있을 경우에 대비하여 vsftpd.conf 파일에서 아래의 파라미터를 조정하여 로그를 활성화할 수 있습니다.
xferlog_enable=YES
xferlog_std_format=NO
xferlog_file=/var/log/vsftpd.log
log_ftp_protocol=YES
debug_ssl=YES
# service vsftpd restart

FileZilla를 이용하여 FTP 서버에 접속하기
  SSL/TLS를 지원하는 FTP 클라이언트 중 FileZilla를 사용해보겠습니다. SSL/TLS를 사용하는 FTP 서버에 접속할 땐 아래처럼 설정을 합니다.

출처: http://xmodulo.com/secure-ftp-service-vsftpd-linux.html

  SSL/TLS를 사용하는 서버에 접속할 때 그 서버에 처음 접속하는 거라면 그 서버의 인증서가 표시됩니다. 인증서를 확인하고 로그인을 진행합니다.

출처: http://xmodulo.com/secure-ftp-service-vsftpd-linux.html


sftpd 트러블슈팅
1. FTP 서버에 접속할 때 아래와 같은 에러가 발생한다면 FTP 트래픽이 방화벽에 막히고 있을 가능성이 높습니다. 위에서 설명한 것처럼 필요한 포트를 방화벽에서 열어야 합니다.
ftp: connect: No route to host
2. 센트OS/RHEL에서 실행 중인 chroot 상태의 FTP 서버에 접속할 때 아래와 같은 에러가 발생할 경우 SELinux를 비활성화하거나 SELinux의 설정 값을 변경해야 합니다.
500 OOPS: cannot change directory:/home/dev
Login failed.
  SELinux의 설정 값을 변경하여 해결하려면 아래의 명령어를 사용합니다.
$ sudo setsebool -P ftp_home_dir on
3. FileZilla로 SSL/TLS를 사용하는 서버에 접속할 때 아래와 같은 에러가 발생한다면 vsftpd.conf 파일에 "ssl_ciphers=HIGH"를 추가합니다. vsftpd의 디폴트 암호화 방식(DES-CBC3-SHA)을 FileZilla가 지원하지 않아서 생기는 문제입니다.
Trace:    GnuTLS alert 40: Handshake failed
Error:    GnuTLS error -12: A TLS fatal alert has been received.
"SSL_accept failed: error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher"


2014/10/28 16:06 2014/10/28 16:06