You cannot see this page without javascript.

본문 바로가기

쓰기

2016.07.21 02:52

FTP-Server ::: vsftpd

조회 수 1120 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

##### VSFTP (Very Secure FTP Daemon)

vsftp 는 보안 부분을 특히 강조한 데몬으로 Redhat, Suse, Open-BSD 에서 기본 FTP 로 채택하고 있으며
보안, 빠른 퍼모먼스, 안정성을 주요 특징으로 소개하고 있고 그 성능도 여느 ftp 서버 보다 탁월하다.
또한 config 파일의 설정 문법도 아주 간단해서 FTP 서버 관리를 쉽게 할 수 있다.


*** 주요 기능
- 가상 IP 별 별도의 환경 설정 기능 (설정 파일의 listen_address= 이용)
- 가상 사용자 설정, 강력한 사용자설정
- 전송 대역폭 지정
- PAM 지원 (버전 1.2.0부터는 PAM을 통한 wtmp에 로긴 로그를 남김)
- xferlog 표준 로그 파일보다 상세한 자체 로그 파일 형식 지원
- Standalone 방식과 inetd (xinetd)를 통한 운영 모두 지원
- IP별 다른 환경 파일 지정 기능 (tcp_wrappers와 함께 사용할 때)


### Tips ### ::: ★★★

- ssh 터널링을 사용하여 vsftp 접속시 Bad IP Deny 나오면 pasv_promiscuous=YES 을 추가하라.

*** 접속에러
- 반드시 ftp 유저의 홈디렉토리의 권한을 root.root 로 셋팅해야 익명접속이 문제없이 된다.
- /vsr/ftp/pub 폴더의 권한을 777 로 바꾸면 접속이 안된다.
vs가 Very Secure 의 약자이다. 쉽게 얘기해서 보안이 강화된 ftp 다. /var/ftp/pub 디렉토리에
모든 권한을 풀어주게 되면 보안상 위험하기 때문에 vsftpd 에서는 접속을 막도록 설정되어 있다.


500 OOPS: cannot open chroot() user list file 에러
vsftpd.chroot_list 주석제거시 해당 파일이 없으면 발생한다.
500 OOPS: cannot change directory:/var/ftp
/var/ftp 디렉토리를 생성해 주면 된다.
550 Permission denied.
write 권한이 없는 경우 발생하는 에러이다. (write_enable=YES 로 지정)


*** 접속자 확인
vsftpd v1.2.0 이상부터 PAM 을 통해 wtmp 에 로그를 남기므로 last 로 접속여부를 확인할 수 있다.
ftpwho 형태의 명령은 없으며 다음 명령어 등으로 확인할 수 있다.
# ps -ef|grep vsftpd
# fuser -v ftp/tcp


*** SELINUX
# setsebool -P ftp_home_dir 1
페도라 코어 4 까실때 SELinux 로 설정했다면 디폴트로 사용자의 home 디렉토리에 쓰기를 막아놓는다.
SELinux 설정에서 FTP 부분을 변경하자.
# service vsftpd restart
home 디렉토리의 읽고쓰기를 1(True)로 변경하시고 vsftpd 를 재시작.

# setsebool -P ftpd_disable_trans 1
FTP 에 관하여 SELinux 정책을 아예 적용하지 않는 옵션을 설정



#####
##### Install ###

http://vsftpd.beasts.org/
ftp://vsftpd.beasts.org/users/cevans/


*** 설치
# tar xvfz vsftpd-1.2.0.tar.gz
# cd vsftpd-1.2.0

# vi logging.c
/* str_replace_unprintable(p_str, '?'); */
vsftpd는 출력할 수 없다고 판단하는 ASCII 코드 31 이하, 128~159, 177 문자를 ? 로 바꿔서 저장한다.
한글 파일명을 전송할 때 로그에 ???? 로 남지않도록 str_replace_unprintable(p_str, '?'); 를 주석처리

# vi builddefs.h
tcp_wrappers 접속제어를 사용하려면
#undef VSF_BUILD_TCPWRAPPERS -> #define VSF_BUILD_TCPWRAPPERS 로 바꾼다.

# mkdir /usr/local/sbin /usr/local/man/man{5,8}
# make
# make install
생성된 vsftpd 파일이 /usr/local/sbin 에 복사된다.
man 페이지가 /usr/local/man/man5, /usr/local/man/man8 로 복사
inet 모드로 운영할 때 사용할 vsftpd 파일도 /etc/xinetd.d 디렉토리에 복사가 된다.

# cp vsftpd.conf /etc
# cp install_dir/RedHat/vsftpd.pam /etc/pam.d/ftp
local 계정 사용자들의 로그인 인증을 위해 설치 디렉토리안의 RedHat 안에 있는
vsftpd.pam 파일을 /etc/pam.d 디렉토리에 ftp 라는 이름으로 복사


### 환경설정 ###

# vi /etc/vsftpd.conf

# mkdir /usr/share/empty
VSFTP 는 empty 라는 디렉토리를 필요로 한다. 기본구성은 /usr/share/empty 다.


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

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


*** 접속제한
# 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 파일을 참조해 작성하면 된다)

# 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
# vi /etc/xinetd.d/vsftp ::: disable = yes
# /etc/rc.d/init.d/xinetd restart
# /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 기본 포트외 다른 포트를 사용한다. vsftpd 서버를 재실행한다.


*** 서버 동작
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 에 있는 사용자에 대해 접근을 허가 설정.

- 익명접속
nopriv_user=ftp
no_priv_user=ftp 익명(anonymous) 로그인시, 앨리어싱될 유저명 기입.

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 를 chroot_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 가상유저의 비밀번호가 된다.

# cat vir_user.txt
myid
1234

DB 포멧으로 변환하기 위해 db_load 유틸을 사용하는데 db4-utils 이라는 RPM 패키지에 포함되어 있다.
db_load 유틸을 설치하지 않았으면 db4-utils RPM 패키지를 다운받아 설치하라.
/etc 디렉토리안에 넣고, root 이외의 사용자는 파일을 볼수없게 퍼미션을 600 으로 변경

# db_load -T -t hash -f vir_user.txt ~/vsftpd_login.db
# mv ~/vsftpd_login.db /etc/
# chmod 600 /etc/vsftpd_login.db
# ls -l
-rw------- 1 root rootl 12288 10월 27 16:39 /etc/vsftpd_login.db


*** 사용자 인증에 사용할 PAM 파일 생성
이제 가상 유저들의 ID와 비밀번호가 정확한지 체크한후 FTP 로그인을 허락하기 위한 PAM 을 만들 것이다.

# 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의 홈디렉토리로 지정을 할 것이다.

# useradd -d /home/virftp virftp
# cp /etc/hosts /home/virftp/
# chown virftp.virftp hosts
# ls -l
drwx------ 4 virftp virftp 4096 10월 27 16:39 /home/virftp
-rw-r--r-- 1 virftp virftp 146 10월 27 16:39 /home/virftp/hosts


*** 가상 FTP 환경설정 파일 세팅
이제 마지막으로 가상 FTP 를 사용하기 위한 환경설정 파일을 작성할 것이다.
vsftpd_vitual.conf 라는 파일에 다음의 내용을 넣어 /etc 디렉토리에 생성하라.

listen=YES standalone 모드로 설정하기 위해
listen_port=2121 listen_port 를 추가하고 vsftpd 서버를 재실행한다
#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 에 가상유저별 홈디렉토리를 생성해야한다.
# mkdir /home/virftp/{myid,yourid}
# chown virftp.virftp /home/virftp/*
# ls -l /home/virftp/
-rw-r--r-- 1 virftp virftp 146 10월 27 16:39 hosts
drw-r-xr-x 1 virftp virftp 4096 10월 27 16:39 myid
drw-r-xr-x 1 virftp virftp 4096 10월 27 16:39 yourid


List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 mysql 사용자 추가 명령 모음 운영자 2013.03.14 3023
132 현재 vsftp 접속 중인 사용자 계정 확인 하는 법 운영자 2021.08.18 93
131 한번에 끝내는 Ubuntu 웹서버세팅 (우분투 서버세팅) file 운영자 2017.05.31 574
130 한글 파일명 깨질때 해결법 convmv 운영자 2013.04.12 6278
129 하드디스크 온도 모니터링 운영자 2013.05.01 5086
128 패키지가 제거는 되었지만 설정이 남아 있는 경우 운영자 2018.04.25 671
127 파일질라 FTP와 서버시간이 다르게 나올때 file 운영자 2017.03.29 2035
126 콘솔의 화면보호기능을 끄려면? 운영자 2014.08.11 2671
125 커맨드라인에서 우분투 버전 확인 하기, Ubuntu Version 운영자 2013.05.11 4827
124 커맨드라인에서 우분투 버전 확인 하기, Ubuntu Version 운영자 2014.01.09 4782
123 커널 컴파일시 HIGHMEM옵션 운영자 2013.05.01 5183
122 최신버전의 nginx, PHP 설치하기(How to install newest nginx, PHP in Ubuntu) file 운영자 2013.05.11 6135
121 찾는 방법 & 우분투 리눅스에서 중복 파일 삭제 file 운영자 2017.05.04 1849
120 이름에 공백이나 특수문자가 포함된 파일 수정,삭제하기 운영자 2017.06.16 823
119 우분투에서 하드 상태 체크하기 운영자 2015.07.10 820
118 우분투서버(UbuntuServer) /etc/resolv.conf 초기화 막기 운영자 2013.05.15 4854
117 우분투(Ubuntu)리눅스] root 계정으로 로그인하기, 루트(root) 계정 만들기 운영자 2013.05.15 5796
116 우분투(Ubuntu) | 우분투 14.04에서 403 You don't have permission to access / on this server. 해결하는 방법 운영자 2014.10.25 4034
115 우분투 호스트명 변경 운영자 2017.06.30 527
114 우분투 패키지 관리 운영자 2013.05.11 4709
113 우분투 자동 업데이트 관련 링크 운영자 2018.04.25 1030
Board Pagination Prev 1 2 3 4 5 6 7 Next
/ 7