vsftp 이란?

by 조쉬 posted Feb 27, 2014
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄
vsFTP란?
- vsftp는 보안 부분을 특히 강조한 데몬으로 Redhat, Suse, Open-BSD에서 기본 FTP로 채택하고 있으며 보안, 빠른 퍼포먼스, 안정성을 주요 특징으로 소개하고 있다.
또한, config 파일의 설정 문법도 아주 간단해서 FTP 서버 관리를 쉽게 할 수 있다.

※ 지원기능
- 가상 IP 별 별도의 환경 설정 기능(설정 파일의 listen_address 이용)
- 가상 사용자 설정, chroot를 이용한 사용자 설정
- 전송 대역폭 지정 가능
- PAM 지원 (v1.2부터 PAM을 통한 wtmp에 로그인 로그를 남긴다.)
- xferlog 표준 로그 파일보다 상세한 자체 로그 파일 형식 지원
- stendalone 방식과 inetd(xinetd)를 통한 운영 모두 지원
- IP별 다른 환경 파일 지정 기능(tcp_wrappers와 함께 사용할 경우)

※ TIP
- SSH 터널링을 사용하여 접속시 Bad IP Deny 메시지가 나올 경우 vsftpd.conf에 pasv_promiscuous=YES 추가한다.
- FTP 유저의 홈디렉토리의 소유권을 root.root로 셋팅해야 익명접속이 가능하다.
- /var/ftp/pub 폴더 권한을 777로 변경하면 접속이 안된다. vsFTP에서 vs는 Very Secure의 약자입니다. 보안이 강화된 FTP 서비스로 /var/ftp/pub 디렉토리에 모든 권한을 주게 될 경우 보안상 위험하기 때문에 접속이 불가능하다.

※ 접속자 확인
root@localhost# ps -ef |grep vsftpd
root@localhost# fuser -v ftp/tcp
( 참고 : v1.2 이상 부터 PAM을 통해 wtmp에 접속 로그를 남기기 때문에 last 명령어로 접속 여부를 확인 할 수 있다. )
① 환경설정

root@localhost# vi /etc/vsftpd.conf
root@localhost# mkdir /usr/share/empty
- vsFTP 는 empty 라는 디렉토리를 필요로 한다. 기본구성은 /usr/share/empty 다.


② 사용자 생성
- vsFTP 를 운영하기 위해서는 nobody 사용자가 필요
root@localhost# usradd -M nobody
root@localhost# grep nobody /etc/passwd
nobody:x:99:99:Nobody:/:/bin/bash

- Anonymous FTP 에서 사용할 ftp 계정 생성
root@localhost# mkdir /var/ftp
root@localhost# useradd -d /var/ftp ftp
root@localhost# chown root.root /var/ftp
- 반드시 ftp 유저의 홈디렉토리의 권한을 root.root 로 셋팅해야 익명접속이가능하다.
root@localhost# chmod og-w /var/ftp

③ 접속 제한
root@localhost# vi /etc/pam.d/vsftpd
auth required /lib/security/pam_listfile.so
item=user sense=deny file=/etc/ftpusers onerr=succeed <==(1)
auth required /lib/security/pam_pwdb.so shadow nullok
auth required /lib/security/pam_shells.so
account required /lib/security/pam_pwdb.so
session required /lib/security/pam_pwdb.so
- 이 파일은 /etc/ftpusers에 등록된 유저명은 접근하지 못하도록 설정할 수 있는 부분이다. (sense=deny)
- ftpusers 파일이 없다면 생성해 주면 된다. ( /etc/passwd 파일을 참조해 작성하면 된다.)

root@localhost# vi /etc/ftpusers
- FTP 접속을 허용하지 않을 ID를 등록한다. (또는 vsftpd.ftpusers)
- /var/log/messages에 다음과 같은 로그가 남는다.
Aug 16 22:21:52 truefeel vsftpd: PAM-listfile: Refused user xxxxxxxx for service vsftpd

④ etc
root@localhost# vi /etc/xinetd.d/vsftp ::: disable = yes
root@localhost# /etc/rc.d/init.d/xinetd restart
root@localhost# /usr/local/sbin/vsftpd &

※ vsftpd.conf

① 기본 설정
ftpd_banner=Welcome to acsecret FTP service.
- FTP 서버 접속할 때 로긴 메시지 (default=버전번호). 한글 사용 가능
- dirmessage_enable=YES 새로운 디렉토리에 들어갔을 때 뿌려줄 환경 메시지를 저장한 파일명

listen=YES Standalone 으로 운영할 때 listen=YES.
- connect_from_port_20=YES Standalone 일때 포트 변경을 원할 경우 설정.
listen_port=2121 기본 포트외 다른 포트를 사용한다.

② 서버 동작
idle_session_timeout=600 (default=300초).
- 클라이언트에서 아무런 명령이 없을 경우, 세션을 끝낼 때까지의 대기시간.
data_connection_timeout=120 (default=60초).
- data connection 을 끊을 대기 시간.
ls_recurse_enable=YES
- 디렉토리 내용 출력시 캐쉬 사용여부. (클라언트 ftp 접속 프로그램 에서도 지정 가능)
pam_service_name=vsftpd
- PAM 파일명을 지정 (설치할 때 /etc/pam.d/vsftpd 명으로 복사함)

③ 접속 권한
local_enable=YES (default = NO).
- 로컬 계정 사용자의 접속 허용 여부
anonymous_enable=YES (default = YES).
- anonymous 사용자의 접속 허용 여부
userlist_enable=YES
- /etc/vsftpd.user_list 에 있는 사용자에 대해 접근을 허가 설정.

deny_email_enable=YES
- 익명 접속시 패스워드에 일반 이메일 주소를 거부 여부 (vsftpd.banned_emails에 지정된 이메일 주소만 허용)
banned_email_file=/etc/vsftpd.banned_emails

- chroot
chroot_local_user=YES (default=NO). 접속시 로컬 사용자의 홈디렉토리를 /로 변경
사용자의 홈디렉토리를 벗어나지 못하도록 제한하기 위한 설정. 제한이 필요할 경우 , YES 로 바꾼 후 제한할 사용자 ID 를 chroot_list_file= 에 설정한 파일에 지정한다.

chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
- 접속시 사용자 홈디렉토리를 /로 변경할 사용자 목록 허용. chroot 제한(적용)이 필요할 경우, YES 로 바꾼후 제한을 적용할 사용자 ID 를 root_list_file= 에 설정한 파일에 지정한다.
- 주의할 것은 chroot_local_user=YES 와 chroot_list_enable=YES 를 함께 사용할 경우, /etc/vsftpd.chroot_list에 포함된 사용자 ID 만 제한없이 홈디렉토리를 벗어날 수 있다. (반대로 작용)

④ 파일 권한
local_umask=022 (default = 077).
- 로컬 계정 사용자용 umask
write_enable=YES (defualt = NO).
- write 명령어 허용 여부

ascii_upload_enable=YES
- ASCII 파일 업로드 가능.
ascii_download_enable=YES
- ASCII 파일 다운로드 가능

- 익명사용자
anon_upload_enable=YES (default = NO).
- anonymous 사용자가 파일을 업로드 할수 있는지 여부. 허용시 업로드 할수있는 디렉토리를 생성해 주어야 한다.
anon_mkdir_write_enable=YES (default = NO).
- anonymous 사용자의 디렉토리 생성 허용 여부. chown_upload=YES 익명유저가 업로드한 파일의 소유권을 자동변경.
chwon_username=acsecret 소유권을 변경하기 원하는 유저명으로 기입


⑤ log
session_support=YES
- wtmp 에 로그 남기기 (YES 로 해야만 last 명령어로 접속 여부 확인 가능)

xferlog_file=/var/log/vsftpd.log
- 파일 전송 로그 파일명
xferlog_enable=YES (default=YES).
- 파일 전송 로그를 남길 것인지 여부
xferlog_std_format=YES (defalut=YES).
- xferlog 표준 포맷으로 로그를 남길지 여부. xferlog 표준 포맷은 로그인, 디렉토리 생성등의 로그를 남기지 않지만 vsftpd 스타일 로그는 이를 포함한 보다 상세한 로그를 남긴다.

vsftpd 스타일 로그 예
Sun Jul 12 01:38:32 2003 [pid 31200] CONNECT: Client "127.0.0.1"
Sun Jul 12 01:38:34 2003 [pid 31199] [truefeel] FAIL LOGIN: Client "127.0.0.1"


⑥ 추가 설정
- pasv mode 설정
pasv_enable=NO 사무실에서 공유기를 통해서 접속을 하는데 ls 등이 자주 먹통이 되면 설정.
pasv_promiscuous=YES
pasv_min_port=30000
pasv_max_port=30999

- 가상유저
guest_enable=YES
guest_username=virftp 가상 유저의 실제 할당 계정
user_sub_token=$USER 서로 다른 홈 디렉토리를 부여하기 위해 셋팅
local_root=/home/virftp/$USER
virftp_use_local_privs=YES 설정하지 않으면 기본 적으로 anonymous 의 권한을 가지고 파일을 생성하지 못한다.

- xinetd 를 통하지 않고 standalone으로 동작할 때만 사용 가능)
max_clients=100 최대 접속자 수
max_per_ip=3 IP 당 접속 수


⑦ 전송속도 제한 (0은 제한없음, 단위는 초당 bytes)
local_max_rate=200000 계정 사용자의 전송량 제한
anon_max_rate=100000 anonymous 사용자의 전송속도 제한
trans_chunk_size=0 지정한 byte 단위로 나눠서 전송 저장한다. 0은 vsftpd 가 알아서 판단한다. (v1.1.3 이상에서 trans_chunk_size 옵션이 있다.)
anonymous 사용자와 일반 계정 사용자로 나눠서 bandwidth 를 설정 하도록 옵션을 제공한다. 이 설정은 전송되는 상황을 더 쉽게 파악할수 있도록 해준다.
anon_max_rate=10000, trans_chunk_size=0 로 설정하여 chunk size 를 vsftpd 가 판단하도록 한다.

vsftpd 는 chunk size 를 제한한 rate(10000) 보다 큰 50000 byte 가 적당하다고 판단했다면 1~4 초 사이에는 전송된 파일 크기는 0 으로 표시될 것이다.
5 초가 되어야 파일 크기는 50000 으로 보일 것이다. (5초 이후에도 마찬가지다)

이때 trans_chunk_size=5000 으로 했다면 전송된 파일 크기를 바로바로 확인할 수 있다. (size 는 최소 4096~65536 의 값을 설정해야 적용이 된다.)

- proftpd 의 RateReadFreeBytes 와 RateReadHardBPS 같은 역할을 하는 옵션은 없다.
RateReadFreeBytes bandwidth 제한 없이 전송할 수 파일 크기
RateReadHardBPS RateReadFreeBytes 보다 파일이 클때, 위의 지정한 파일크기 까지는 제한없이 전송. 그 다음 크기부터는 제한한 bandwidth로 파일 전송


⑧ 가상유저 서비스
- 가상유저 FTP 란 로컬 시스템에 실제로 존재하지 않는 유저로 FTP 로그인을 허락하고 운영하는 환경이다.
- 로컬 시스템에 계정을 추가하지 않고도 FTP 만을 위한 사용자를 추가, 삭제할 수 있는 FTP 시스템이다.
- 사용자 들에게 FTP 만 제공해야 될때 아주 유용하게 사용할 수 있다.


* 가상유저 데이터베이스 생성
FTP 가상유저를 생성하기 위해 가상유저와 패스워드가 담긴 DB 파일을 만들어야 되는데 간단히 사용자 ID 와 비밀번호가 입력된 텍스트 파일을db_load 유틸을 이용해 DB 포맷으로 변환해 줌으로써 가상유저가 사용할 사용자 DB 파일을 만들수 있다. 홀수줄은 FTP 가상유저 ID 가 되고 짝수줄은 바로 윗줄에 명시된 FTP 가상유저의 비밀번호가 된다.

root@localhost# cat vir_user.txt
myid
1234

DB 포멧으로 변환하기 위해 db_load 유틸을 사용하는데 db4-utils 이라는 RPM 패키지에 포함되어 있다.
db_load 유틸을 설치하지 않았으면 db4-utils RPM 패키지를 다운받아 설치하라.
/etc 디렉토리안에 넣고, root 이외의 사용자는 파일을 볼수없게 퍼미션을 600 으로 변경
root@localhost# db_load -T -t hash -f vir_user.txt ~/vsftpd_login.db
root@localhost# mv ~/vsftpd_login.db /etc/
root@localhost# chmod 600 /etc/vsftpd_login.db
root@localhost# ls -l
-rw------- 1 root rootl 12288 01월 07 16:39 /etc/vsftpd_login.db


* 사용자 인증에 사용할 PAM 파일 생성
이제 가상 유저들의 ID와 비밀번호가 정확한지 체크한후 FTP 로그인을 허락하기 위한 PAM 을 만들 것이다.
root@localhost# vi /etc/pam.d/vsftpd
auth required /lib/security/pam_userdb.so db=/etc/vsftpd_login account required
/lib/security/pam_userdb.so db=/etc/vsftpd_login
* 가상유저 계정 생성과 가상유저들이 사용할 디렉토리 생성.
virftp 계정을 가상 유저들의 실제 계정으로 추가하고 /home/virftp 디렉토리를 가상 FTP의 홈디렉토리로 지정을 할 것이다.

root@localhost# useradd -d /home/virftp virftp
root@localhost# cp /etc/hosts /home/virftp/
root@localhost# chown virftp.virftp hosts
root@localhost# ls -l
drwx------ 4 virftp virftp 4096 01월 07 16:39 /home/virftp
-rw-r--r-- 1 virftp virftp 146 01월 07 16:39 /home/virftp/hosts

* 가상 FTP 환경설정 파일 세팅
이제 마지막으로 가상 FTP 를 사용하기 위한 환경설정 파일을 작성할 것이다.
vsftpd_vitual.conf 라는 파일에 다음의 내용을 넣어 /etc 디렉토리에 생성한다.
listen=YES standalone 모드로 설정하기 위해 listen_port=2121 listen_port 를 추가하고 vsftpd 서버를 재실행 한다.
root@localhost#connect_from_port_20=YES

local_enable=YES → 가상 유저도 로컬사용자 이다.
anonymous_enable=NO → 익명접속 막음
chroot_local_user=YES → 홈 디렉토리 이외는 접속 불능
write_enable=YES → 파일 생성 가능
local_umask=022
xferlog_enable=YES → 접속 로그 생성
xferlog_file=/var/log/vsftpd.log
pam_service_name=vsftpd → pam 파일 이름
pasv_min_port=30000
pasv_max_port=30999

guest_enable=YES → 반드시 ok
guest_username=virftp → 가상 유저의 실제 할당 계정
user_sub_token=$USER → 서로 다른 홈 디렉토리를 부여하기 위해 셋팅
local_root=/home/virftp/$USER

virftp_use_local_privs=YES → 설정하지 않으면 기본 적으로 anonymous 의 권한을 가지고 파일을 생성하지 못한다.
dirmessage_enable=YES


* 위와같이 설정이 되었다면 /home/virftp 에 가상유저별 홈디렉토리를 생성해야한다.
root@localhost# mkdir /home/virftp/{myid,yourid}
root@localhost# chown virftp.virftp /home/virftp/*
root@localhost# ls -l /home/virftp/
-rw-r--r-- 1 virftp virftp 146 01월 07 16:39 hosts
drw-r-xr-x 1 virftp virftp 4096 01월 07 16:39 myid
drw-r-xr-x 1 virftp virftp 4096 10월 27 16:39 yourid

* vsftpd 실행
가상유저 FTP 를 운영하기 위해서는 vsftpd 를 Standalone 방식으로 작동시켜야 된다.
vsftpd 실행시에 /etc/vsftpd_virftp.conf 파일을 환경설정 파일로 지정하자.
root@localhost# ftp localhost
user :
passwd :