본문 바로가기

운영체제

vsftp의 다양한 설정 방법

리눅스(CentOS 또는 RedHat)에서 기본적으로 제공되는 FTP서비스는 gssftp 혹은 vsftp이다. (2010년 현재) 이중에서 vsftp는 정말 다양한 설정방법을 제공한다.


passive 모드 사용 시 데이터포트의 범위 지정이라든가 각 계정별 혹은 전체 계정에 대해 chroot 제한을 걸어 계정의 홈디렉토리 이외의 디렉토리로 벗어나지 못하게 하는 설정도 가능하며 시스템의 기본계정들과 root에 대해 로그인하지 못하도록 하는 기능도 제공한다.

자... 강력하면서도 기본적으로 제공되는 vsftp 서비스 설정에 대해 알아보자.

***********************************************************
* FTP 서버 (vsftpd)
***********************************************************

* vsftpd 관련 파일들
/etc/xinetd.d/vsftpd  xinetd 환경에서 서비스하기 위한 vsftpd의 xinetd 설정파일
/etc/vsftpd/vsftpd.conf  vsftpd의 주된 설정파일.
/usr/sbin/vsftpd  vsftpd의 데몬파일.
/etc/initd./vsftpd  vsftpd 시작/종료/재시작 스크립트.
/etc/pam.d/vsftpd  vsftpd의 PAM설정
/var/log/vsftpd.log  vsftpd의 로그파일
/etc/vsftpd/user_list  ftp접속을 제한할 사용자 리스트
/etc/vsftpd/ftpusers  PAM에서 사용하는 ftp접속제한자 리트스파일. 이 파일에 등록된 사용자들은 ftp접속을 할 수 없다.

* 계정별 vsftpd 접속제한 파일
1. /etc/vsftpd/user_list
   vsftpd에서 기본으로 사용하는 계정별 접속제어 파일은 /etc/vsftpd/user_list(or /etc/vsftpd.user_list)파일이다.
   이 파일에 등록된 사용자들은 ftp접속을 거부하게 된다.
   이 파일에 등록할 때에는 다으 3가지 룰을 지켜주면 된다.
   - 가능한 시스템 계정들은 모두 등록한다.
   - 한 행에 한 계정씩만 등록한다.
   - /etc/vfstpd/vsftpd.conf파일(or /etc/vsftpd.conf)에서
     "userlist_deny=NO"으로 설정되었을 경우에 여기에 등록한 사용자들은 접속을 허용하는 사용자들이며
     "userlist_deny=YES"로 설정하였을 경우에는 접속을 거부하는 사용자리스트가 된다.
     YES가 기본이므로 기본설정을 변경하지 않는다면 이 파일은 접속거부자리스트파일이 된다.
2. /etc/vsftpd/ftpusers
   다음은 PAM의 VSFTPD설정파일로서 /etc/vsftpd/ftpusers파일에 등록된 사용자들은 접속을 거부하겠다는 의미의 설정파일이다.
   즉, /etc/vsftpd/ftpusers파일은 PAM에서 설정하여 사용하고 있는 ftp접속거부자 이스트파일이다.
#cat /etc/pam.d/vsftpd
#%PAM-1.0
auth       required     pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth       required     pam_stack.so service=system-auth
auth       required     pam_shells.so
account    required     pam_stack.so service=system-auth
session    required     pam_stack.so service=system-auth

* /etc/vsftpd/vsftpd.conf 설정옵션
- anonymous_enable=YES (default YES)
  익명(anonymous)접속을 허용할 것인(YES) 허용하지 않을 것인가(NO)를 결정한다.
- anon_root=/var/ftp
  익명(anonymous)접속시 루트디렉토리를 지정한다.
- local_enable=YES (default YES)
  로컬 계정 사용자들의 접속을 허용할 것인가의 여부를 결정한다.
  YES로 설정하면 로컬계정사용자의 접속을 허용하는 것이며 NO로 설정하면 허용하지 않는 것이다.
- write_enable=YES (default YES)
  이 설정은 ftp전용명령어 중에 write명령어를 허용할 것인가를 결정하는 것이다.
  허용하려면 YES, 허용하지 않으려면 NO를 설정한다.
- local_umas=022 (default 022)
  로컬계정 사용자들의 umask값을 설정한다.
- anon_upload_enable=YES (default NO)
  익명(anonymous)계정 사용자에게 파일 어로드를 허용할 것인가(YES) 허용하지 않을 것인가(NO)의 여부를 설정한다.
  가능한 익명계정으로 접속한 사용자에게는 업로드 권한을 허용하지 않는 것이 보안에 좋다.
- anon_mkdir_write_enable=YES (default NO)
  익명(anonymous)계정 사용자에게 디렉토리 생성권한을 허용할 것인가(YES) 허용하지 않을 것인가(NO)의 여부를 설정하는 지시자이다.
  가능한 익명계정으로 접속한 사용자에게는 디렉토리 생성권한을 허용하지 않는 것이 보안에 좋다.
- ftpd_banner=Welcome to blah FTP service.
  ftp서버로 접속할 때에 안내메시지등을 출력하려면 여기서 설정하면 된다.
- dirmessage_enable=YES
  ftp접속한 사용자가 특정 디렉토리로 이동하였을 때 개별 디렉토리의 메시지를 보여주도록 허용할 것인가(YES) 허용하지 안을 것인가(NO)를 설정하다.
- message_file=.message
  ftp접속후에 특정 디렉토리로 이동할 때에 디렉토리 안내메시지 파일로 사용할 파일명을 지정한다.
- xferlog_enable=YES
  ftp접속후에 파일 업로드와 다운로드에 대한 로그를 남길것인가(YES) 남기지 않을 것인가(NO)를 설정한다.
- xferlog_file=/var/log/vsftpd.log
  ftp로그파일의 위치를 결정한다.
- xferlog_std_format=YES
  로그파일에 남길 로그파일의 포맷을 기본포맷으로 남길 것인가(YES) 아닌가(NO)를 설정한다.
- connect_from_port_20=YES
  ftp서비스는 깁ㄴ적으로 21번 포트와 20번 포트를 사용한다.
  ftp 접속돠 명령어에 사용되는 포트는 21ㅓㄴ이며 실제 데이터전송에 사용되는 기본포트는 20번이다.
  이 때 20번 포트의 데이터전송 연결을 허용할 것인가(YES) 허용하지 않을 것인가(NO)를 설정한다.
- session_support=YES
  이 설정이 YES로 설정되어 유효하게 되었을 때에는 바이너리파일인 wtmp에 ftp접속관련기록을 남기게 된다.
  last라는 명령어는 각 사용자들의 접속기록을 wtmp파일에서 가져와 확인하는 명령어이므로 이 설정이 적용되면 last명령어로 ftp접속기록을 확인할 수 있다.
- idle_session_timeout=600
  ftp연결에서 idle타임에 대한 타임아웃값을 설정한다.
- data_connection_timeout=120
  데이터 전송시 적용되는 타임아웃값을 설정한다.
- anon_max_rate=0
  local_max_rate=0
  trans_chunk_size=0
  ftp서비스의 전송속도를 제한하는 설정이다.
  초당 byte수를 지정할 수 있으며 제한없이 허용하려면 0으로 설정한다.
  이 설정은 vsftpd가 독립뎀ㄴ(standalone)모드로 서비스될 때에만 적용되는 것이다.
- max_clients=30
  max_per_ip=3
  이 설정은 동시 ftp접속자수를 제한하는 설정이다.
  max_clients는 ftp접속을 최대 30명까지만 허용하는 설정이다.
  max_per_ip는 한 IP(호스트)에서 동시에 3번까지만 접속이 가능하다는 설정이다.
- ascii_upload_enable=YES
  ascii_download_enable=YES
  기본적으로 ASCII모드로 업로드/다운로드하는 것은 제한되어 있다.
  이 설정으로 ASCII모드로의 업로드/다운로드를 허용하도록 설정할 수 있다.
- deny_email_enable=YES
  banned_email_file=/etc/vsftpd/banned_emails
  익명접속시에 기본적으로 사용되는 계정명을 anonymous이며 패스워드는 email형식으로 입력하면 된다.
  이 때 패스워드로 인정하지 않을 즉, 패스워드로 사용하지 못하도록 할 email 주소를 사용하도록 하는 지시자이다.
  즉, "deny_email_enable=YES"로 설정하시고 "banned_email_file=/etc/vsftpd/banned_emails"로 설정되어 있다면
  패스워드로 허용하지 않을 email 주소를 /etc/vsftpd/banned_emails 파일에 넣어두면 된다.
  그러면 이 파일에 등록된 email주소는 패스워드로 인정하지 않는다.
- chroot_list_enable=YES
  chroot_list_file=/etc/vsftpd/chroot_list
  전체 사용자가 아닌 특정 사용자들에 대하여 자신의 홈디렉토리를 루트디렉토리로 인식하도록 하는 기능으로서 이 기능은 사용자의 홈디렉토리의 상위디렉토리로 벗어나지 못하도록 하는 설정이다.
  먼저 "chroot_list_enable=YES"로 설정하고 /etc/vsftpd/chroot_list 파일에는 이 기능을 적용할 사용자계정명을 등록하면 된다.
  즉, /etc/vsftpd/chroot_list 파일에 등록된 사용자들에 한하여 chroot기능이 적용되어 자기 자신의 홈디렉토리 상위 디렉토리의 이동이 제한된다.
- chroot_local_user=YES
  특정 사용자가 아닌 전체 사용자를 대상으로 chroot()기능을 적용하여 자기 자신의 홈디렉토리 상위 디렉토리로 이동하지 못하도록 하려면 이 설정을 YES로 설정한다.
  만약 "chroot_list_enable=YES" 이고 "chroot_local_user=YES"이면 /etc/vsftpd/chroot_list파일에 등록된 사용자들만 chroot()적용을 받지 않게 된다.
  즉, 이 두 설정이 모두 YES로 되어있다면 /etc/vsftpd/chroot_list에 등록된 사용자들을 제외한 나머지 사용자들만 chroot()가 적용된다.
- ls_recurse_enable=YES
  ftp접속에서는 ls 사용시 -R옵션을 허용하지 않는 것이 기본 설정이다.
  -R옵션이란 서브디렉토리내의 파일들의 리스팅(목록)까지 모두 확인할 수 있도록 하는 것이다.
  이 지시자의 값이 YES로 되어 있다면 ftp접속후에 디렉토리 목록 확인시에 서브디렉토리들의 목록들까지 하넌에 볼 수 있는 -R옵션을 허용하게 된다.
- pam_service_name=vsftpd
  vsftp에서 PAM설정파일명으로 사용할 파일명을 지정한다.
- listen=YES
  listen_port=21
  만약 vsftpd를 xinetd모드가 아닌 독립데몬(standalone)으로 서비스하려면 위의 listen지시자를 YES로 설정하고 listen_port에 서비스할 포트번호(기본 21번)를 지정하면 된다.

* ftp 전용명령어 요약
ascii : 전송모드를 ASCII모드로 설정한다.
binary : 전송모드를 BINARY로 설정한다.
bell : 명령어 완료시에 벨소리를 나게한다.
bye : ftp접속을 종료하고 빠져나간다.
cd : remote시스템의 디렉토리를 변경한다.
cdup : remote시스템에서 하단계 사우이디렉토리로 이동한다.
chmod : remote시스테의 파일퍼미션을 변경한다.
close : ftp저속을 종료한다.
delete : remote시스템의 파일을 삭제한다.
dir : remote시스템의 디렉토리 내용을 출력한다.
disconnect : ftp접속을 종료한다.
exit : ftp접속을 종료하고 빠져나간다.
get : 지정된 파일 하나늘 가져온다.
hash : 파일전송 도중에 "#"표시를 하여 전송중임을 나타낸다.
help : ftp명령어 도움알을 볼 수 있다.
lcd : local시셈의 디렉토리를 변경한다.
ls : remote시스템의 디렉토리 내용을 출력한다.
mdelete : 여러개의 파일을 한꺼번에 지울 때 사용한다.
mget : 여러개으 파일을 한꺼번에 가져오려할 때 사용한다.
mput : 한꺼번에 여러개의 파일을 remote시스템에 올린다.
open : ftp접속을 시도한다.
prompt : 파일전송시에 확인과정을 거친다. on/off 토글
put : 하나의 파일을 remote시스템에 올린다.
pwd : remote시스템의 현재 작업디렉토리를 표시한다.
quit : ftp접속을 종료하고 빠져나간다.
rstatus : remote시스템의 상황(version, 어디서, 접속ID등)을 표시한다.
rename : remote시스템의 파일명을 바꾼다.
rmdir : remote시스템의 디렉토리를 삭제한다.
size : remote시스템에 있는 파일의 크기를 byte단위로 표시한다.
status : 현재 연결된 ftp세션 모드에 대한 설정을 보여준다.
type : 전송모드를 설정한다.

* ncftp
- ncftp를 이용한 원격서버로의 익명(anonymous) ftp접속하기
# ncftp
NcFTP 3.1.9 (Mar 24, 2005) by Mike Gleason (http://www.NcFTP.com/contact/).
ncftp> open ftp.bora.net
Connecting to ftp.bora.net...                                                                                               
ProFTPD 1.2.7 Server (FTP.Bora.Net) [ftp5]
Logging in...                                                                                                               
Anonymous access granted, restrictions apply.
Logged in to ftp.bora.net.
ncftp / >
# ncftp ftp.bora.net
NcFTP 3.1.9 (Mar 24, 2005) by Mike Gleason (http://www.NcFTP.com/contact/).
Connecting to ftp.bora.net...                                                                                               
ProFTPD 1.2.7 Server (FTP.Bora.Net) [ftp5]
Logging in...                                                                                                               
Anonymous access granted, restrictions apply.
Logged in to ftp.bora.net.                                                                                                  
ncftp / >
- 원격서버의 계정사용자를 지정하여 저속하기
# ncftp -u dhan ftp.bora.net
- 원격서버의 계정사용자 패스워드 지정하여 자동접속하기
# ncftp -u dhan -p dhan ftp.bora.net
- 특정포트를 지정하여 원격서버 접속하기
# ncftp -u dhan -P 2121 ftp.bora.net
- 원격서버의 특정파일을 로컬서버로 가져오기
ncftp /home/widemail/a > get spas.sql
- 원격서버의 여러개의 파일을 한번에 로컬서버로 가져오기
ncftp /home/widemail/a > mget *.html
- 원격서버의 특정 디렉토리내의 모든 파일을 한번에 로컬서버로 가져오기
ncftp /home/widemail/a > mget *
- 원격서버의 특정 디렉토리내의 모든 파일과 서브디렉토리를 한번에 가져오기
ncftp /home/widemail/a > mget -R www
- 원격서버의 현재 디렉토리내의 모든 파일과 서브디렉토리들을 한번에 가져오기
ncftp /home/widemail/a > mget -R *
- 원격서버내의 특정 파일 내용 확인하기
ncftp /home/widemail/a > cat README
- 원격서버내의 특정 파일 내용을 한 페이지씩 확인하기
ncftp /home/widemail/a > page README
- 로컬서버내의 특정 파일 내용을 한 페이지씩 확인하기
ncftp /home/widemail/a > lpage INSTALL
- 로컬서버의 현재 작업디렉토리 확인하기
ncftp /home/widemail/a > lpwd
- 로컬서버의 현재 작업디렉토리 내에 파일리스트 확인하기
ncftp /home/widemail/a > lls
ncftp /home/widemail/a > lls -l
ncftp /home/widemail/a > lls -al
ncftp /home/widemail/a > lls -alR
- 로컬서버 내에 존재하는 특정파일명 변경하기
ncftp /home/widemail/a > lreanem file1 newfile
- 원격서버내의 특정 파일 삭제하기
ncftp /home/widemail/a > rm list
- 로컬서버내의 특정 파일 삭제하기
ncftp /home/widemail/a > lrm local_list
- 로컬서버내의 특정 파일 퍼미션 변경하기
ncftp /home/widemail/a > lcmod 777 local_list
- ㄹ컬서버내의 특정 디렉토리 삭제하기
ncftp /home/widemail/a > lrmdir local_dir
- 로컬서버내의 새로운 디렉토리 생성하기
ncftp /home/widemail/a > lmkdir local_new_dir
- ncftp에서 특정 도메인 및 호스트정보 확인하기
ncftp /home/widemail/a > lookup ftp.bora.net
ncftp /home/widemail/a > lookup -v ftp.bora.net
- ncftp의 북마크 설정과 사용방법
# ncftp -u widemail -p "12345" localhost
NcFTP 3.1.9 (Mar 24, 2005) by Mike Gleason (http://www.NcFTP.com/contact/).
Connecting to localhost...                                                                                                  
(vsFTPd 2.0.3)
Logging in...                                                                                                               
Login successful.
Logged in to localhost.                                                                                                     
ncftp /home/widemail > bookmark
Enter a name for this bookmark, or hit enter for "localhost": spas_dev


You logged into this site using a password.
Would you like to save the password with this bookmark?

Save? [no] yes
Bookmark "spas_dev" saved.
ncftp /home/widemail >

[widemail@dev f]$ ncftp spas_dev
NcFTP 3.1.9 (Mar 24, 2005) by Mike Gleason (http://www.NcFTP.com/contact/).
Connecting to localhost...                                                                                                  
(vsFTPd 2.0.3)
Logging in...                                                                                                               
Login successful.
Logged in to localhost.                                                                                                     
ncftp /home/widemail > bookmarks

* ncftpget
# ncftpget [flags] 원격서버 로컬디렉토리 원격서버디렉토리
# ncftpget -f login.cfg [flags] 로컬디렉토리 원격서버디렉토리
# ncftpget -u 사용자명 -p 패스워드 원격서버 로컬디렉토리 원격서버디렉토리
  -u XX : 사용자명(익명 anonymouss계정을 대신하게됨)
  -p XX : 지정된 사용자의 패스워드
  -P XX : FTP서비스포트 21번 대신 다른 포트번호 사용시 포트번호 지정
  -a    : ASCII 전송모드 지정(지정하지 않으면 BINARY가 기본 전송모드임)
  -t XX : 타임아웃(전송종료)할 초단위 시간지정
  -f XX : 호스트명, 사용자명, 패스워드가 지정된 설정파일
  -A    : 로컬파일에 덮어쓰기하지 않고 추가저장하기
  -F    : PASSIVE 모드 사용(기본값)
  -DD   : 파일 수신 후에 원격서버의 파일 삭제하기
  -R    : 지정한 원격디렉토리의 서브디렉토들까지 통째로 전송하기
- 익명계정으로 원격서버에 접속하여 특정 파일을 가져오기
# ncftpget ftp://ftp.superuser.co.kr/tools/lib.tar.gz
- 익명계정으로 원격서버에 접속하여 지정한 두개 이상의 파일을 한번에 가져오기
# ncftpget ftp.superuser.co.kr . /tools/lib.tar.gz /utility/rsync/rsync-2.5.5.tar.gz
- 익명계정으로 원격서버에 접속하여 지정한 모든 파일을 한번에 가져오기
# ncftpget ftp.superuser.co.kr /tmp/tools/ /tools/*.tar.gz
- 익명계정으로 원격서버에 접속하여 특정 디렉토리의 내용을 통째로 가져오기
# ncftpget -R ftp.superuser.co.kr /root/ /tools/
- 특정계정으로 원격서버에 접속하여 지정한 파일 가져오기
# ncftpget -u dhan ftp.mycom.net . /home/dhan/www/domain.tar.gz
# ncftpget -u dhan ftp.mycom.net /tmp /home/dhan/www/domain.tar.gz
- 특정 계정으로 원격서버에 접속하여 지정한 디렉토리의 모든 내용 통째로 가져오기
# ncftpget -u dhan -R ftp.mycom.net /tmp /home/dhan/www/
- 특정 계정가 패스워드를 지정하여 원격서버에 접속하여 지정한 파일 가져오기
# ncftpget -u dhan -p 12345 ftp.mycom.net . /home/dhan/www/
# ncftpget -u dhan -p 12345 ftp.mycom.net /tmp/ /home/dhan/www/
- 로그인정보파일을 이용하여 원격서버에 접속하여 지정한 파일 가져오기
# cat ncftplogin.cfg
host 192.168.0.100
user dhan
pass 12345
# ncftpget -f ncftplogin.cfg ftp.mycom.net /tmp/ /home/dhan/www/index.html

* ncftpput
# ncftpput [flags] 원격서버 원격서버디렉토리위치 로컬파일
# ncftp -f login.cfg [flags] 서버디렉토리위치 로컬파일
  -u XX : 사용자명(익명 anonymouss계정을 대신하게됨)
  -p XX : 지정된 사용자의 패스워드
  -P XX : FTP서비스포트 21번 대신 다른 포트번호 사용시 포트번호 지정
  -a    : ASCII 전송모드 지정(지정하지 않으면 BINARY가 기본 전송모드임)
  -t XX : 타임아웃(전송종료)할 초단위 시간지정
  -f XX : 호스트명, 사용자명, 패스워드가 지정된 설정파일
  -A    : 로컬파일에 덮어쓰기하지 않고 추가저장하기
  -F    : PASSIVE 모드 사용(기본값)
  -DD   : 파일 수신 후에 원격서버의 파일 삭제하기
  -R    : 지정한 원격디렉토리의 서브디렉토들까지 통째로 전송하기
- 익명계정으로 원격서버에 파일 업로드하기
# ncftpput 192.168.0.00 /pub/ zlib.tar.gz
- 특정계정명으로 원격서버에 파일 업로드하기
# ncftpput -u dhan 192.168.0.00 /home/dhan/ zlib.tar.gz
- 특정 계정명과 패스워드를 지정하여 원격서버에 파일 자동업로드하기
# ncftpput -u dhan -p 12345 192.168.0.00 /home/dhan/ zlib.tar.gz
- 로그인정보파일을 사용하여 원격서버에 자동으로 파일업로드하기
# cat ncftplogin.cfg
host 192.168.0.100
user dhan
pass 12345
# ncftpput -f ncftplogin.cfg /home/dhan/ domain.tar.gz
- 지정한 디렉토리의 모든 파일을 통째로 원격서버에 자동으로 업로드하기
# ncftpput -R -f ncftplogin.cfg /home/dhan/ www

* ncftp배치작업을 위한 ncftpbatch
# ncftpbatch -d
# ncftpbatch -l
# ncftpbatch -D
  -d : 개인 홈디렉토리의 $HOME/.ncftp/spool/디렉토리에 현재 FTP작업들을 백그라운드로 실행한다.
  -l : 계정사용자아ㅢ FTP배치작업큐의 작업리스트를 출력한다.
  -D : -d옵션과 같지만 데몬형식으로 실행되지는 않는다.
- ncftpget을 이용하여 ncftpbatch 작업큐에 백그라운드로 작업하도록 설정
# ncftpget -b ftp.superuser.co.kr . /tools/zlib.tar.gz
- ncftpput을 이용하여 ncftpbatch 작업큐에 백그라운드로 작업하도록 설정
# ncftpput -b 192.168.0.100 /pub/ ./zlib.tar.gz

출처 : http://blog.naver.com/lovelettee01/80045109165